EJB学习笔记一_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3472 | 回复: 0   主题: EJB学习笔记一        下一篇 
lynda
注册用户
等级:上尉
经验:570
发帖:49
精华:0
注册:2012-8-7
状态:离线
发送短消息息给lynda 加好友    发送短消息息给lynda 发消息
发表于: IP:您无权察看 2012-8-7 16:54:54 | [全部帖] [楼主帖] 楼主

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的并发调用。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论