1.编写主接口程序
在文本编辑器中编辑HelloHome.java文件,并保存在C:\work\hello目录下,其代码为: //本接口需要引入的类或接口 import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; //定义主接口,必须继承EJBHome public interface HelloHome extends EJBHome { //定义EJB创建方法 Hello create() throws CreateException, RemoteException; } 2.编写远程接口程序 在文本编辑器中编辑Hello.java文件,并保存在C:\work\hello目录下。Hello.java文件的代码为: //本接口需要引入的类或接口 import javax.ejb.EJBObject; import java.rmi.RemoteException; //定义远程接口,必须继承EJBObject public interface Hello extends EJBObject { //定义业务逻辑方法 public String sayHello() throws RemoteException; } 3.编写Bean类实现程序 在文件编辑器中编辑HelloBean.java文件,并保存在C:\work\hello目录下。HellloBean.java文件的代码为: //本类需要引入的类或接口 import javax.ejb.CreateException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; //实现业务逻辑,必须实现SessionBean接口 public class HelloBean implements SessionBean { //这是个会话EJB,声明会话上下文 private SessionContext ctx; //声明字符串 private String words; //接口SessionBean中定义的方法,必须实现 public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } //接口SessionBean中定义的方法,必须实现 public void ejbActivate() { } //接口SessionBean中定义的方法,必须实现 public void ejbPassivate() { } //接口SessionBean中定义的方法,必须实现 public void ejbRemove() { } //和主接口定义对应的方法,必须实现 public void ejbCreate() throws CreateException { words = "Hello World"; } //供客户端调用的业务逻辑方法,这里只简单的打印字符串,并把字符串返回到客户端 public String sayHello() { System.out.println("I am in an EJB of Server ."+words); return words; } } 2.2.2 EJB代码编译 首先打开命令窗口,进入C:\work\hello目录,运行环境变量脚本程序: c:\work\hello>c:\work\setEnv 建立build目录: c:\work\hello>md build 执行编译命令: c:\work\hello>java -d build Hello.java HelloHome.java HelloBean.java 其中:-d build 表示编译生成的class文件放在build目录中。 2.2.3 EJB部署文件编写 部署文件是EJB的重要组成部分。简单地说,部署文件就是EJB的说明文件,这个文件由服务器容器使用,服务器根据部署文件的说明来管理EJB。 EJB部署文件是标准的XML文件,必须遵守XML的语法规则。此外,还要遵守相关的DTD规则。 部署文件到少有两个文件ejb-jar.xml和weblogic-ejb-jar.xml。前者为EJB自身的一些特征,如名称、组成等:后者是和EJB部署相关的描述。 编写部署文件: (1)在文件编辑器中编辑ejb-jar.xml文件,并保存在C:\work\hello目录下。ejb-jar.xml文件的内容为: <?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC ‘-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN‘ ‘http://java./j2ee/dtds/ejb-jar_1_1.dtd‘> <!--EJB说明文件--> <ejb-jar> <small-icon>images/green-cube.gif</small-icon> <enterprise-beans> <!--定义会话EJB--> <session> <small-icon>images/orange-cube.gif</small-icon> <!--定义会话EJB名--> <ejb-name>MyFirstEJB</ejb-name> <!--定义会话EJB主接口名--> <home>HelloHome</home> <!--定义会话EJB远程接口名--> <remote>Hello</remote> <!--定义会话EJB实现类名--> <ejb-class>HelloBean</ejb-class> <!--定义会话EJB类型--> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> <!--定义会话EJB装配描述--> <assembly-descriptor> <container-transaction> <method> <ejb-name>MyFirstEJB</ejb-name> <method-intf>Remote</method-intf> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar> (2)在文件编辑器中编辑weblogic-ejb-jar.xml文件,并保存在C:\work\hello目录下。weblogic-ejb-jar.xml文件的内容为: <?xml version="1.0"?> <!DOCTYPE weblogic-ejb-jar PUBLIC ‘-//BEA Systems, Inc.//DTD WebLogic 5.1.0 EJB//EN‘ ‘http://www./servers/wls510/dtd/weblogic-ejb-jar.dtd‘> <!--EJB部署说明文件--> <weblogic-ejb-jar> <weblogic-enterprise-bean> <!--EJB名--> <ejb-name>MyFirstEJB</ejb-name> <!--定义EJB最大缓冲池--> <caching-descriptor> <max-beans-in-free-pool>100</max-beans-in-free-pool> </caching-descriptor> <!--定义EJB jndi名称--> <jndi-name>HelloHome</jndi-name> </weblogic-enterprise-bean> </weblogic-ejb-jar> 2.2.4 打包 把上面开发的所有文件打成jar文件包。这些文件包括一三个类文件:Hello.class、HelloHome.class、HelloBean.class和部署文件:ejb-jar.xml,weblogic-ejb-jar.xml。打包时,文件放置的位置是严格要求的。具体为:*.class文件放在当前目录(即C:\work\hello\build目录下),部署文件必须入在下一级目录Meta-inf中(即C:\work\hello\build\Meta-inf目录下)。如果EJB包含图像文件,则图像文件必须在build目录的下一级目录images中(即C:\work\hello\build\images目录下)。 具体操作步骤为: (1)在build目录中创建Meta-inf目录,当前路径为C:\work\hello,执行: c:\work\hello>md build\Meta-inf (2)把部署文件拷贝到hello\Meta-inf目录下: c:\work\hello>copy *.xml build\Meta-inf (3)执行: c:\work\hello>md build\images c:\work\hello>copy *.gif build\images 当然,本例中没有使用图像文件,所以可以免去此步骤。 (4)用jar命令在build目录下打包。当前路径是c:\work\hello,运行: c:\work\hello>cd build c:\work\hello\bulid>jar cv0f std_myfirstejb_hello.jar META-INF *.class images c:\work\hello\build>cd.. 其中:jar是Jdk中的打包命令:cv0f是命令参数;std_myfirstejb_hello.jar是生成的文件名,由用户指定。 命令执行完后,在目录build中应该生成文件std_myfirstejb_hello.jar。 至此,打包完成。 2.2.5 编译生成窗口代码 Weblogic Server提供了编译生成容器代码的工具,它是一个java程序weblogic.ejbc。在命令行窗口中执行: c:\work\hello>java weblogic.ejbc -compiler javac build\std_myfirstejb_hello.jar build\myfirstejb_hello.jar 可以看出ejbc把std_myfirstejb_hello.jar文件编译成myfirstejb_hello.jar,它包括了Weblogic Server平台可以识别的ejb容器代码。 如果运行成功,则在build目录下产生myfirstejb_hello.jar文件。 2.3 命令脚本文件 上面在EJB的开发过程中使用命令行的方式,我们可以把有所有这些命令行集中起来做成一个命令脚本文件build.cmd,使用它可以一次性执行这些命令,而不必一个命令一个命令的执行。该文件存放在C:\work\hello目录下,其内容为: md build javac -d build Hello.java HelloHome.java HelloBean.java md build\Meta-inf copy *.xml build\Meta-inf md build\images copy *.gif build\images cd build jar cv0f std_myfirstejb_hello.jar META-INF *.class images cd .. java weblogic.ejbc -compiler javac build\std_myfirstejb_hello.jar build\myfirstejb_hello.jar 这样,在程序代码编辑好的情况下,只运行这个命令脚本程序,就可以完成EJB开发。 2.4 EJB部署 EJB的部署有很多种方法,最简单的一种就是把C:\work\hello\build目录下的myfirstejb_hello.jar文件拷贝到服务器的applications目录下,即C:\bea\wlserver6.0\config\mydomain\applications目录下。如果服务器已经启动,则在拷贝的时候不需要重新启动服务器。服务器会自动检测到新拷贝的EJB。 2.5 EJB运行测试 编写一个简单的客户端程序HelloClient来测试已部署的ejb。 2.5.1 客户端测试程序代码编写 在文本编辑器中编辑HelloClient.java文件,并保存在C:\work\hello目录下,其代码如下: //本类需要引入的类或接口 import java.rmi.RemoteException; import java.util.Properties; import javax.ejb.CreateException; import javax.ejb.RemoveException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; /** * 这是EJB的客户端测试程序 */ public class HelloClient { private static final String JNDI_NAME = "HelloHome"; private String url; private HelloHome home; public HelloClient(String url) throws NamingException { this.url = url; home = lookupHome(); } void test() throws RemoteException,CreateException { Hello hello = (Hello) PortableRemoteObject.narrow(home.create(), Hello.class); System.out.println("I am in client. "+hello.sayHello()); } /** * 运行这个实例: * java HelloClient t3://localhost:7001 */ public static void main(String[] args) throws Exception { System.out.println("\n客户端程序测试开始...\n"); String url = "t3://localhost:7001"; // 解析命令行 if (args.length != 1) { System.out.println("用法: java HelloClient t3://hostnameort"); return; } else { url = args[0]; } HelloClient client = null; try { client = new HelloClient(url); } catch (NamingException ne) { System.exit(1); } try { client.test(); } catch (Exception e) { System.exit(1); } System.out.println("\n客户端程序测试结束...\n"); } /** * 查找 EJB 的主接口 */ private HelloHome lookupHome() throws NamingException { Context ctx = getInitialContext(); Object home = ctx.lookup(JNDI_NAME); return (HelloHome) PortableRemoteObject.narrow(home, HelloHome.class); } /** * 使用属性对象获取上下文 */ private Context getInitialContext() throws NamingException { Properties h = new Properties(); h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); h.put(Context.PROVIDER_URL, url); return new InitialContext(h); } } 2.5.2 客户端测试程序代码编译 请执行以下操作: (1)在hello目录下创建client子上当放置客户端测试程序,创建client目录,拷贝文件。执行: c:\work\hello>md client c:\work\hello>copy HelloClient.java client 注意:因为HelloClient类需引入Hello和HelloHome接口,因此要从build目录下拷贝Hello.class和HelloHome.class文件到client目录。 c:\work\hello>copy build\Hello.class client c:\work\hello>copy build\HelloHome.class client (2)进入client目录 c:\work\hello>cd client (3)编译: c:\work\hello\client>java HelloClient.java 至此客户端测试程序代码编译完毕。 也可以把这些命令做成一个命令脚本文件build_client.cmd,保存在C:\work\hello目录,其代码如下: md client copy HelloClient.java client copy build\Hello.class client copy build\HelloHome.class client cd client javac HelloClient.java 2.5.3 运行测试 运行测试程序,执行如下操作: (1)启动Weblogic Server 6.0的缺省服务器,Weblogic Server的启动是个简单的过程,可以通过开始菜单和直接运行启动命令脚本两种方式,详细情况请参见第1章。 (2)运行测试程序。在命窗口中进入C:\work\hello\client目录,执行: c:\work\hello\client>java HelloClient t3://127.0.0.1:7001 (3)观察运行结果:应该如下: 客户端程序测试开始... I am in client. Hello World 客户端程序测试结束... 而在Weblogic Server的命令行窗口中打印如下信息: I am in an EJB of Server .Hello World 并且每运行一次,这行信息就打印一次。 2.6 常见故障及解决方法 (1)在命令行窗口中运行javac命令出现: "java"不是内部或外部命令,也不是可运行的程序或批处理文件。 原因:javac.exe命令文件所有的路径没有包含在环境变量Path中。 (2)执行javac -d build Hello.java HelloHome.java HelloBean.java 命令时出现编译错误,其中有一条错误是: cannot resolve symbol symbol : class EJBHome location : package ejb impor javax.ebj.EJBHome; 原因:javac.exe命令文件甩在的路径没有被包含在环境变量Path中。 解决方法:运行环境变量脚本命令setEnv.cmd。 (3)运行客户端测试程序时,即运行: java HelloClient t3://127.0.0.1:7001时,出现: Exception in thread "main" java.lang.NoClassFoundError: HelloClient 可能的原因是没有把“.”设置到环境变量classpath中。 (4)执行java weblogic.ejbc... 命令时,抛出org.xml.sax.SAXParseException异常。 原因:xml文件有语法错误 解决办法:进行.xml文件有效性检查。 (5)执行之后仅显示一行文字程序就结束 |
|