•客户通过由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.classCalculatorHome.classCalculatorEJB.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