Web客户端运行时错误 用检验工具检查问题 比较你的EAR文件和样本EAR文件 其它异常 一.准备工作 在你部署例子应用程序之前请先阅读本节。本节介绍我们使用的工具和如何使用它们。 获得例子代码 本章例子的源文件在j2 eetutorial/examples//src/ejb/converter目录下,是你解压缩本指南 的目标目录的相对路径。 获得编译工具 要编译例子程序的源文件,你需要安装J2 EE SDK和ant(它是一个轻便的编译工具)。详 细信息请参考前言的编译和运行例子一节。 检查环境变量 J2EE和at的安装说明解释了怎么设置需要的环境变量。确定这些环境变量的设置成了下 表中描述的值: 表2-1环培变量设置 环培变量 值 JAVA HOME J2 SE SDK的安装目录 1EE HOME J2 EE SDK的安装目录 ANT_HOME ANT的安装目录(或解压缩目录】 PATH 包括上面三个工具的安装目录的bin子目录 启动J2EE服务器 在终端窗口中执行如下命令启动J2EE服务器: j2ee-verbose 虽然verbose不是必需的,但是它对调试很有用。 停止服务器用如下命令: j2ee-stop 启动deploytool部署工具 deploytool部署工具有两种运行模式:命令模式和GU图形用户接口模式。本章介绍的是 指GUI模式。在终端窗口中执行下面的命令启动deploytool的GUI模式: deplovtool 要查看部署工具的上下文帮助,按F1键
Web 客户端运行时错误 用检验工具检查问题 比较你的 EAR 文件和样本 EAR 文件 其它异常 一 准 们。 获得例子代码 件在j2eetutorial/examples/src/ejb/converter目录下,是你解压缩本指南 获得编译工具 检查环境变量 解释了怎么设置需要的环境变量。确定这些环境变量的设置成了下 表 2-1 环境变量设置 . 备工作 在你部署例子应用程序之前请先阅读本节。本节介绍我们使用的工具和如何使用它 本章例子的源文 的目标目录的相对路径。 要编译例子程序的源文件,你需要安装 J2EE SDK 和 ant(它是一个轻便的编译工具)。详 细信息请参考前言的编译和运行例子一节。 J2EE 和 ant 的安装说明 表中描述的值: 环境变量 值 JAVA_HOME J2SE SDK 的安装目录 J2EE_HOME J2EE SDK 的安装目录 ANT_HOME ANT 的安装目录(或解压缩目录) PATH 包括上面三个工具的安装目录的 bin 子目录 启 终端窗口中执行如下命令启动 J2EE 服务器: 启 deploytool 部署工具 o 工具有两种运行模式:命令模式和 GUI 图形用户接口模式。本章介绍的是 按 F1 键。 动 J2EE 服务器 在 j2ee -verbose 虽然 verbose 不是必需的,但是它对调试很有用。 停止服务器用如下命令: j2ee -stop 动 deployt ol 部署 指 GUI 模式。在终端窗口中执行下面的命令启动 deploytool 的 GUI 模式: deploytool 要查看部署工具的上下文帮助
二.创建J2EE应用程序 在建立例子应用程序的三个组成部分前,你需要创建一个J2E应用程序,命名为 ConverterApp,指定保存应用程序的EAR文件名为ConverterApp.ear。 .在deploytool部署工具中,选择菜单FilelNewAppliction新建应用程序 再出现的对话框中点击Browse 3. 在选择文件对话框中定位到路径:j2 eetutorial/examples/src/ejb/converter 4.在File name域中输入ConverterApp.ear 5 点击New Application按钮 6.点击0K 三.创建企业Bean 企业Bean是包含应用程序商业逻辑的服务器端组件。运行时,客户端调用企业Bean的方法 来处理商业逻辑。本例的企业Bean是一个叫做ConverterEJB的无状态会话Bean,(企业Bean 的分类将在下一章讨论.)它的源文件放在j2 eetutorial/examp les/src/ejb/converter目录 下。 编写企业Bean代码 本例的企业Bean需要以下三类代码: ●Remote接口 企业Bean类 编写Remote接口 Remote接口定义客户端可以访问的商业方法。这些商业方法都在企业Bean类里实现。本 例的Remote接口Coverter的代码: importjavax.ejb.EJBObject; import java.rmi.RemoteException import java.math. public interface Converter extends EJBObject public BigDecimal dollarToYen(BigDecimal dollars) throws RemoteException; public BigDecimal yen ToEuro(BigDecimal yen) throws RemoteException, 编写Home接口 ome接口定义客户端可以调用来创建、查找和刷除企业Bean的方法。本例的Home接口 ConverterHome只有一个create方法,该方法返回企业Bean的远程接口类型。下面是 ConverterHome接口的代码: import java.rmi.RemoteException
二.创建 建立例子应用程序的三个组成部分前,你需要创建一个 J2EE 应用程序,命名为 ConverterApp.ear。 建应用程序 再出现的对话框中点击 Browse 话框中定位到路径:j2eetutorial/examples/src/ejb/converter 三.创建企业 程序商业逻辑的服务器端组件。运行时,客户端调用企业Bean的方法 处理商业逻辑。本例的企业Bean是一个叫做ConverterEJB的无状态会话Bean,(企业Bean ial/examples/src/ejb/converter目录 。 编写企业 例的企业 Bean 需要以下三类代码: 编写 ote 接口 emote 接口定义客户端可以访问的商业方法。这些商业方法都在企业 Bean 类里实现。本 java.math.*; ds EJBObject { Yen(BigDecimal dollars) (BigDecimal yen) 编写 Home 接口 义客户端可以调用来创建、查找和删除企业 Bean 的方法。本例的 Home 接口 me 只有一个 create 方法,该方法返回企业 Bean 的远程接口类型。下面是 J2EE 应用程序 在 ConverterApp,指定保存应用程序的 EAR 文件名为 1. 在 deploytool 部署工具中,选择菜单 File\New\Appliction 新 2. 3. 在选择文件对 4. 在File Name域中输入ConverterApp.ear 5. 点击 New Application 按钮 6. 点击 OK Bean 企业Bean是包含应用 来 的分类将在下一章讨论。)它的源文件放在j2eetutor 下 Bean 代码 本 z Remote 接口 z Home 接口 z 企业 Bean 类 Rem R 例的 Remote 接口 Coverter 的代码: import javax.ejb.EJBObject; import java.rmi.RemoteException; import public interface Converter exten public BigDecimal dollarTo throws RemoteException; public BigDecimal yenToEuro throws RemoteException; } Home 接口定 ConverterHo ConverterHome 接口的代码: import java.io.Serializable; import java.rmi.RemoteException;
import javax.ejb.CreateException; import javax.eib.EJBHome: public interface ConverterHome extends EJBHome Converter create()throws RemoteException,CreateException; 编写企业Bean类 本例的企业Bean类是ConverterBean类。它实现了Remote接口Converter定义的两个商业 方法:dollarToYen和yenToEuro。.ConverterBean的代码如下: importjava.rmi.RemoteException. import javax.eib.SessionBean import javax.ejb.SessionContext. import java.math. public class ConverterBean implements SessionBean BigDecimal yenRate=new BigDecimal("121.6000") BigDecimal euroRate=new BigDecimal("0.0077"). public BigDecimal dollarToYen(BigDecimal dollars) BigDecimal result=dollars.multiply(yenRate). retu resultsetScale(2BigDecimal R OUND_UP) public BigDecimal yenToEuro(BigDecimal yen) BigDecimal result=yen.multiply(euroRate); return result setScale(2,BigDecimal.ROUND_UP): public ConverterBean() public void ejbCreate() public void ejbRemove() public void ejbActivate() public void ejbPassivate() public void setSessionContext(SessionContext sc) 编泽源文件 现在你可以编译Remote接口(Converter..java)、Home接口(ConverterHome.java)和企 业Bean类的源文件了。 在终端窗口中进 入j2 eetutorial/examples directory目录
import javax.ejb.CreateException; s EJBHome { 编写 verterBean 类。它实现了 Remote 接口 Converter 定义的两个商业 en 和 yenToEuro。ConverterBean 的代码如下: va.r oteException; ssionContext; w BigDecimal("0.0077"); p arToYen(BigDecimal dollars) { lt = dollars.multiply(yenRate); } p Euro(BigDecimal yen) { re } public public p emove() {} p ivate() {} vate() {} p {} } 编译源文件 现在 rterHome.java)和企 业 B 1. 入j2eetutorial/examples directory目录 import javax.ejb.EJBHome; public interface ConverterHome extend Converter create() throws RemoteException, CreateException; } 企业 Bean 类 本例的企业 Bean 类是 Con 方法:dollarToY import ja mi.Rem import javax.ejb.SessionBean; import javax.ejb.Se import java.math.*; public class ConverterBean implements SessionBean { BigDecimal yenRate = new BigDecimal("121.6000"); BigDecimal euroRate = ne ublic BigDecimal doll BigDecimal resu return result.setScale(2,BigDecimal.ROUND_UP); ublic BigDecimal yenTo BigDecimal result = yen.multiply(euroRate); turn result.setScale(2,BigDecimal.ROUND_UP); ConverterBean() {} void ejbCreate() {} ublic void ejbR ublic void ejbAct public void ejbPassi ublic void setSessionContext(SessionContext sc) 你可以编译 Remote 接口(Converter.java)、Home 接口(Conve ean 类的源文件了。 在终端窗口中进
2.执行命令:ant converter 这个命令编译本例企业Bean和J2E应用程序客户端的源文件,编译后的类文件放在 j2 eetutorial/,examples/.buiId/ejb/converter目录下(不是src目录)。关于编译的更多信息 参考前言部分的编译和运行例子。 注意:在前述ant编译源文件时,它将2ee.iar文件加在每个编泽任务的classpath中 j2e.jar文件存放在J2ESD安装目录的1ib子目录下。如果你使用其它工具来编译这 些源文件,需要把i2ee.iar文件加入classpath。或者可以直接将该文件加入操作系统的 classpath环境变量中。 打包企业Bean 我们使用deploytool部署工具的新建企业Bean向导来打包企业Bean。在这个过程中向导 完成如下工作 L.创建企业Bean的部署描述符文件 2.将部署描述符文件和企业Bean的类文件打包进同一个EJB JAR文件 3 把生成的EJB JAR文件加入应用程序的ConverterApp..ear文件 打包成功后你可以用Tools\Descriptor Viewer莱单查看部署描述符文件内容 用File\New\Enterprise Bean菜单打开新建企业Bean向导,该向导包含以下对话框: 1. Introduction对话框 a)阅读该向导的说明 h)占击Next EJB JAR对话框 a)选择Create New JAR File In Application单选按钮 b)在下拉框中选择ConverterApp c)在JAR Display Name域输入ConverterJAR d) 点击Edite按 e)在Available Files下的树中定位到j2 eetutorial/examples/.build/.ejb/converter 目录,(如果converter目录在树中的层次太深,你可以通过在Starting Directory 中输入converter的整个或者部分路径来简化在树中的目录展开动作) f)在Available Files树中选中converter目录下的Converter.class ConverterBean..class和ConverterHome..class文件点击Add按钮。(你也可以使 用鼠标拖放操作来将这些文件加入Contents文本域) g)点击OK h)点击Next 3. General对话柜 a)在Bean Type下选中Session单选按钮 b)选中Stateless单选按钮 在Enterprise Bean Class下拉框中选择ConverterBear d)在Enterprise Bean Name域输入ConverterEJB e)在Remote Home Interface下拉框中选择ConverterHome f)在Remote Interface下拉框中选择Converte g)点击Next
2. 执行命令:ant converter 这个 件,编译后的类文件放在 l (不是src目录)。关于编译的更多信息 lib 子目录下。如果你使用其它工具来编译这 打包企业 Tools\Descriptor Viewer 菜单查看部署描述符文件内容 新建企业 Bean 向导,该向导包含以下对话框: e New JAR File In Application 单选按钮 框中选择 ConverterApp ) 在Available Files下的树中定位到j2eetutorial/examples/build/ejb/converter 通过在Starting Directory 径来简化在树中的目录展开动作) 来将这些文件加入 Contents 文本域) a) ConverterBean d) 命令编译本例企业Bean和J2EE应用程序客户端的源文 j2eetutorial/examp es/build/ejb/converter目录下 参考前言部分的编译和运行例子。 注意:在前述 ant 编译源文件时,它将 j2ee.jar 文件加在每个编译任务的 classpath 中。 j2ee.jar 文件存放在 J2EE SDK 安装目录的 些源文件,需要把 j2ee.jar 文件加入 classpath。或者可以直接将该文件加入操作系统的 classpath 环境变量中。 Bean 我们使用 deploytool 部署工具的新建企业 Bean 向导来打包企业 Bean。在这个过程中向导 完成如下工作: 1. 创建企业 Bean 的部署描述符文件 2. 将部署描述符文件和企业 Bean 的类文件打包进同一个 EJB JAR 文件 3. 把生成的 EJB JAR 文件加入应用程序的 ConverterApp.ear 文件 打包成功后你可以用 用 File\New\Enterprise Bean 菜单打开 1. Introduction 对话框 a) 阅读该向导的说明 b) 点击 Next 2. EJB JAR 对话框 a) 选择 Creat b) 在下拉 c) 在 JAR Display Name 域输入 ConverterJAR d) 点击 Edite 按钮 e 目录。(如果converter目录在树中的层次太深,你可以 域中输入converter的整个或者部分路 f) 在 Available Files 树 中 选 中 converter 目 录 下 的 Converter.class 、 ConverterBean.class 和 ConverterHome.class 文件点击 Add 按钮。(你也可以使 用鼠标拖放操作 g) 点击 OK h) 点击 Next 3. General 对话框 在 Bean Type 下选中 Session 单选按钮 b) 选中 Stateless 单选按钮 c) 在 Enterprise Bean Class 下拉框中选择 在 Enterprise Bean Name 域输入 ConverterEJB e) 在 Remote Home Interface 下拉框中选择 ConverterHome f) 在 Remote Interface 下拉框中选择 Converter g) 点击 Next
4.Transaction Management对话框 a)后面的步骤对本例并不重要,点击Finish完成向导 四.创建J2EE应用程序客户端 J2EE应用程序客户端是用Java语言编写的应用程序。在运行时,客户端应用程序可以运行 在和2EE服务器不同的ava虚拟机中。 本例的2EE应用程序客户端需要两个不同的JAR文件。第一个JAR文件存放2EE客户 端组件,它包含客户端的部署描述符和类文件。当你使用新建应用程序客户端向导创建该 JAR文件时,deploytool会自动将生成的JAR文件加入应用程序的EAR文件中.因为在2EE 规范中被定义, 这个JAR文件可以轻易适应不同的J2EE服务器。 第二个J八R文件包含客户端运行时需要的一些存根类文件。这些存根文件使客户端可以访 问运行在J2EE服务器上的企业Bean。因为J2EE规范没有定义这个存根JAR文件,它的 实现根据服务器的不同而不同,本例中的这个JAR文件只适用于2 EE SDK 本例的2E正应用程序客户端源文件为: j2 eetutorial/examples/,src/ejb/converter/ConverterClient.java.它己经在创建企业Bean 节中被编译过。 编写J2EE应用程序客户端代码 ConverterClientjava源文件展示了企业Bean客户端要完成的基本任务: ●查找Home接口 ●创建一个企y业Bean实例 ● 调用商业方法 查找Home接口 ConverterHome接口定义了像create等的企业Bean生命周期方法。在ConverterClient能调 用create方法之前,它必须先查找到一个ConverterHome类型的实例对象。以下是查找过 L.创建一个初始命名上下文(initial naming context)对象: Context initial=new InitialContext() Context接口是Java命名和目录接口(Java Naming and Directory Interface,JNDI) 的一部分。一个命名上下文是一个名字到对象绑定的集合,上下文中已绑定的名字是 对象的JNDI名。 个InitialContext(该类实现Context接口)对象提供名字方案的访问入口。所有 的命名操作都关联一个上下文。 2 获得客户端的环境命名上下文对象; Context myEnv=(Context)initiallookup("java:comp/env"). Java:comp/env是绑定到ConverterClient组件环境命名上下文对象的名字。 3.获得绑定到名字ejb//simpleConverter的对象 Object objref=myEnv.lookup("ejb/SimpleConverter"). 名字ejb/SimpleConverter绑定到一个企业Bean的引用,该引用是企业Bean的Home 接口的逻辑名.这样名字ejb/SimpleConverter就等于引用一个ConverterHome对象. 企业Bean的名字应该存放在java:com/env/ejb的字上下文中
4. Transaction Management 对话框 a) 要,点击 Finish 完成向导 用程序客户端向导创建该 JAR 文件 用程序的 EAR 文件中。因为在J2EE ,这个 JAR 文件可以轻易适应不同的 J2EE 服务器。 JAR 文件只适用于 J2EE SDK。 本 例 端源文件为: j2eetuto 已经在创建企业Bean 编写 J2EE Converte 端要完成的基本任务: z 查找 z 创建一个企业 Bean 实例 z 调用 查找 Home 口 Converte 生命周期方法。在 ConverterClient 能调 用 create 法之前,它必须先查找到一个 ConverterHome 类型的实例对象。以下是查找过 程: 1. 创建 象: Cont irectory Interface ,JNDI) 的一部分。一个命名上下文是一个名字到对象绑定的集合,上下文中已绑定的名字是 对象 一个 入口。所有 的命 2. 获得客户端的环境命名上下文对象: Java: omp/env 是绑定到 ConverterClient 组件环境命名上下文对象的名字。 3. 获得 /SimpleConverter"); 名字 该引用是企业 Bean 的 Home 接口 ter 就等于引用一个 ConverterHome 对象。 企业 后面的步骤对本例并不重 四.创建 J2EE 应用程序客户端 J2EE 应用程序客户端是用 Java 语言编写的应用程序。在运行时,客户端应用程序可以运行 在和 J2EE 服务器不同的 Java 虚拟机中。 本例的 J2EE 应用程序客户端需要两个不同的 JAR 文件。第一个 JAR 文件存放 J2EE 客户 端组件,它包含客户端的部署描述符和类文件。当你使用新建应 时,deploytool 会自动将生成的 JAR 文件加入应 规范中被定义 第二个 JAR 文件包含客户端运行时需要的一些存根类文件。这些存根文件使客户端可以访 问运行在 J2EE 服务器上的企业 Bean。因为 J2EE 规范没有定义这个存根 JAR 文件,它的 实现根据服务器的不同而不同,本例中的这个 的 J2EE 应用程序客户 rial/examples/src/ejb/converter/ConverterClient.java。它 一节中被编译过。 应用程序客户端代码 rClient.java 源文件展示了企业 Bean 客户 Home 接口 商业方法 接 rHome 接口定义了像 create 等的企业 Bean 方 一个初始命名上下文(initial naming context)对 Context initial = new InitialContext(); ext 接口是 Java 命名和目录接口(Java Naming and D 的 JNDI 名。 InitialContext(该类实现 Context 接口)对象提供名字方案的访问 名操作都关联一个上下文。 Context myEnv = (Context)initial.lookup("java:comp/env"); c 绑定到名字 ejb/simpleConverter 的对象 Object objref = myEnv.lookup("ejb ejb/SimpleConverter 绑定到一个企业 Bean 的引用, 的逻辑名。这样名字 ejb/SimpleConver Bean 的名字应该存放在 java:com/env/ejb 的字上下文中