您的位置:首页 > 其它

一个简单的EJB例子!!

2007-05-21 15:18 405 查看
声明:这个Converter的例子应该是J2EE 1.4 Tutorial上面的。不过那上面都是用NetBeans开发的。让人知其然,不知所以然。同时本文参考了网上的一些资料。算不上原创,只能说是把别人的东西拿来总结了一下。

1、 开发环境:Windows XP SP2,WTP1.02,JBoss4.02,JDK1.5.05
2、 在WTP中新建一个EJB Projcet:ejb_demo,然后加入一个EJB模块所需要的文件: Remote(or Local) Interface、Remote(or Local) Home Interface、Bean class。本例子中依次为:Converter.java、ConverterHome.java、ConverterEJB.java。源代码见后面。
Ø Converter.java Remote Interface
Ø ConverterHome.java Remote Home Interface
Ø ConverterEJB.java Bean class
代码如下:

[align=left]代码1:Converter.java[/align]
[align=left]// Converter.java -- Remote Interface.[/align]
[align=left]// 2006-10-13 12:46[/align]
[align=left] [/align]
[align=left]import java.rmi.RemoteException;[/align]
[align=left]import javax.ejb.*;[/align]
[align=left] [/align]
[align=left]public interface Converter extends EJBObject {[/align]
[align=left] public double dollarToYen(double dollars) throws RemoteException;[/align]
[align=left] public double yenToEuro(double yen) throws RemoteException;[/align]
[align=left] [/align]
[align=left] // Simple example.[/align]
[align=left] public String helloEcho(String word) throws RemoteException;[/align]
[align=left]}[/align]

[align=left]代码2:ConverterHome.java[/align]
[align=left]// ConverterHome.java -- Remote Home Interface.[/align]
[align=left]// 2006-10-13 12:50[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]import java.rmi.RemoteException;[/align]
[align=left] [/align]
[align=left]import javax.ejb.CreateException;[/align]
[align=left]import javax.ejb.EJBHome;[/align]
[align=left] [/align]
[align=left]public interface ConverterHome extends EJBHome {[/align]
[align=left] Converter create() throws CreateException, RemoteException;[/align]
[align=left]}[/align]

