一个简单的EJB例子!!

EJB入门例子
文件创建日期:2006-10-13 14:48
作者:ALin
声明:这个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
代码如下:
代码 1 Converter.java
// Converter.java -- Remote Interface.
// 2006-10-13 12:46
 
import java.rmi.RemoteException;
import javax.ejb.*;
 
public interface Converter extends EJBObject {
   public double dollarToYen(double dollars) throws RemoteException;
   public double yenToEuro(double yen) throws RemoteException;
  
   // Simple example.
   public String helloEcho(String word) throws RemoteException;
}
 
代码 2 ConverterHome.java
// ConverterHome.java -- Remote Home Interface.
// 2006-10-13 12:50
 
 
import java.rmi.RemoteException;
 
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
 
public interface ConverterHome extends EJBHome {
   Converter create() throws CreateException, RemoteException;
}
 
代码 3 ConverterEJB.java
// ConverterEJB.java -- Bean class.
// 2006-10-13 12:54
 
import java.rmi.RemoteException;
import javax.ejb.*;
 
public class ConverterEJB implements SessionBean {
 
   private static final long serialVersionUID = 1L;
  
   public double dollarToYen(double dollars) {
       return dollars * 121.6000;
   }
 
   public double yenToEuro(double yen) {
       return yen * 0.0077;
   }
  
   public String helloEcho(String word) {
       System.out.println("Someone called 'Hello Echo Successed!'");
       return "*********" + word + "*********";
   }
  
   public void ejbCreate() {
       System.out.println("Ejb 4 is creating!...");
   }
  
   public void ejbPostCreate() {
   }
  
   public void ejbActivate() throws EJBException, RemoteException {
   }
 
   public void ejbPassivate() throws EJBException, RemoteException {      
   }
 
   public void ejbRemove() throws EJBException, RemoteException {
   }
 
   public void setSessionContext(SessionContext arg0) throws EJBException,
   RemoteException {      
   }
 
}
 
3、  在项目的META-INF目录中,确保有两个文件:ejb-jar.xml和jboss.xml。前者应该已经自动生成了,后者要自己手动添加。内容如下:
u       ejb-jar.xml文件内容:
代码 4 ejb-jar.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.1"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
 ConverJAR
 
   
      ConverterEJB
      ConverterEJB
      ConverterHome
      Converter
      ConverterEJB
      Stateless
      Bean
     
       
     
   
 
 
u       jboss.xml文件内容:
代码 4 jboss.xml
  
      
           ConverterEJB
           MyConverter
      
  
 
请注意文件中的 MyConverter元素,用到了JNDI绑定,在客户程序中将使用到它。
4、  因为用到了JNDI绑定,因此一旦发布到服务器上,你还需要一个jndi.properties文件,以告诉调用你程序的客户端请求到哪里去初始化JNDI naming service。文件内容如下,注意前面以#号开头的是注释。该文件和你的类文件放在同一目录下,即项目的build/classes目录下。
代码 5 jndi.properties
# jndi.properties --
#
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
 
 
 
 
5、  最终的目录结构如下所示:
  一个简单的EJB例子!!_第1张图片
最终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复制到/server/default/deploy目录,起动JBoss Server(起动类型默认为Default)。控制台会输出相应提示,如下图所示:
      
8、  编写客户端,这里是一个Java应用程序。我这里新建了一个Java Project:ejb_client。因为要用到前面的相关类,所以把Converter.jar文件添加到ejb_client项目的Build path中,同时把j2ee.jar也添加进来,客户端就只有一个类:ConverterClient.java,如下所示:
代码 6 ConverterClient.java
// ConverterClient.java -- A client class use ConverEJB in project ejb_demo.
// 2006-10-13 13:15
 
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
 
public class ConverterClient {
  
   public static void main(String[] args) {
       try {
           // 创建一个 JNDI naming contest
           Context initial = new InitialContext();
          
           // JNDI 中以 MyConverter 名子来定位到对象 ( 在发布名称指定了 JNDI 名称 )
//         Object objref = initial.lookup("java:comp/env/ejb/ConverterEJB");
           Object objref = initial.lookup("MyConverter");
          
           // 通过 objref 得到 ConverterHome 本地接口
           ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(
                   objref, ConverterHome.class);
          
           // 再由 Home 接口的 create 方法来创建一个服务器上的 EJB 实例
           Converter currencyConverter = home.create();
          
           // 调用 EJB 中的方法
           double amount = currencyConverter.dollarToYen(100.00);
           System.out.println(String.valueOf(amount));
           amount = currencyConverter.yenToEuro(100.00);
           System.out.println(String.valueOf(amount));
           System.out.println(currencyConverter.helloEcho("Hello, EJB!"));
       }
       catch(Exception ex) {
           System.err.println("Caught an unexpected exception!");
           ex.printStackTrace();
       }
   }
}
 
应该通过编译了,运行一下,怎么回事?有异常产生:
Caught an unexpected exception!
javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
   at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
   at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
   at javax.naming.InitialContext.init(Unknown Source)
   at javax.naming.InitialContext.(Unknown Source)
   at ConverterClient.main(ConverterClient.java:12)
……
 
解决方法:把/client目录下的:jbossall-client.jar和jnp-client.jar添加到Build path中,再运行,这时候总算输出正确结果了。
ejb-client项目的目录结构如下:
一个简单的EJB例子!!_第2张图片
9、  当然也可以直接编写一个客户端程序,注意把相关的jar添加进来编译和运行即可。
 

你可能感兴趣的:(EJB)