<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
企业JavaBeansTM学习指南:
3. 如何建立你的第一个无状态(stateless)会话Bean
步骤 5: 创建 ejb-jar 文件
企业JavaBeans 的巨大优势之一是能够以与 GUI 组件相同的移植方式捆绑和分布服务器端逻辑。在这一步中,我们将把在前面几步中所做的源文件进行编译,然后捆绑在一个 ejb-jar 文件中。在完成了以下四项工作后,你将可以生成 Demo.jar这样一个ejb-jar 文件, 这就为将其配置或安装到 Enterprise JavaBeans Container(企业JavaBeans容器)做好了准备。
1) 编译 .java 文件
在你刚刚创建的文件上运行 javac ,也就是在宿主界面和远程界面、以及企业JavaBeans 的 bean 本身上面运行。
2) 创建Deployment Descriptor(配置描述符)
注意: Deployment(配置) 是企业JavaBeans 中的专用术语,它表示将企业 JavaBeans 组件安装到一个企业 JavaBeans 容器这样一个过程。
配置描述符的任务是要使 bean 的 deployer (配置者)能够在配置之前客户化 bean 的许多属性。配置描述符在Enterprise JavaBeans Specification (企业JavaBeans规范)(15.2节)中被描述为javax.ejb.deployment.SessionDescriptor 的一个实例,或为 javax.ejb.deployment.EntityDescriptor的一个实例。在示例 DemoBean 中,它是javax.ejb.deployment.SessionDescriptor 的一个实例。下面是一个输入到WebLogic的实用程序中的文本文件的例子,它将生成配置描述符的序列化实例。
应该注意的是,创建配置描述符的方法没有被指定,因而用来生成和配置企业 JavaBeans 的工具相互间可能也会有很大区别,但不影响 beans 本身在跨平台上的配置能力。 下面的例子继续用WebLogic工具来创建配置描述符。BEA Weblogic Tengah 服务器实现可提供命令行和GUI配置工具,因此要使用命令行工具来配置企业JavaBean,执行如下命令:
java weblogic.ejb.utils.DDCreator -dir ejb/demo DeploymentDescriptor.txt
它将在ejb/demo 目录下创建DemoBeanDD.ser。
下面是输入到BEA Weblogic 工具的DeploymentDescriptor.txt 文本文件的一个例子(源代码):
注意: 这个例子是为 BEA Weblogic 服务器编写的,它使用分号(;) 来作为注释行的标记。
3) 确认你已具有所有程序件(pieces)
下面是企业JavaBeans 开发人员和供应商需要提供的用来创建一个有效 ejb-jar 文件的程序件。也就是企业 JavaBeans 的 bean:
欲了解更详细的信息,请参阅企业 JavaBeans 规范,第16节。
企业JavaBeans 的 bean 供应商负责将所有类装入 ejb-jar 文件, 但是我们期望大多数提供容器和服务器的供应商都能提供工具来进行包装和组合的工作。
清单文件(Manifest)
清单文件是由 jar 实用程序自动生成的, 但它将使用一个模板,因此可用下面的行文创建一个文本文件 (例如, ejb/demo/manifest.txt) 。参考下一节有关包装 bean 的内容,看看这个文本文件是如何被使用的。 有关清单文件的描述,请见
Enterprise JavaBeans Specification(企业JavaBeans规范), 15.3节。
4) 创建 ejb-jar 文件
在这个例子中,你直接将所有的程序件经过 jar 操作后集中到一起,制作了一个被称作Demo.jar 的 jar 文件。人们期望将来的工具会使得包装和ejb-jar 文件的生成更容易些。 你可以想象将来会有一个GUI wizard 引导你轻松地通过并检查这里的依赖关系(dependencies)。
要为这个例子创建 ejb-jar 文件 Demo.jar ,你可以假定 jar 文件的程序件都在 ejb 目录下,然后直接创建一个关于这个目录结构的jar 文件。
注意: 使用 m 标记进行 jar 操作并使用 ejb/demo/manifest.txt 作为清单文件的一个模板。不必将 manifest.txt 装入 jar 文件。
正如你所看到的,关于ejb-jar 文件,没有什么太特殊的地方。
步骤6: 配置DemoBean 企业JavaBean
在这一步里,DemoBean 企业JavaBean 将被安装(或配置)到一个企业JavaBeans 容器。值得注意的是,各个服务器供应商为完成这个安装过程,都开发了自己独特的和越来越精巧的工具。 按照下面的说明,将 DemoBean 安装到你在步骤1中安装的 BEA Weblogic/Tengah 服务器上。
BEA WebLogic/Tengah 的配置
在最新发布的BEA WebLogic/Tengah 服务器上,企业 JavaBeans bean 的配置的含义是 "将 bean 类放在 Tengah 服务器能够找到它们的地方"。这并不是一件很难的事,但做起来也并不轻松。 人们期望将有新的工具来进一步简化这项工作,同时使在此过程中所发生的事情更透明一些。
注意: 这个例子假定 Tengah 服务器安装在 /export 目录下。
1) 生成实现
这一步用来创建早些时候指定的界面实现,以及对DemoBean 的特定的BEA WebLogic支持类。注意它们没有捆绑在你的 bean 中。例如,被生成的类是宿主界面和远程界面,以及被用来支持通信协议的类。 这些类是在配置阶段被生成,并且不是由bean供应商(程序员)所编写的,这样一个事实是使 Enterprise JavaBeans 协议独立的主要原因。
注意: 假定 Tengah 服务器已被安装到 /export 目录下。如果它被安装在其它什么地方的话,你需要更改目标目录(即下面的 -d 参数)。
为使用 BEA WebLogic 工具生成 DemoBean 实现, 请使用: java weblogic.ejbc -d /export/weblogic/classes ejb/demo/DemoBeanDD.ser 这个工具可创建名称与下面的类相似的类,并把它们放在/export/weblogic/classes 目录下。
2) 将Demo.jar 放到Tengah 服务器的类路径上
这件事有几种做法,但最简单的做法是,将 Demo.jar 文件放到 /export/weblogic/classes 目录上,然后编辑/export/weblogic/startTengah.sh 脚本,使之包含Demo.jar 文件。
3) 将DeploymentDescriptor 放到位
现在,Tengah 服务器看来不能在ejb-jar文件内发现序列化的配置描述符,该描述符应该从 jar 文件中拷出到服务器的类路径上。
例如:
4) 编辑weblogic.properties 文件
5) 终止并重新启动 Tengah 服务器
你可以使用 BEA Weblogic 工具来终止并重新启动 Tengah 服务器,或在一定的环境中,直接杀掉主 Tengah 进程,并使用/expot/weblogic/startTengah.sh 脚本来重新启动。详见
BEA Weblogic tools documentation。
步骤7: 编写企业JavaBean 客户程序(Client)
如果你已经成功地完成了步骤 1 至步骤 6 ,DemoBean 现在应该已被配置到了企业JavaBeans 容器,并准备接受客户程序(client)对任何在远程界面上指定的方法的调用。
1)阅读下面的客户程序代码。
2)将这些代码存储到指定文件。
编写客户程序概述
编写客户程序是在本课程中又一个需要你编写代码的地方(除企业 JavaBeans bean 事务逻辑本身之外)。一个企业 JavaBeans bean 的客户程序可能是各种各样的。例如,一个servlet, 一个applet, 或是一个 C/C 程序。下面的例子 DemoClient.java 是在上几步中创建的 DemoBean 企业 JavaBean的客户程序。这个程序应该注意的几个重要地方是:
另外需要注意的是,当你在不同的容器/服务器中配置 bean 时,可能需要有不同版本的客户代码。客户代码的区别可能不大,但毕竟会有一些问题,如获得初始连接的正确的串。例如,考虑下列代码,它为 BEA WebLogic 设置属性对象来检索 JNDI initialContext 对象。它可能与检索initialContext 对象的 Oracle属性串不同。
p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.T3InitialContextFactory");
这里存在各种各样其它的小问题,可能需要某些调整和客户代码的再编译,但它们的工作量都不大。 在下面的样本中,企业JavaBeans 客户程序演示了如何定位一个企业JavaBean 并启动它的远程方法。
步骤 8: 编译并运行客户程序(Client)
所余下来要作的就是编译并运行 Client 程序以确认安装在服务器上的企业 JavaBeans 的功能是否正确。
1). 编译客户程序
编译和运行客户程序对所有的平台是等同的,就象运行客户程序的结果对所有平台也应该是等同的一样。
javac ejb/Demo/democlient.java
2). 运行客户程序
"Hello World" 串出自企业JavaBeans的 DemoSelect() 方法。运行客户程序应给出下列消息:
4. 小结
你现在有了可以运行的 DemoBean 例子,并且你还成功地运行了客户程序。
建立你的第一个无状态会话Bean--HelloWorld之一
建立你的第一个无状态会话Bean--HelloWorld之二
建立你的第一个无状态会话Bean--HelloWorld之三
企业JavaBeansTM学习指南:
建立你的第一个无状态(stateless)会话Bean
- 关于本学习指南
- 关于示例
- 步骤1: 安装企业JavaBeans 服务器
- 步骤2: 指定企业JavaBeans 远程界面
- 步骤3: 指定宿主界面
- 步骤4: 编写企业JavaBean 类
- 步骤5: 创建ejb-jar 文件
- 步骤6: 配置DemoBean企业JavaBeans
- 步骤7: 编写企业JavaBean 客户程序
- 步骤8: 运行客户程序
3. 如何建立你的第一个无状态(stateless)会话Bean
步骤 5: 创建 ejb-jar 文件
Javac ejb/Demo/demohome.java Javac ejb/Demo/demo.java Javac ejb/Demo/demobean.java
(SessionDescriptor ; This file must start with SessionDescriptor or ; EntityDescriptor ; Indicate the name which the bean will be bound ; into the JNDI name as beanHomeName demo.DemoHome ; The enterprise Java Bean class (see step 4) enterpriseBeanClassName ejb.demo.DemoBean homeInterfaceClassName ejb.demo.DemoHome ; The home interface implemented by a class ; generated by the container provided tools ; see step 3 remoteInterfaceClassName ejb.demo.Demo ; See step 2 isReentrant false ; Always false for session beans stateManagementType STATELESS_SESSION ; Either STATELESS_SESSION or STATEFUL_SESSION. ; DemoBean is a stateless session bean sessionTimeout 5 ; seconds (controlDescriptors ; This section decides the run-time properties when ; a method is called. The DEFAULT sub-section applies ; to all methods, but can be overridden on a per-method ; basis, similar to the "accessControlEntries" above. (DEFAULT isolationLevel TRANSACTION_SERIALIZABLE transactionAttribute TX_REQUIRED runAsMode CLIENT_IDENTITY ) ; end isolationLevel ) ; end controlDescriptors (environmentProperties maxBeansInFreePool 100 ) ; end environmentProperties ) ; end SessionDescriptor
-
· 企业 bean 类 bean 所依赖的所有其它类(步骤 4)。
· 企业bean的远程界面 (步骤 2)。
· 企业bean的宿主界面 (步骤 3)。
· 一个配置描述符(见上)。
· java.util.Properties 的一个实例(如果 bean 需要的话)。
· 一个在 ejb-jar 文件中用来鉴别配置描述符的清单文件。
Name: ejb/demo/DemoBeanDD.ser Enterprise-Bean: True
jar cvfm Demo.jar ejb/demo/manifest.txt ejb/demo/*.class / ejb/demo/*.ser 对 Demo.jar 的检查应该产生类似于下面的输出: jar tf Demo.jar META-INF/MANIFEST.MF Ejb/demo/Demo.class Ejb/demo/DemoBean.class Ejb/demo/DemoHome.class Ejb/demo/DemoBeanDD.ser
步骤6: 配置DemoBean 企业JavaBean
ejb/demo/DemoBeanEOImpl.class ejb/demo/DemoBeanHomeImpl.class ejb/demo/Skel5k5x705r2x671nd1i1vy2v524ua5y.class ejb/demo/Skel5q585f5sfzo601q4e725b233m5140.class ejb/demo/Stub5k5x705r2x671nd1i1vy2v524ua5y.class ejb/demo/Stub5q585f5sfzo601q4e725b233m5140.class
/export/weblogic/startTengah.sh #!/bin/sh # # Shell script to manually start Tengah # Server on UNIX systems CLASSPATH=$CLASSPATH:/export/weblogic/classes/Demo.jar echo $CLASSPATH java -ms16m -mx16m -verbosegc weblogic.Server
cd /export/weblogic/classes jar xvf Demo.jar ejb/demo/DemoBeanDD.ser
包括新的企业JavaBeans 的装载和启动的有关说明。 /export/weblogic/weblogic.properties # # # # # # # # # # # # # # # # # # # # # # # # # # # Tengah Enterprise JavaBeans DEMO PROPERTIES # ------------------------------------------------- # Uncomment the appropriate lines below and modify # DBMS-related info and paths to match your particular # installation. # # Deploys the Enterprise JavaBean examples. Uncomment to use: weblogic.ejb.deploy=/ /export/weblogic/classes/beanManaged.jar,/ /export/weblogic/classes/containerManaged.jar,/ /export/weblogic/classes/statefulSession.jar,/ /export/weblogic/classes/ejb/demo/DemoBeanDD.ser # # weblogic.properties file continues below... #
步骤7: 编写企业JavaBean 客户程序(Client)
-
· 建立 JNDI 初始上下文环境。
· 用 JNDI 对 Enterprise JavaBean 的宿主界面定位。
· 用宿主界面指示容器来创建一个 Enterprise JavaBean 实例。
· 用远程界面指示容器来执行 Enterprise JavaBeans bean的方法。
DemoClient.java (源代码) /** * DemoClient -- demonstrates using a minimal * Java application to talk to the DemoBean * stateless session bean */ package ejb.demo; import javax.ejb.*; import javax.naming.*; import java.rmi.*; import java.util.Properties; import examples.ejb.statelessSession.interfaces.*; /** * DemoClient demonstrates using a minimal stateless session * bean. * Remember view session beans as an extension of your client * running in the server. */ public class demoClient { public static void main(String[] args) { System.out.println("/nBegin demoClient.../n"); parseArgs(args); try { // Create A DemoBean object, in the server // Note: the name of the class corresponds to the JNDI // property declared in the DeploymentDescriptor // From DeploymentDescriptor ... // beanHomeName demo.DemoHome Context ctx = getInitialContext(); DemoHome dhome = (DemoHome) ctx.lookup("demo.DemoHome"); // Now you have a reference to the DemoHome object factory // use it to ask the container to creat an instance of // the Demo bean System.out.println("Creating Demo/n"); Demo demo = dhome.create(); // Here is the call that executes the method on the // server side object System.out.println("The result is " demo.demoSelect(); } catch (Exception e) { System.out.println(" = Error <="); e.printStackTrace(); } System.out.println("/nEnd demoClient.../n"); } static void parseArgs(String args[]) { if ((args == null) || (args.length == 0)) return; for (int i = 0; i < args.length; i ) { if (args[i].equals("-url")) Integer.parseInt(args[ i]); else if (args[i].equals("-user")) user = args[ i]; else if (args[i].equals("-password")) password = args[ i]; } } static String user = null; static String password = null; static String url = "t3://localhost:7001"; /** * Gets an initial context. * * @return Context * @exception java.lang.Exception if there is * an error in getting a Context */ static public Context getInitialContext() throws Exception { Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.T3InitialContextFactory"); p.put(Context.PROVIDER_URL, url); if (user != null) { System.out.println ("user: " user); p.put(Context.SECURITY_PRINCIPAL, user); if (password == null) password = ""; p.put(Context.SECURITY_CREDENTIALS, password); } return new InitialContext(p); } }
步骤 8: 编译并运行客户程序(Client)
Java ejb.Demo.democlient Begin DemoClient... Creating Demo The result is Hello World End DemoClient...
4. 小结