[align=left]代码3:ConverterEJB.java[/align]
[align=left]// ConverterEJB.java -- Bean class.[/align]
[align=left]// 2006-10-13 12:54[/align]
[align=left] [/align]
[align=left]import java.rmi.RemoteException;[/align]
[align=left]import javax.ejb.*;[/align]
[align=left] [/align]
[align=left]public class ConverterEJB implements SessionBean {[/align]
[align=left] [/align]
[align=left] private static final long serialVersionUID = 1L;[/align]
[align=left] [/align]
[align=left] public double dollarToYen(double dollars) {[/align]
[align=left] return dollars * 121.6000;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public double yenToEuro(double yen) {[/align]
[align=left] return yen * 0.0077;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public String helloEcho(String word) {[/align]
[align=left] System.out.println("Someone called 'Hello Echo Successed!'");[/align]
[align=left] return "*********" + word + "*********";[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void ejbCreate() {[/align]
[align=left] System.out.println("Ejb 4 is creating!...");[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void ejbPostCreate() {[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void ejbActivate() throws EJBException, RemoteException {[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void ejbPassivate() throws EJBException, RemoteException { [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void ejbRemove() throws EJBException, RemoteException {[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void setSessionContext(SessionContext arg0) throws EJBException,[/align]
[align=left] RemoteException { [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]

3、 在项目的META-INF目录中,确保有两个文件:ejb-jar.xml和jboss.xml。前者应该已经自动生成了,后者要自己手动添加。内容如下:
u ejb-jar.xml文件内容:

[align=left]代码4:ejb-jar.xml[/align]
[align=left]<?xml version="1.0" encoding="UTF-8"?>[/align]
[align=left]<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" [/align]
[align=left]xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" [/align]
[align=left]version="2.1" [/align]
[align=left]xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">[/align] [align=left] <display-name>ConverJAR</display-name>[/align]
[align=left] <enterprise-beans>[/align]
[align=left] <session>[/align]
[align=left] <display-name>ConverterEJB</display-name>[/align]
[align=left] <ejb-name>ConverterEJB</ejb-name>[/align]
[align=left] <home>ConverterHome</home>[/align]
[align=left] <remote>Converter</remote>[/align]
[align=left] <ejb-class>ConverterEJB</ejb-class>[/align]
[align=left] <session-type>Stateless</session-type>[/align]
[align=left] <transaction-type>Bean</transaction-type>[/align]
[align=left] <security-identity>[/align]
[align=left] <use-caller-identity/>[/align]
[align=left] </security-identity>[/align]
[align=left] </session>[/align]
[align=left] </enterprise-beans>[/align]
[align=left]</ejb-jar>[/align]

u jboss.xml文件内容:

[align=left]代码4:jboss.xml[/align]
[align=left]<?xml version="1.0" encoding="UTF-8"?>[/align]
[align=left]<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">[/align]
[align=left]<jboss>[/align]
[align=left] <enterprise-beans>[/align]
[align=left] <session>[/align]
[align=left] <ejb-name>ConverterEJB</ejb-name>[/align]
[align=left] <jndi-name>MyConverter</jndi-name>[/align]
[align=left] </session>[/align]
[align=left] </enterprise-beans>[/align]
[align=left]</jboss>[/align]

请注意文件中的<jndi-name>MyConverter</jndi-name>元素,用到了JNDI绑定,在客户程序中将使用到它。
4、 因为用到了JNDI绑定,因此一旦发布到服务器上,你还需要一个jndi.properties文件,以告诉调用你程序的客户端请求到哪里去初始化JNDI naming service。文件内容如下,注意前面以#号开头的是注释。该文件和你的类文件放在同一目录下,即项目的build/classes目录下。

[align=left]代码5:jndi.properties[/align]
[align=left]# jndi.properties -- [/align]
[align=left]# [/align]
[align=left]java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory[/align]
[align=left]java.naming.provider.url=localhost:1099[/align]
[align=left]java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces[/align]

5、 最终的目录结构如下所示:



最终build/classes目录包含三个源文件的class文件、jndi.properties文件和一个META-INF目录,META-INF目录下包含:ejb-jar.xml和jboss.xml两个文件。
6、 将EJB项目打包成jar文件。控制台到的build/classes目录下,执行:jar cvf Converter.jar .即将该项目打包成Converter.jar。注意命令后面的点,表示将当前目录打包。
7、 将Converter.jar复制到<JBoss-install>/server/default/deploy目录,起动JBoss Server(起动类型默认为Default)。控制台会输出相应提示,如下图所示:



8、 编写客户端,这里是一个Java应用程序。我这里新建了一个Java Project:ejb_client。因为要用到前面的相关类,所以把Converter.jar文件添加到ejb_client项目的Build path中,同时把j2ee.jar也添加进来,客户端就只有一个类:ConverterClient.java,如下所示:

[align=left]代码6:ConverterClient.java[/align]
[align=left]// ConverterClient.java -- A client class use ConverEJB in project ejb_demo.[/align]
[align=left]// 2006-10-13 13:15[/align]
[align=left] [/align]
[align=left]import javax.naming.*;[/align]
[align=left]import javax.rmi.PortableRemoteObject;[/align]
[align=left] [/align]
[align=left]public class ConverterClient {[/align]
[align=left] [/align]
[align=left] public static void main(String[] args) {[/align]
[align=left] try {[/align]
[align=left] // 创建一个JNDI naming contest[/align]
[align=left] Context initial = new InitialContext();[/align]
[align=left] [/align]
[align=left] // 从JNDI 中以MyConverter 名子来定位到对象(在发布名称指定了JNDI名称)[/align]
[align=left]// Object objref = initial.lookup("java:comp/env/ejb/ConverterEJB");[/align]
[align=left] Object objref = initial.lookup("MyConverter");[/align]
[align=left] [/align]
[align=left] // 通过objref 得到ConverterHome 本地接口[/align]
[align=left] ConverterHome home = (ConverterHome)PortableRemoteObject.narrow([/align]
[align=left] objref, ConverterHome.class);[/align]
[align=left] [/align]
[align=left] // 再由Home 接口的create 方法来创建一个服务器上的EJB实例[/align]
[align=left] Converter currencyConverter = home.create();[/align]
[align=left] [/align]
[align=left] // 调用EJB 中的方法[/align]
[align=left] double amount = currencyConverter.dollarToYen(100.00);[/align]
[align=left] System.out.println(String.valueOf(amount));[/align]
[align=left] amount = currencyConverter.yenToEuro(100.00);[/align]
[align=left] System.out.println(String.valueOf(amount));[/align]
[align=left] System.out.println(currencyConverter.helloEcho("Hello, EJB!"));[/align]
[align=left] }[/align]
[align=left] catch(Exception ex) {[/align]
[align=left] System.err.println("Caught an unexpected exception!");[/align]
[align=left] ex.printStackTrace();[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]

应该通过编译了,运行一下,怎么回事?有异常产生:

[align=left]Caught an unexpected exception![/align]
[align=left]javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory][/align]
[align=left] at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)[/align]
[align=left] at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)[/align]
[align=left] at javax.naming.InitialContext.init(Unknown Source)[/align]
[align=left] at javax.naming.InitialContext.<init>(Unknown Source)[/align]
[align=left] at ConverterClient.main(ConverterClient.java:12)[/align]
[align=left]……[/align]

解决方法:把<JBoss-install>/client目录下的:jbossall-client.jar和jnp-client.jar添加到Build path中,再运行,这时候总算输出正确结果了。
ejb-client项目的目录结构如下:



9、 当然也可以直接编写一个客户端程序,注意把相关的jar添加进来编译和运行即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: