•客户通过由EJB容器提供的远程和本地接口进行通信  
•   访问控制表是用于保证安全其授权能访问特定功能的用户组或个人表。  
•   持久性是指对象状态永久地存储在数据存储器中,诸如数据库。  
•   企业 beans的类型:  
–实体 (Entity) beans  
实体beans支持多个会话和多个客户,可分为:  
         Bean -        管理Bean持久性  
        Container- 管理容器的持久性  
–会话  ( Session) beans  
      会话beans 执行业务任务时没有存储机制,可分为:  
             有状态会话(Stateful session) bean  
       无状态会话( Stateless session) bean  
  
 本例以我所学的内容为例:   Earnest  bank 要求开发一个美元和卢比转换的计算器构件。 说明使用EJB来创建此构件是有道理的并说明必须写的代码。 
 一.  识别机制 二.  确定企业 bean 的类型 三.  编写远程接口代码 四.  编写本地接口代码 五.  编写企业 bean 类代码 六.  编译源文件 
一.  识别机制 EJB 是合适的技术,因为:     EJB 构件自动处理系统级服务     企业 bean 只实现业务逻辑 
二.  确定企业 bean 的类型   银行应用的计算器构件不要求持久的存储机制   货币的等值转换,这种值不在其他地方使用 因此,最适合于创建无状态的会话 bean   
三.  编写远程接口代码 远程接口定义企业bean的所有业务方法,不包括系统级的操作方法。 这些业务方法在EJB类中实现。 
写远程接口的步骤: 需要   javax.ejb.EJBObject   和 java.rmi.RemoteException   接口    建立由扩展EJBObject 接口的远程接口    在 EJB 类中实现所有在远程接口定义的业务方法。          根据本问题的陈述,可写出如下远程接口程序: import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface Calculator  extends  EJBObject  { public  double  dollarToRs(double dollars)                                                  throws   RemoteException; } 四.  编写本地接口代码 本地接口代码定义了允许EJB 客户建立且查找EJB构件的方法。 编写本地接口的步骤如下:    需要java.io.Serializable、java.rmi.RemoteException、 javax.ejb.CreateException、javax.ejb.EJBHome 接口    建立由扩展EJBHome 接口的本地接口    定义 create() 方法去建立特定的 EJB 类的一个实例,该方法的返回类型必须是EJB的远程接口对象。   import   java.io.Serializable; import   java.rmi.RemoteException; import  javax.ejb.CreateException; import   javax.ejb.EJBHome; public  interface  CalculatorHome  extends  EJBHome {  Calculator   create()   throws   RemoteException, CreateException;   } 
五.  编写企业 bean 类代码 实现所有在远程接口中说明的业务方法。编写EJB类的步骤:     需要java.rmi.RemoteException、javax.ejb.SessionBean、javax.ejb.SessionContext 接口     建立 EJB 类实现  SessionBean  接口     实现在远程接口中定义的业务方法。     编写 ejbCreate()、 ejbRemove()、 ejbActivate()、 ejbPassivate()、 setSessionContext()和对缺省的构造器方法的实现。 注意:EJB类中实现的方法名及其特征必须和远程方法中声明的相一致。   根据问题的陈述和前边的描述,可创建以下EJB代码程序。 
EJB代码 import  java.rmi.RemoteException;  import  javax.ejb.SessionBean; import  javax.ejb.SessionContext; public  class  CalculatorEJB   implements  SessionBean {   public double  dollarToRs(double dollars)        {   return  dollars * 47.20;   }      public CalculatorEJB()  {}      public void ejbCreate()  {}      public void ejbRemove()  {}      public void ejbActivate()  {}      public void ejbPassivate()  {}      public void setSessionContext(SessionContext sc) {} } 六.   编译源文件 
 以下为原代码 远程接口程序: /* @InberGong Date 2004/9/8 File name:Calculator.java */ 
import javax.ejb.EJBObject; import java.rmi.RemoteException; 
 public interface Calculator extends EJBObject {   public double dollarToRs(double dollars)throws RemoteException;    public double rsToDollar(double rs)throws RemoteException;       public double rmbToDollar(double rmb)throws RemoteException;          public double dollarToRMB(double dollars)throws RemoteException; } 本地接口程序如下: /* @InberGong Date 2004/9/8 File name:CalculatorHome.java */ 
