第1课
简单的Session Bean

[<<返回] [目录] [下一个>>]

本课将向大家介绍有关J2EE应用编程以及J2EE SDK的知识,并讲述如何编写包含有 HTML页面、Servlet和 session bean的简单的瘦客户多层企业应用程序。

J2EE SDK 是针对J2EE平台的非商品化的操作定义和规范,使用Sun Microsystems 系统的用户均可免费获得并可将其用于演示、原型制作和教育等用途。随J2EE SDK 还 提供了J2EE 应用服务器、Web服务器、数据库、J2EE API和一系列全面的开发和部署 工具。在本课程的学习中,你将逐渐熟悉这些特性和工具。

瘦客户多层应用范例

本课中的瘦客户多层应用范例接受调用Servlet的HTML表单的用户输入。这个 Servlet使用Java命名和目录界面(JNDI)来查找一个Session Bean,进而执行一个计 算。在接收到计算的结果后,该Servlet以HTML页面的形式将计算所得的数值返回到最 终用户。

这个范例是一个瘦客户应用,因为Servlet没有执行任何业务逻辑。这个简单的计 算是由J2EE应用服务器中的Session Bean完成的。因此,该客户是瘦客户,因为在这 个过程中,它没有进行处理操作,处理操作是由Session Bean完成的。

多层应用可以由3层或4层组成。如 图1所示, 这个多层范例由4层组成。通过将一个多线程应用服务器置于非Web客户应用和后端数 据库之间,可将标准的两层客户/服务器模型扩展为三层的结构。同时,用 Servlet/JavaServer Pages TM 技术支持的Web浏览器和HTML页面替换客户应用,可将 三层的模型扩展为4层的结构。

图1 : 多层结构

本课将只介绍这四层中的前三层,第四层中的数据库服务器内容我们将在第二课中 讲述。在接下来的几课中,我们将继续使用这个范例来讲述如何使用JavaServer Pages和XML技术。

J2EE 软件和安装

