4.将得到的引用造型为ConverterHome类型的对象 ConverterHome home= (ConverterHome)PortableRemoteObject.narrow(objref,ConverterHome.class), 创建一个企业Bean实例 可端调用ConverterHome类型的对象的create方法来创建一个企业Bean实例,该方法返回 个Converter(本例企业Bean的远程接口)类型的对象 Converter接口定义了客户端可 调用的企业Bean商业方法。当客户端调用上述的create方法,容器实例化一个企业Bean 然后调用ConverterBean.ejbCreate方法。客户端调用代码如下: nverter currencyConverter home.create() 调用商业方法 调用商业方法十分简单,就是调用上面获得的Converter类型对象的方法(该接口中定义的 方法都是商业方法)。EB容器会调用运行在服务器中的ConverterEJB实例的对应方法。客 户瑞调用dol larToYen商业方法的代码如下: BigDecimal param new BigDecimal ("100.00") BigDecimal amount -currencyConverter.dollarToYen(param) 下面是客户ConverterClient的完整代码: import javax.naming.Context. import javax.naming InitialContex import javax.rmi.PortableRemoteObject import java.math.BigDecimal: public class ConverterClient public static void main(Stringargs) try Context initial =new InitialContext() Object objref=initial.lookup ("java:comp/env/ejb/SimpleConverter"). ConverterHome home- (ConverterHome)PortableRemoteObject narrow(objref, ConverterHome class) Converter currencyConverter home.create(). BigDecimal param=new BigDecimal ("00.00") BigDecimal amount currencyConverter dollar To Yen(param) System.outprintln(amount) amount=currencyConverter.yenToEuro(param)
4. 将得 对象 onverterHome home = leRemoteObject.narrow(objref,ConverterHome.class); 创建一个企业 Bean 实例 可端调用 e 方法来创建一个企业 Bean 实例,该方法返回 一个 Con 定义了客户端可 调用的企 用上述的 create 方法,容器实例化一个企业 Bean 然后调用 Bean.ejbCreate 方法。客户端调用代码如下: er currencyConverter = home.create(); 调用商业方 上面获得的Converter类型对象的方法(该接口中定义的 运行在服务器中的ConverterEJB实例的对应方法。客 ter.dollarToYen(param); h.BigDecimal; ConverterClient { [] args) { initial = new InitialContext(); ct objref = initial.lookup ("java:comp/env/ejb/SimpleConverter"); ConverterHome.class); r home.create(); BigDecimal param = new BigDecimal ("100.00"); onverter.dollarToYen(param); cyConverter.yenToEuro(param); 到的引用造型为 ConverterHome 类型的 C (ConverterHome)Portab ConverterHome 类型的对象的 creat verter(本例企业 Bean 的远程接口)类型的对象。Converter 接口 业 Bean 商业方法。当客户端调 Converter Convert 法 调用商业方法十分简单,就是调用 方法都是商业方法)。EJB容器会调用 户端调用dollarToYen商业方法的代码如下: BigDecimal param = new BigDecimal ("100.00"); BigDecimal amount = currencyConver 下面是客户端 ConverterClient 的完整代码: import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import java.mat public class public static void main(String try { Context Obje ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(objref, Converter cur encyConverter = BigDecimal amount = currencyC System.out.println(amount); amount = curren
System.out.println(amount): System.exit(O) catch (Exception ex) System.errprintln("Caught an unexpected exception!") ex.printStackTrace(): 打包J2EE应用程序客户端 客户端的源文件已经在创建企业Ban时同时被编译过了,这里直接打包。 运行deploytool部署工具的新建应用程序客户端向导,该向导完成如下工作: ●创建应用程序客户端的部罢描述符文件 将部署描述符文件加入客户端的JAR文件 ·将生成的JAR文件加入ConverterApp.ear文件 之后你可以通过Tools\Descrptor Viewer菜单查看部署描述符文件内容。 从FileNewApplication Client菜单打开该向导,它有以下对话框: I.Introduction对话框 a)阅读向导说明 b)然后Next 2.JAR File Contents对话框 )在下拉框中选择ConverterApp b)点击Edt按钮 c)将j2 eetutorial/examples./build/ejb/converter/ConverterClient.class文件加入 Contents0f树中 d)确定然后Mext 3.General对话框 a)在Main Class下拉框中选择ConverterClient b)确定Display Name域中输入了ConverterClien c)在Callback Handler Class下拉框中选择Use container-managed authentication d)Next后点击Finish完成 指定应用程序客户端的企业Ben引用 当客户端ConverterClient调用lookup方法,它传递企业Bean的Home接口的引用绑定名 字给方法: Object objref=myEnv.lookup("ejb/SimpleConverter"). 设置该引用名字的步骤如下: l.在deploytool工具左边的树视图中选择ConverterClient节点 2. 选择右边的EJB Refs选项页
System.out.println(amount); it(0); pected exception!"); race(); 打包 J2EE 应用程序客户端 建企业 Bean 时同时被编译过了,这里直接打包。 文件加入客户端的 JAR 文件 2. JAR a) b) c) utorial/examples/build/ejb/converter/ConverterClient.class文件加入 d) 3. Gene a) b) rClient c) r-managed authentication d) 指定应用程序客户端的企业 当客户端 递企业 Bean 的 Home 接口的引用绑定名 字给方法 myEnv.lookup("ejb/SimpleConverter"); 设置该引用名字的步骤如下: 1. 在 deploytool 工具左边的树视图中选择 ConverterClient 节点 2. 选择 EJB Refs 选项页 System.ex } catch (Exception ex) { System.err.println("Caught an unex ex.printStackT } } } 客户端的源文件已经在创 运行 deploytool 部署工具的新建应用程序客户端向导,该向导完成如下工作: z 创建应用程序客户端的部署描述符文件 z 将部署描述符 z 将生成的 JAR 文件加入 ConverterApp.ear 文件 之后你可以通过 Tools\Descrptor Viewer 菜单查看部署描述符文件内容。 从 File\New\Application Client 菜单打开该向导,它有以下对话框: 1. Introduction 对话框 a) 阅读向导说明 b) 然后 Next File Contents 对话框 在下拉框中选择 ConverterApp 点击 Edit 按钮 将j2eet Contents Of树中 确定然后 Next ral 对话框 在 Main Class 下拉框中选择 ConverterClient 确定 Display Name 域中输入了 Converte 在 Callback Handler Class 下拉框中选择 Use containe Next 后点击 Finish 完成 Bean 引用 ConverterClient 调用 lookup 方法,它传 : Object objref = 右边的
3.点击Add按钮 4.在Coded Name列输入ejb/SimpleConverter 在Type列选择Session 6.在Interfaces列选择Remote 7.在Home Interface列输入ConverterHome 8.在Local/Remote Interface列输入Converter 五.创建wWeb客户端 Web客户端包含在JSP文件j2 eetutorial/examples//src/ejb/converter/.index.jsp中.Jsr 文件是一个基于文本的文档,它有两种类型的内容组成:静态模板数据,它们可以是像HTM ML和ML等等的任意基于文本格式的表示:JSP元素,它是动态内容 编写Web客户端代码 下面代码的粗体部分和应用程序客户端的工作相似,它查找企业Bean的Home接口,创建 企业Bean实例,然后调用商业方法。仅有的不同是lookup调用时的参数, 为什么这么用 在下一节介绍。 客户端需要的类都在JSP命令(<%@%>中包括的代码)中导入(import)。因为查找查找 Home接口和创建企业Bean实例只执行一次,所以这些代码放在JSP声明(<%!%>中包括 的代码)中,声明中的代码将在JSP的初始化方法jspInit中被执行。接着用HTML标记创 建包含一个输入框的表单。接着的scriptlet(<%%>中包含的部分)代码从request内值对 象中读出参数并将它转换为BigDecimal对象,最后JSP表达式(<%%中包含的表达式) 调用企业Bcan的商业方法并将结果写入送到客户端(浏览器)的页面输出流传。 <%page import="Converter.ConverterHome.javax.eib.*. javax.naming.javax.rmi.PortableRemoteObject. java.rmi.RemoteException"% %1 private Converter verter=null: public void jsplnit(){ try InitialContext icnew InitialContext Object objRef-ic.lookup(" iava:comp/env/eib/TheConverter"): ConverterHome home (ConverterHome)PortableRemoteObject.narrow( objRef,ConverterHome.class); converter=home.create(); )catch(RemoteException ex)
3. 点击 钮 4. 在 Co e 列输入 ejb/SimpleConverter 5. 在 Ty Session 6. 在 In 7. 在 Ho face 列输入 ConverterHome 8. 在 Lo al/Remote Interface 列输入 Converter 五.创建 Web 客户 在 JSP 文件 j2eetutorial/examples/src/ejb/converter/index.jsp 中。JSP 文件是一 容组成:静态模板数据,它们可以是像 HTML、 WML 和 XM 式的表示;JSP 元素,它是动态内容。 编写 Web 下面代码的粗体部分和应用程序客户端的工作相似,它查找企业 Bean 的 Home 接口,创建 企业 Bea 同是 lookup 调用时的参数,为什么这么用 在下一节 客户端需要的类都在 JSP 命令(<%@ %>中包括的代码)中导入(import)。因为查找查找 Home 接口和创建企业 Bean 实例只执行一次,所以这些代码放在 JSP 声明(<%! %>中包括 的代码) 被执行。接着用 HTML 标记创 建包含一 含的部分)代码从 request 内值对 象中读出 达式(<%= %>中包含的表达式) 调用企业 的商业方法并将结果写入送到客户端(浏览器)的页面输出流传。 ome,javax.ejb.*, rivate Converter converter = null; ic void jspInit() { try { InitialContext ic = new InitialContext(); Object objRef = ic.lookup(" java:comp/env/ejb/TheConverter"); onverterHome home = objRef, ConverterHome.class); converter = home.create(); Add 按 ded Nam pe 列选择 terfaces 列选择 Remote me Inter c Web 客户端 端包含 个基于文本的文档,它有两种类型的内 L 等等的任意基于文本格 客户端代码 n 实例,然后调用商业方法。仅有的不 介绍。 中,声明中的代码将在 JSP 的初始化方法 jspInit 中 个输入框的表单。接着的 scriptlet(<% %>中包 参数并将它转换为 BigDecimal 对象,最后 JSP 表 Bean <%@ page import="Converter,ConverterH javax.naming.*, javax.rmi.PortableRemoteObject, java.rmi.RemoteException" %> <%! p publ C (ConverterHome)PortableRemoteObject.narrow( } catch (RemoteException ex) { ... } }
<html> <head> <title>Converter</title> </head> <body bgcolor="white" <hl><center-Converter</center></h1> <hr> <p>Enter an amount to convert</p> <form method="get"> <input type="text"name="amount"size="25"> <br <p> <input type-"submit"value-"Submit" <input type="reset"value="Reset" S/form> % String amount=request getParameter("amount") if amount !null &amount length()>0) BigDecimal d =new BigDecimal (amount) <p>%=amount %dollars are <%converter.dollarToYen(d)%>Yen <p%amount%>Yen are <%converter.yen'ToEuro(d)%>Euro. <% </body> </html> 编译Web客户端 J2EE服务器自动编译Web客户端的JSP页面,如果是servlet实现,你需要先编译它。 打包web客户端 运行deploytool工具的新建web客户端向导,它完成如下工作: 1.创建Wb客户端的部署描述符 2.将Wb客户端的文件打包进一个WAR文件中 3.将该WAR文件加入应用程序的ConverterApp.ear文件中 可以通过菜单在打包结束后查看部署描述符文件的内容
%> <html> <head> <title>Converter</title> </head> <body bgcolor="white"> nter an amount to convert:</p> = eter("amount"); ull && amount.length() > 0 ) { ecimal d = new BigDecimal (amount); %> dollars are ollarToYen(d) %> Yen. > Euro. 编译 打包 ,它完成如下工作: 进一个 WAR 文件中 可以 打包结束后查看部署描述符文件的内容。 <h1><center>Converter</center></h1> <hr> <p>E <form method="get"> <input type="text" name="amount" size="25"> <br> <p> <input type="submit" value "Submit"> <input type="reset" value="Reset"> </form> <% String amount = request.getParam if ( amount != n BigD %> <p><%= amount <%= converter.d <p><%= amount %> Yen are <%= converter.yenToEuro(d) % <% } %> </body> </html> Web 客户端 J2EE 服务器自动编译 Web 客户端的 JSP 页面,如果是 servlet 实现,你需要先编译它。 Web 客户端 运行 deploytool 工具的新建 Web 客户端向导 1. 创建 Web 客户端的部署描述符 2. 将 Web 客户端的文件打包 3. 将该 WAR 文件加入应用程序的 ConverterApp.ear 文件中 通过 Tools\Descriptor 菜单在
用File\NewWeb Component菜单打开该向导,它有如下对话框组成: L.ntroduction对话框。阅读向导说明 2.WAR File对话框 a)选中Create New WAR File In Application b在下拉框中选择ConverterApp )在WAR Display域输入ConverterWAR d点击Edit c)将j2 eetutorial/examp les/,build/,ejb/converter/index..jsp文件加入Contents0f 树的 D确定 3.Choose Component Type对话框。选中JSP单选按钮 4.Component General Properties对话框。在JSP Filename下拉框中选择index.jsp。点击 Finish完成 指定Web客户端的企业Bean引用 Web客户端的企业Bean的Home接口的引用名为:ejb/TheConverter。.Lookup调用: Object objRef=ic.lookup("java:comp/env/ejb/TheConverter"). 设置该引用名步骤如下: 1, 在树视图中选择ConverterWAR节点 2. 选择EJBRefs选项页 3. 点击Add按钮 4. 在Coded Name列中输入ejb/TheConverter 5. 在Type列选择Session 6. 在Interfaces列选择Remote 在Home Interface列输入ConverterHome &.在Local/Remote Interface列输入Converter 六.设置企业Bean的JNDI名 虽然J2EE应用程序客户端和Web客户端访问的是同一个企业Bean,但是它们对企业Bean 的Home接口的引用命名不同。J2EE应用程序客户端用ejb/SimpleConverter查找Home接 口引用,而Web客户端用ejb/Th Converter。.这些引用名都作为lookup调用是的参数 为 了让lookup方法能够通过它们找到企业Bean的Home接口类型对象,你必须映射这些弓 用名到企业Ban的NDI名。虽然这个映射增成了一个间接访问层,但是它降低了客户端 和企业Ban之间的耦合,使J2EE组件更容易装配成应用程序。(这种引用查找在EJB1】 时出现,主要是避免在代码中写死NDI名来查找企业Bean可能造成的装配时NDI名冲 家) 以下步骤建立引用名和NDI名的映射 I.在树视图中选择ConverterApp节点 2.选择JNDI Name选项页 3.在Application表格中选中ConverterEJB组件,在NDI Name列中输入MyConverter作 为ConverterEJB的NDI名
用 File\New\Web Component 菜单打开该向导,它有如下对话框组成: 1. Introduction 对话框。阅读向导说明 2. WAR File 对话框 a) 选中 Create New WAR File In Application b) 在下拉框中选择 ConverterApp c) 在 WAR Display 域输入 ConverterWAR d) 点击 Edit e) 将 j2eetutorial/examples/build/ejb/converter/index.jsp 文件加入 Contents Of 树中 f) 确定 3. Choose Component Type 对话框。选中 JSP 单选按钮 4. Component General Properties 对话框。在 JSP Filename 下拉框中选择 index.jsp。点击 Finish 完成 指定 Web 客户端的企业 Bean 引用 Web 客户端的企业 Bean 的 Home 接口的引用名为:ejb/TheConverter。Lookup 调用: Object objRef = ic.lookup("java:comp/env/ejb/TheConverter"); 设置该引用名步骤如下: 1. 在树视图中选择 ConverterWAR 节点 2. 选择 EJB Refs 选项页 3. 点击 Add 按钮 4. 在 Coded Name 列中输入 ejb/TheConverter 5. 在 Type 列选择 Session 6. 在 Interfaces 列选择 Remote 7. e te Converter 六 的是同一个企业 Bean,但是它们对企业 Bean 同。J2EE 应用程序客户端用 ejb/SimpleConverter 查找 Home 接 了让 通过它们找到企业 Bean 的 Home 接口类型对象,你必须映射这些引 这个映射增减了一个间接访问层,但是它降低了客户端 Bean 时出 突) 2. B 组件,在 JNDI Name 列中输入 MyConverter 作 在 Home Interface 列输入 ConverterHom 8. 在 Local/Remo Interface 列输入 .设置企业 Bean 的 JNDI 名 虽然 J2EE 应用程序客户端和 Web 客户端访问 的 Home 接口的引用命名不 口引用,而 Web 客户端用 ejb/TheConverter。这些引用名都作为 lookup 调用是的参数。为 lookup 方法能够 用名到企业 Bean 的 JNDI 名。虽然 和企业 之间的耦合,使 J2EE 组件更容易装配成应用程序。(这种引用查找在 EJB1.1 现,主要是避免在代码中写死 JNDI 名来查找企业 Bean 可能造成的装配时 JNDI 名冲 。 以下步骤建立引用名和 JNDI 名的映射: 1. 在树视图中选择 ConverterApp 节点 选择 JNDI Name 选项页 3. 在 Application 表格中选中 ConverterEJ 为 ConverterEJB 的 JNDI 名