import java.io.*; import java.rmi.*; import javax.ejb.*; 
 public interface CalculatorHome extends EJBHome {    Calculator create()throws CreateException,RemoteException; } 企业 bean 类代码 
/* @InberGong Date 2004/9/8 File name:CalculatorEJB.java */ import java.rmi.*; import javax.ejb.*; 
public class CalculatorEJB implements SessionBean { 
   public double dollarToRs(double dollars)throws RemoteException    {        return dollars*47.20;    } 
    public double rsToDollar(double rs)throws RemoteException    {     return rs/47.20;     }       public double rmbToDollar(double rmb)throws RemoteException   {     return rmb/9;     }          public double dollarToRMB(double dollars)throws RemoteException             {     return dollars*9;     } 
   public void ejbCreate()throws CreateException,RemoteException    {         System.out.println("ejbCreate()");     }    public CalculatorEJB()    {        System.out.println("CalculatorEJB()");    }     public void setSessionContext(SessionContext sc)    {         System.out.println("setSessionContext()");     }     public void ejbRemove()    {         System.out.println("ejbRemove()");     }     public void ejbActivate(){}     public void ejbPassivate(){}      
 } 
最后是客户端程序 /* @InberGong Date 2004/9/8 File name:CalculatorClient.java */ 
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.naming.*; import javax.rmi.*; 
public class CalculatorClient extends JFrame {   public static int w=500;   public static int h=95;   public static String str="Earnest Bank Welcomes You";   Container c;   JLabel l,result;   JTextField t;   JButton b;   public static String value;   public static double dbl;   public static double amt;   public CalculatorClient()   {     super(str);     c = getContentPane();     c.setLayout(new GridLayout(2,2,2,2));     l = new JLabel("Enter the amount in Dollars($)");     c.add(l);     t = new JTextField(10);     c.add(t);     b = new JButton("Calculate");     c.add(b);     result = new JLabel();     c.add(result);     b.addActionListener(new addEvent());         setSize(w,h);     show();   }   class addEvent implements ActionListener   {     public void actionPerformed(ActionEvent e)     {       value = t.getText();       dbl = Double.parseDouble(value);       try{  Context ic = new InitialContext();         Object obj = ic.lookup("CalculatorJNDI");//JNDI  name         CalculatorHome home = (CalculatorHome)PortableRemoteObject.narrow(obj,CalculatorHome.class);         Calculator calc = home.create();         amt = calc.dollarToRs(dbl);         calc.remove();                  Calculator calc2=home.create();         if(calc2.isIdentical(calc))         {          System.out.println("两个桩实例指向同一个远程HOME实例!");          }         else {         System.out.println("没有指向同一个远程HOME实例!"); }               result.setText("Result(RS.)" + String.valueOf(amt));                         }       catch(Exception t)       {  System.out.println(t);       }     }   }   public static void main(String args[])   {      new CalculatorClient();    } 
} 
开始配置 这里用的是j2ee1.3 
运行j2ee start j2ee -verbose 
deploytool 
new->application applicaton file name: E:\public_html\public_java\ap2\ap2.ear applicaton disply name: ap2.ear new->Eterprise Bean Contents 里面加入 Calculator.class CalculatorHome.class CalculatorEJB.class 三个文件 ->NEXT 出现下对话框:New Enterprise Bean Wizard -General 在Bean Type中选择Session ->Stateless 在Enterprise Bean Calss中选择CalculatorEJB 在本地接口中选择CalculatorHome 在Remote Interface中选择Calculator ->NEXT->NEXT->NEXT->NEXT->NEXT->NEXT->NEXT->Finish 点左视窗中的应用ap2后 ->Tools->Deploy..->选中复框Return Client Jar ->NEXT 出现 Deploy ap2 -JNDI Names对话框 在Application 的JNDI Name中输入客户端程序中要查找的JNDI名:CalculatorJNDI  ->NEXT->Finished........->ok 
在 dos窗口中进入到程序的根目录加入jar 包 set classpath=%classpath%;ap2Client.jar java CalculatorClient 
 
  
 
  |