为了运行该范例,需要从以下的网址( http://java.sun.com/j2ee/download.html)下载和安装Java 2 SDK企业版 (J2EE), Version 1.2.1 Release,并从( http://java.sun.com/jdk/index.html)下载安装Java 2 SDK,Standard Edition(J2SE), Version 1.2或更高。

本教程的教学假设J2EE和J2SE已安装在monicap的home目录下的J2EE目录中。

注意: monicap在任何地方都表 示一个路径名,请将其改成你自己的用户名称。

Unix:

/home/monicap/J2EE/j2sdkee1.2.1
/home/monicap/J2EE/jdk1.2.2

Windows:

\home\monicap\J2EE\j2sdkee1.2.1
\home\monicap\J2EE\jdk1.2.2

路径和类路径设置

下载的内容包括J2EE应用服务程序、Cloudscape 数据库、一个采用SSL协议 (Secure socket layer, 即 HTTP over HTTPS)的Web服务程序、开发和部署工具以 及用于企业的Java API。 按照以下的描述来设置你的路径和类路径环境变量,以便使 用这些特性。

路径设置

路径设置可以使你从系统中的任何地方访问上述开发和部署工具。由于可能与以前 安装旧版JDK时设置的路径相冲突,应确保把这些路径设置放在原来的设置之前。

Unix:

/home/monicap/J2EE/jdk1.2.2/bin
/home/monicap/J2EE/j2sdkee1.2.1/bin

Windows:

\home\monicap\J2EE\jdk1.2.2\bin
\home\monicap\J2EE\j2sdkee1.2.1\bin

类路径设置

通过类路径设置,可以告知Java 2 开发和部署工具到哪儿去找到它们所需用的不 同类库。

Unix:

/home/monicap/J2EE/j2sdkee1.2.1/lib/j2ee.jar

Windows:

\home\monicap\J2EE\j2sdkee1.2.1\lib\j2ee.jar

J2EE 应用组件

J2EE应用组件由J2EE应用程序设计师负责编写。一个J2EE组件是一个具有独立功能 的软件单元,与其它的应用组件一起被汇编到J2EE应用和接口中。J2EE 规范定义了以 下的应用组件:

  • 应用客户组件
  • 企业JavaBeans组件
  • Servlet和JavaServer Pages组件(也称作Web组件)
  • Applets

在本课中,你将创建一个J2EE应用和两个J2EE组件: 一个Servlet和一个Session Bean。这个Servlet同它的HTML文件一同被捆绑到Web Archive(WAR)文件中, Session bean的接口和类被捆绑到一个JAR文件中。 这些WAR和JAR文件被添加到J2EE 应用中,并被捆绑到Enterprise Archive(EAR)文件中,用于验证测试和部署生产 环境。

当你在本课中逐一完成每个步骤时,实际上,你在执行着几项不同的操作。编写 Servlet和Session Bean代码是开发者的操作,而创建一个J2EE应用和向应用添加J2EE 组件则是装配操作。在现实中,这些操作是由不同公司的不同人员分别完成的。

创建HTML 页面

本课中的HTML页面我们称之为bonus.html 图2显示了用户所能看到的HTML页面,稍后有其代码。在bonus.html 文件中有两个数据域,用户可以在这里填写社会安全号码和一个乘数。用户点击提交 按钮,Bonus的Servlet将搜索该最终用户的数据,查找和传递用户数据给相应的 Session Bean。然后由Session bean计算bonus ,并将bonus的结果值返回给 Servlet。最后,Servlet返回带有该bonus值的另一个HTML页面,使终端用户得以查 看。

图2 : HTML 页面

图3表明了数据是如何在浏览器和Session Bean之间流动的。该Session Bean在J2EE应用服务器中运行。

 

图3 : 数据流

HTML代码

HTML表单代码的一个有趣之处就是用来调用 BonusServlet 的别名。当用户点击HTML页面中的提交按钮时, BonusServlet 就会被调用,因为在应用装配的过程中它被映射为BonusAlias, 这一点在“装配J2EE应用”中有所描述。

这个范例假设Unix中的 bonus.html是在 /home/monicap/J2EE/ClientCode目录下。此处及以下, Windows用户可以通过颠倒上面路径中的斜线方向来获得在其平台上的正确目录路径 名。

<HTML>
<BODY BGCOLOR = "WHITE">
<BLOCKQUOTE>
<H3>Bonus Calculation</H3>
<FORM METHOD="GET" 
   ACTION="BonusAlias">
<P>
Enter social security Number:
<P>
<INPUT TYPE="TEXT" NAME="SOCSEC"></INPUT>
<P>
Enter Multiplier:
<P>
<INPUT TYPE="TEXT" NAME="MULTIPLIER"></INPUT>
<P>
<INPUT TYPE="SUBMIT" VALUE="Submit">
<INPUT TYPE="RESET">
</FORM>
</BLOCKQUOTE>
</BODY>
</HTML>

创建Servlet

本范例假设BonusServlet.java文件是在Unix平台上 的/home/monicap/J2EE/Client-Code目录中。在运行期 间,此Servlet的代码完成以下操作:

  • 检索用户数据
  • 查找Session Bean
  • 将用户数据传递给这个Session Bean
  • 在收到来自Session Bean的计算值后,创建一个HTML页面来向用户显示所返回 的值。

在以下的章节中,我们将介绍该Servlet代码的不同部分。

导入(Import)语句

Servlet代码是从对以下程序包的导入语句开始的:

  • javax.servlet, 它包含了通用的(与协议无关 的)Servlet类。 HTTPServlet 类在这个包中使用了 ServletException 类来表明一个Servlet的异常。
  • javax.servlet.http, 它包含了 HttpServlet 类。 HttpServlet 类在这个包中。
  • java.io用于系统的输入和输出。 HttpServlet 类在这个包中使用了 IOException 类来表明发生了 某种输入或输出异常。
  • javax.naming, 使用JNDITM API 来查找 Session Bean的home接口。
  • javax.rmi,用来查找session bean并激活它的远 程服务器目标准备进行通讯。

init 方法

BonusServlet.init 方法可查找Session Bean的并 创建它的实例。该方法使用组件安装( calcs)过程中 所指定的JNDI名称通过的名字来获得对它的一个引用。下一行将该引用和home接口类 传递给PortableRemoteObject.narrow方法,以确保引用 能被强制转换为CalcHome型。

InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("calcs");
homecalc = (CalcHome)PortableRemoteObject.narrow(obj 
		ref, CalcHome.class);

doGet 方法

doGet 方法的参数列表包含了一个请求( request) 和回复(response)对象。浏览器向Servlet发送一个请求, Servlet向浏览器发送回复。通过这个方法的实现,可接入请求目标中的信息,来确定 谁发送了这个请求,请求数据采用的是什么格式,发送的是何种HTTP标题,并可使用 回复对象创建一个HTML页面,来对浏览器的请求进行回复。

如果在处理请求时出现输入或输出问题, doGet 方 法就会抛出 IOException, 如果该请求无法被处理, 则抛出 ServletException。 为了计算bonus值, doGet方法将创建home接口,并调用它的 calcBonus方法。

public void doGet (HttpServletRequest request,
				 HttpServletResponse response)
		   throws ServletException, IOException {
String socsec = null;
int multiplier = 0;
double calc = 0.0;
PrintWriter out;
response.setContentType("text/html");
String title = "EJB Example";
out = response.getWriter();
out.println("<HTML><HEAD><TITLE>)
out.println(title);
out.println("</TITLE></HEAD><BODY>");

try{
//Retrieve Bonus and Social Security Information
  String strMult = request.getParameter(
				   "MULTIPLIER");
  Integer integerMult = new Integer(strMult);
  multiplier = integerMult.intValue();
  socsec = request.getParameter("SOCSEC");

//Calculate  bonus
  double bonus = 100.00;
  theCalculation = homecalc.create();
  calc = theCalculation.calcBonus(
		 multiplier, bonus);
}catch(Exception CreateException){
  CreateException.printStackTrace();
}

//Display Data
out.println("<H1>Bonus Calculation</H1>");
 out.println("<P>Soc Sec: " + socsec + "<P>");
out.println("<P>Multiplier: " + 
			multiplier + "<P>");
out.println("<P>Bonus Amount: " + calc + "<P>");
out.println("</BODY></HTML>");
out.close();
}

Servlet代码

以下便是其全部代码。

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import Beans.*;

public class BonusServlet extends HttpServlet {
CalcHome homecalc;

public void init(ServletConfig config) 
	throws ServletException{

//Look up home interface
try{
  InitialContext ctx = new InitialContext();
  Object objref = ctx.lookup("calcs");
  homecalc = 
		  (CalcHome)PortableRemoteObject.narrow(
  objref, 
  CalcHome.class);
} catch (Exception NamingException) {
  NamingException.printStackTrace();
}
}
public void doGet (HttpServletRequest request, 
  HttpServletResponse response) 
  throws ServletException, IOException {
String socsec = null;
int multiplier = 0;
double calc = 0.0;
PrintWriter out;
response.setContentType("text/html");
String title = "EJB Example";
out = response.getWriter();
out.println("<HTML><HEAD><TITLE>");
out.println(title);
out.println("</TITLE></HEAD><BODY>");
try{
  Calc theCalculation;
//Get Multiplier and Social Security Information
  String strMult = 
	request.getParameter("MULTIPLIER");
  Integer integerMult = new Integer(strMult);
  multiplier = integerMult.intValue();
  socsec = request.getParameter("SOCSEC");
//Calculate bonus
  double bonus = 100.00;
  theCalculation = homecalc.create();
  calc = 
	 theCalculation.calcBonus(multiplier, bonus);
} catch(Exception CreateException){
  CreateException.printStackTrace();
}
//Display Data
out.println("<H1>Bonus Calculation</H1>");
out.println("<P>Soc Sec: " + socsec + "<P>");
out.println("<P>Multiplier: " + 
			multiplier + "<P>");
out.println("<P>Bonus Amount: " + calc + "<P>");
out.println("</BODY></HTML>");
out.close();
}
public void destroy() {
System.out.println("Destroy");
}
}

创建Session Bean

一个Session Bean代表与客户一次短暂的会话。如果服务器或客户端崩溃,则 Session bean及其数据就会消失。与之对应的是,entity bean是永久性的,代表数 据库中的数据。如果服务器或客户端崩溃,entity bean数据会得以保存。

由于在收到 BonusServlet请求时,enterprise bean 要执行简单的计算,并且该计算在发生崩溃时能够重新被执行,因此,在这个实例中 使用一个Session Bean是非常合理的。

图4 表明了Servlet和Session Bean在装配 并部署在一起时是如何作为一个完整的J2EE应用运行的。在阴影框中所显示的容器 (container)是Session Bean和支持该Session Bean的相关低级平台之间的接口。这 个容器是在部署过程中被创建的。

 

图4 : 应用组件

在以下的章节中将显示Session Bean的代码。在这个例子中,我们假设 CalcBean.java Calc.javaCalcHome.java 文件在Unix平台上的/home/monicap/J2EE/Beans 目录中。 CalcBean接口上方的package Beans 语句和类文件与该目录的名称相同。当编译这些文件时,从Beans 以上的目录中进行编译并且该 Beans包(或目录)的名 字在接口和被编译的类文件之后用‘/’预置。 见“ 编译Session Bean”章节。

注 : 此范例表明了如何编译一 个Session Bean,此外,还可以从供应商处直接购买到enterprise Bean并将其安装到 J2EE应用中。

CalcHome

BonusServlet不直接与Session Bean共同工作,而 是创建一个home 接口的实例。这个home 接口扩展了 EJBHome 并拥有一个在其容器中创建Session Bean的方法。如果Session Bean 不能被创建,则 抛出 CreateException,如果在远程方法的执行期间发 生了与通讯相关的异常,则抛出RemoteException

package Beans;

import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface CalcHome extends EJBHome {
Calc create() throws CreateException, 
			RemoteException;
}

Calc

home 接口创建后, J2EE应用服务器会创建远程接口和Session Bean。 远程接口 扩展了EJBObject并声明了 calcBonus 方法来计算bonus之值。这个方法需要抛出javax.rmi.RemoteException, 由 CalcBean类来实现。

package Beans;

import javax.ejb.EJBObject;
import java.rmi.RemoteException;

public interface Calc extends EJBObject {
public double calcBonus(int multiplier,
					  double bonus)
				 throws RemoteException;
}

CalcBean

Session Bean 类实现 SessionBean接口,为 calcBonus方法提供行为。当BonusServlet 在CalcHome中调用 create 方法时,容器以这个顺序调 用 setSessionContext ejbCreate 方法。

空方法来自SessionBean接口。这些方法由bean的容器 调用。你无须为这些方法提供行为,除非你需要附加的功能,例如,从容器中创建或 删除bean。

package Beans;

import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class CalcBean implements SessionBean {
public double calcBonus(int multiplier,
					 double bonus) {
double calc = (multiplier*bonus);
return calc;
}
//These methods are described in more
//detail in Lesson 2
public void ejbCreate() { }
public void setSessionContext(
  SessionContext ctx) { }
public void ejbRemove() { }
public void ejbActivate() { }
public void ejbPassivate() { }
public void ejbLoad() { }
public void ejbStore() { }
}

C编译Session Bean和Servlet

为了减少打字操作,编译Session 和Servlet代码的最简单的方法是使用脚本 (Unix平台)或批处理文件(Windows平台)进行编译。

编译Session Bean

Unix

#!/bin/sh
cd /home/monicap/J2EE
J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1
CPATH=.:$J2EE_HOME/lib/j2ee.jar
javac -d . -classpath "$CPATH" Beans/CalcBean.java
		Beans/CalcHome.java Beans/Calc.java 

Windows

cd \home\monicap\J2EE
set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2.1
set CPATH=.;%J2EE_HOME%\lib\j2ee.jar
javac -d . -classpath %CPATH% Beans/CalcBean.java
		Beans/CalcHome.java Beans/Calc.java 

编译Servlet

Unix

#!/bin/sh
cd /home/monicap/J2EE/ClientCode 
J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1
CPATH=.:$J2EE_HOME/lib/j2ee.jar:
  /home/monicap/J2EE
javac -d . -classpath "$CPATH" BonusServlet.java 

Windows

cd \home\monicap\J2EE\ClientCode 
set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2
set CPATH=.;%J2EE_HOME%\lib\j2ee.jar;
\home\monicap\J2EE
javac -d . -classpath %CPATH% BonusServlet.java

启动J2EE应用服务器

在部署和运行该范例之前,需要首先启动J2EE应用服务器。用来启动服务器的命令 在J2EE安装目录下的 bin目录中。如果路径已经设置为 读取bin 目录,则进入J2EE 目录(保证当前版本与文本中的内容相匹配),并键入:

j2ee -verbose
注 : 如果Outlook 运行时,有时J2EE服务器可能 会无法启动。

如果上述办法不成功,则从 J2EE目录中键入以下内 容:

Unix:

j2sdkee1.2.1/bin/j2ee -verbose

Windows:

j2sdkee1.2.1\bin\j2ee -verbose

当服务器启动后, verbose选项可以在命令行中打出 指示消息。当你看到J2EE server startup complete后, 你便可以启动部署工具。现在,你便可以忽略滚动过的其他信息。

启动部署工具

为了安装和部署J2EE 应用,需要你启动部署工具。 如果路径已经设置并能够读取 bin目录,则进入J2EE 目 录(你当前的版本与你在该文本中所看到的相匹配)并键入:

deploytool

如果上述办法不成功,则从 J2EE目录中进行以下操 作:

Unix:

j2sdkee1.2.1/bin/deploytool

Windows:

j2sdkee1.2.1\bin\deploytool
注 : 如果在启动 deploytool 时遇到了内存访问错误,则需添加一个称为 JAVA_FONTS 的环境变量,并将路径设置为 \<font directory>。 例如, c:\winnt\fonts。 同样,如果在启 动deploytool时遇到一个BasicFile ChooserUINullPointerException, 则需要确定你是否是从根目 录(即, c:\)中启动该工具的。如果你在别的 地址运行该工具,如 j2sdkee1.2 bin安装目录,则不会遇到这个问题。

部署工具

图5中所显示的部署工具有4个主要的窗口。 “本地应用”窗口中显示的是J2EE应用及其组件。“服务器”窗口中显示的是本地主 机上所运行的应用服务器的信息。“服务器应用”窗口中显示的是所安装的应用。当 你按照这个步骤来安装J2EE应用范例,你会看到“本地应用”,“检查”和“服务器 应用”窗口所显示的信息。

 

图5 : 部署工具

注: “服务器应用”窗口的右 侧是一个灰色的 Uninstalll 按钮。在完成该应用的部 署之后,你会看到该应用被列在“服务器应用”窗口中。可以点击 Uninstall 按钮卸载该应用、作修改或重新部署该应用而无须停止和重新启动应用服务器。

A装配J2EE应用

装配J2EE应用包括创建一个新的应用,和添加该应用的组件。下面对几个装配步骤 进行了概括,在接下来的叙述中,我们将详细介绍每个装配步骤。

  1. 创建一个新的J2EE 应用 ( BonusApp.ear)。
  2. 创建一个新的enterprise Bean ( CalcBean.jar)。
  3. 建一个新的Web组件 ( Bonus.war)。
  4. 为enterprise Bean指定JNDI名称 ( calcs)。
  5. 为J2EE应用指定Root Context (BonusRoot)。

创建J2EE应用

J2EE组件安装到J2EE EAR文件中。

文件菜单 : 选择 New Application(新应用)。

“新应用”对话框:

  • 在“新应用名称”一栏中键入 BonusApp.ear
  • 在“应用显示名称”域中点击鼠标右键。BonusApp 为所显示的名称。
  • 点击“浏览”按钮打开文件选择器,选择保存该应用 EAR 文件的位置。

“新应用”文件选择器:

  • 选择应用 EAR文件所在的目录
  • 在本范例中,该目录为 /home/monicap/J2EE
  • 在“文件名”域中,键入BonusApp.ear。
  • 点击“新应用”。
  • 点击“OK”。

此时, BonusApp显示名称被列在“本地应用”的窗 口中,右侧的“检查器”(Inspector)窗口显示的是BonusApp 的显示名称、位置和内容信息。在内容窗口中所显示的元信息描述了JAR文件和J2EE 应用,提供了有关该应用的运行时信息。

enterprise Bean(entity bean和Session Bean)被捆绑到JAR文件中。

文件菜单:选择“新enterprise Bean”。 “新enterprise Bean向导”出现,显示出一个“介绍”对话框, 概括了你将采取的步骤。阅毕,点击”下一步”。

EJB JAR 对话框:指明以下信息:

  • “enterprise Bean将进入”:BonusApp
    显示名称 : CalcJar
    描述 : 计算一个bonus的简单Session Bean。 它有一个方法。
  • 点击“添加”(add)按钮。 在这个页面中有两个 “添加”按钮。你需要点击“内容”窗口旁边的第二个“添加”按钮。

“将文件添加到.JAR”对话框 :进入J2EE目录。你可以键入路 径名称或使用浏览器进入。在进入 J2EE目录后,双击 beans显示 beans目录中 的内容。

  • 选择 Calc.class
  • 点击“添加”。
  • 选择 CalcHome.class
  • 点击“添加”。
  • 选择 CalcBean.class
  • 点击“添加”。
特别注意 :“将内容添加到 .JAR”对话框应该如图6所显示的一样。 “ Enterprise Bean JAR”类所显示的 Beans 目录的前缀必须是该类的名称

 

图6 : 选择Session Bean 类文件

  • 点击“OK”。 你将返回到 EJB JAR对话框中。此时, Beans/Calc.classBeans/CalcHome.class Beans/CalcBean.class将显示在“内容”窗口中。
  • 点击“下一步”(next)。

“普通” 对话框:选择以下信息:

  • 类名: Beans.CalcBean
    Home 接口:
    Beans.CalcHome
    远程接口:
    Beans.Calc
    Bean 类型:
    SessionStateless
  • 指明显示名称(当将JAR文件添加到“本地应用”窗口中的BonusApp时所显示的 名称), 提供有关JAR文件内容的描述。
  • 显示名称: CalcBean
  • 描述: JAR文件包含CalcBean Session Bean。
  • 点击”下一步”。

环境项目对话框: 本范例中没有采用这个属性(环境项目), 因此,你可以:

  • 点击“完成”。

检验JAR文件确实被添加到J2EE应用中:

  • 进入“本地应用”窗口
  • 点击 BonusApp前方的图例。会看到 CalcJar JAR文件。
  • 点击Calcjar前方的图例,查看 CalcBean Session Bean。

创建Web组件

Web 组件(Servlet,或JavaServer Pages技术)被捆绑在一个WAR文件中。

文件菜单 : 选择“新Web组件”。 出现“新Web组件向导”, 显示一个窗口,介绍该采取哪些步骤。阅毕,点击”下一步”。

“WAR文件一般属性”对话框: 提供以下信息:

  • WAR 文件: BonusApp
    显示名称: BonusWar
    描述: 这个war文件包含一个Servlet和一个html页面。
  • 点击“添加”。

“将内容添加到WAR”对话框:

  • 在“根目录”中 J2EE后键入 ClientCode, 进入 ClientCode目录。
  • 选择 bonus.html.。 确定“WAR内 容”所显示的列表为 bonus.html., 且其名称之 前不带clientcode目录前缀。
  • 点击“添加”。
: 在添加 BonusServlet.class 之前应先添加 bonus.html

 

图7 : 添加BonusServlet.class

  • 点击”下一步”。
  • 再次选择“ClientCode”目录。
  • BonusServlet.class”。 确定“ WAR 内容”显示的列表为BonusServlet.class,且其名称之前不带 clientcode目录前缀。
  • 点击“添加”。

将内容添加到WAR 对话框:画面显示应如 图8。

图8 : 添加 bonus.html

  • 点击“完成”。

WAR文件一般属性对话框:

  • 点击”下一步”。

选择组件类型对话框:

  • 选择 Servlet(如果还没有被选择)
  • 点击“下一步”。

组件一般属性对话框:

  • 确定“ Servlet Class”栏中选择的是BonusServlet。
  • 输入一个显示名称(BonusServlet)和描述内容。
  • 你可以忽略Startup load sequence 设置不填,因为这个范例仅使用了一个Servlet。

组件初始化参数 对话框:

  • 点击“下一步”。 BonusServlet不使用任何初 始化参数。

组件别名对话框:

  • 点击“添加”。
  • 键入 BonusAlias并按下回车键。 此一别名与嵌 入在bonu.html文件中的HTML表单的 ACTION域中的所填别名相同。
  • 点击“完成”。

在“内容”窗格中,你会看到,WAR文件包含一个XML文件,并带有有关Web应用的 结构和属性信息, bonus.html文件与 BonusServlet 类文件。WAR文件所采用的格式使所有Servlet类都以web-INF/Classes 为开头被列进项目。然而,在部署WAR文件时,BonusServlet 类被放置在 public_html下的“Context Root”目录中。

要改变显示名称或描述,需要:

  • 将光标放在窗口的相应位置。
  • 修改。
  • 按下回车键,修改生效。

指明JNDI名称和根目录上下文(Root Context)

在部署BonusApp应用及其组件之前, 你需要指明 JNDI名称BonusServlet,查看 CalcBean session bean, 为web组件指明一个上下文根目录。

JNDI名称:

  • 在“本地应用”窗口中选择BonusApp文件。在检 查(Inspecting)窗口的上方显示出许多标签,其中一个就是JNDI名称。
  • 选择“JNDI名称”。 检查窗口中显示出一个带箭头的三栏式结构。CalcBean就 列在中间的一栏中。
  • 在JNDI 名称下的右侧栏中键入calcs。 这个JNDI名称与BonusServelt.lookup 方法中的JNDI名称相同。
  • 按下回车键

上下文根目录

  • 点击检查窗口上方的web context 标签。你会在 左侧栏中看到 BonusWar
  • 在右侧栏中键入 BonusRoot
  • 按下回车键。 在部署过程中,BonusRoot目录在 你的安装 J2sdkee1.2 public_html目录中生成, bonus.html文件和 BonusServlet类被拷贝到该目录中,如a href="#39949" class="XRef"> 图9所示。

 

图9 : 上下文根目录结构

别名:

  • LocalApp窗口中点击BonusWar,然后点击 BonusServlet
  • 在检查窗口上方点击“别名”标签。域中出现 BonusAlias
  • 如果没有出现 BonusAlias,可将其键入,并按 下回车键。

验证和部署J2EE应用

在部署应用之前最好能够运行验证器。验证器能挑出编译器未捕捉到的应用组件中 的错误,如丢失的enterprise bean方法。

验证:

  • 选定BonusApp, 从“工具”菜单中选择“检验器”。
  • 在弹出的对话框中,点击“ OK”。 窗口将通知 你测试成功。
  • 关闭验证器窗口,准备部署应用。
注: 在Version 1.2软件中,你 可能会得到一个tests app.webURI的错误。这表明,在 WAR文件创建过程中,部署工具没有将 .war 扩展名附给 WAR文件。 这是一个小的错误,不影响J2EE 应用的部署。

部署:

  • 从“工具”菜单中选择“部署应用”。 一个“部署BonusApp”对话框会弹出。 验证“目标服务器”选项或者是本地主机或者是运行J2EE服务器的主机的名称。
注:不要选择“Return Client Jar”选项。只有在为客户程序部署独立的应用时才选择这个选项。本范例使用了一个 Servlet和HTML页面,因此,不应该选择这个选项。若选择这个选项,会生成一个带有 独立应用所需部署信息的JAR文件。
  • 点击“下一步”。 确保JNDI名称显示为calcs。 如果不是,则需要将其键入, 然后按下回车键。
  • 点击“下一步”。 确定“上下文根目录”名称显示为 BonusRoot。 如果不是,则需要将其键入,然后按下回车键。
  • 点击“下一步”。
  • 点击“完成”开始部署。此时,会弹出一个显示部署操作状态的对话框。
  • 完成后,左侧的三个状态条都将阴影化,如图10所示。之后,点击 “ OK”。

运行J2EE应用

web 服务器的运行端口默认为8000。 若要打开bonus.html 页面,可进入以下地址, http://localhost:8000/BonusRoot/bonus.html, 这是部署工具放置HTML文件的位置。

注:如果端口8000被其它组件所 使用,可以使用另一个不同的端口,在 -/J2EE/j2sdkee1.2/config目录中编辑 web.properties 文件,重新启动J2EE服务器。
  • 填入社会安全号码
  • 填入乘数
  • 点击“提交”按钮。 BonusServlet处理你的数据, 并返回一个带bonus计算结果的HTML页面。
Bonus Calculation

Soc Sec: 777777777
Multiplier: 25

Bonus Amount 2500.0

更新组件代码

“工具”菜单有两个有用的菜单选项。它们是“更新应用文件”和“更新和重新部 署应用”。你可以利用这些选项轻松修改代码或重新部署应用。只通过选择这些菜单 选项之一就可以简便地改变和重新编译代码。

  • 更新应用文件,用你的新代码更新应用文件。这时,你既 可以验证你的应用也可以对其进行部署。
  • 更新和重新部署应用, 用新代码更新应用文件,并重新部 署应用,而不用运行验证器。

[TOP]

 

常见问答
下载中心
产品简介
 
 
Solaris论坛
 
   
 
null