1、EJB基础知识
1)EJB的基本类型:
n 无状态会话bean:提供服务时不需要存储方法调用之间的会话状态
n 有状态会话bean:每个实例与一个特定的客户端关联。
n 实体bean:代表的是持久性的数据的一个对象视图。
n 消息驱动bean:JMS与EJB的集成,用于执行服务器实例与JMS源之间的异步工作。
2)EJB主要由三个部分组成:
n 本地或者远程接口
向客户端公开业务逻辑,定义远程可调用的方法。本地接口为运行在相同应用程序的客户端提供服务,bean和远程接口向运行在应用程序之外的远程客户端公开业务逻辑
n 本地或者远程home接口
又称EJB工厂,主要提供方法供客户端调用用于查找创建删除bean的实例。本地home接口与bean为运行在同一个应用程序中的客户端提供服务,远程home接口和bean为运行在不同应用程序中的客户端提供服务。
n Bean类
实现业务逻辑
3)各种bean:
(1)会话bean
无状态会话bean通常用于提供服务,使用无状态会话bean可以使用少量实例来满足大量客户需求。而且每个实例都没有身份,完全等同于其他任何实例。
有状态会话bean代表了会话,但是每一个实例都与特定的客户端关联
(2)实体bean
A)CMP
n EJB容器自动生成代码,把实体bean永久保存在数据库中
n CMP优势:简化,存在实体与bean之间的标准映射,容器可以自动的管理业务对象之间的交互,性能由于BMP
B)BMP
n Bean编写者必须自己编写数据库访问代码,包括使用JDBC对数据库的增删改查操作
n BMP的优势:灵活
(3)消息驱动bean
4)EJB部署(weblogic)
(1)描述文件:a)使用Workshop来生成部署描述文件;b)手动创建描述文件
(2)weblogic server支持三种EJB描述文件:ejb-jar.xml,weblogic-ejb-jar.xml,weblogic-cmp-jar.xml
(3)两种描述文件的对比:ejb-jar.xml与weblogic-ejb-jar.xml
weblogic-ejb-jar.xml
2、EJB编程实例
1)无状态会话bean例子:hello world
//Hello world远程接口
Import java.rmi.RemoteException;
Import javax.ejb.EJBObject;
Public interface HelloWorld extends EJBObject{
Public String helloworld() throws RemoteException;
}
//HelloWorld主接口(home借口),EJB的工厂
//create()方法生成一个到HelloWorld EJB的引用,返回类型是一个
//HelloWorld接口
Import java.rmi.RemoteException;
Import javax.ejb.createException;
Import javax.ejb.EJBHome;
Public class HelloWorld extends EJBHome{
Public Helloword create() throws CreateException,RemoteExcception;
}
//HelloWorldBean EJB类
//实现要通过远程接口公开给客户端的业务逻辑
Import javax.ejb.SessionBean;
Import javax.ejb.SessionContext;
Public class HelloWorldEJB implements SessionBean{
Private SessionContext ctx;
Public void setSessionContext(SessionContext c){
Ctx=c;
}
Public String HelloWorld(){
Return "hello world";
}
Public void EJBCreate(){}
Public vod EJBRemove(){}
Public void EJBActive(){}
Public void ejbPassivate(){}
}
2)简单的EJB客户端
Context ctx=new InitialContext();//创建一个JNDI上下文
Object h=ctx.lookup("HelloWorldEJB");
//使用从服务器返回的对象,生成一个实现home接口的对象
HelloWorldHome home=(HelloWorld)PortableRemoteObject.narrow(h,HelloWorldHome.class);
HelloWorld hw=home.create();
String str=hw.HelloWorld();
3)
3、无状态编程模型
1)无状态会话bean都需要实现javax.ejb.SessionBean接口,这个借口包含了许多容器对无状态会话bean的回调。
2)无状态会话bean的生存周期
4、 Handle
1)定义:一个封装了足够信息以重组EJBObject引用的可序化对象
2)实例:
HelleoWorld hw=home.create();
Handle handle=hw.getHandle();
HelloWorld backAgain
=(HelloWorld)PortableRemoteObject.narrow(handle.getEJBObject(),HelloWorld.class);
3)HomeHandle
(1)描述;HomeHandle与Handle类似,但应用与EJBObject相反,程序需要调用HomeHandle的getHomeHandle()方法返回HomeHandle接口的一个实例。再调用HomeHandle的getEJBHome()重新获得引用。
(2)例子
Context ctx=new InitialContext();
Object h=ctx.lookup("HelloWorldEJB");
HelloWorldHome home
=(HelloWorldHome)PortableRemoteObject.narrow(h,HelloWorldHome.class);
HomeHandle homehandle=home.getHomeHandle();
Object nh=homehandle.getEJBHome();
HelloWorldHome newhome
=(HelloWorldHome)PortableRemoteObject.narrow(nh,HelloWorldHome.class);
(3)Handle的优点
Handle与HomeHandle可以自动保存重构引用所需要的信息。
5、有/无状态会话EJB最佳实践
1)业务编码接口
(1)EJB类实现了远程接口中定义的方法,但是并没有实现远程接口本身。、
(2)EJB类绝不能实现远程接口,否则会导致严重的bug。
(3)远程接口的存在是为了允许容器中途截获方法调用,以便提供如事务或者安全线之类的服务。
(4)Java编译器拒绝尝试把bean类作为一个远程接口类型的参数进行传递。
(5)捕获违背EJB规范的错误方法
a)使用weblogic提供的兼容性检查程序 weblogic.EJBComplianceChecker
b)业务接口模式:将所有业务方法都定义在一个单独的接口里面,远程接口扩展了业务接口和javax.ejb.EJBObject接口,bean可以实现业务接口
//定义单独的业务接口
public interface MyBusinessInterface{
public void businessA() throws RemoteException;
}
public interface MyRemoteException extends MyBusinessInterface,EJBObject{
}
public class MyBean implementsSessionBean,MyBusinessInterface{
public void businessA() throws RemoteException{
....
}
}
通过使用业务接口,编译器可以确保bean实现业务接口中的方法。
2)有状态会话bean
(1)有状态会话bean不能被多个用户共享。
(2)无状态会话bean比有状态的更容易扩展,有状态的会话bean不允许并发的方法调用,多个请求有可能引起有状态会话bean的并发调用。