分享
 
 
 

如何开发会话Bean(无状态会话Bean)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

会话Bean可以分为有状态会话Bean(stateful Bean)和无状态会话Bean(stateless Bean),有状态会话Bean可以在客户访问之间保存数据,而无状态会话Bean不会在客户访问之间保存数据。两者都实现了javax.ejb.sessionBean接口,EJB容器区通过部署文件ejb-jar.xml来判定是否为一个SessionBean提供保存状态的服务,另外,在程序实现上,无状态Bean不能声明实例变量,每个方法只能操作方法传来的参数。实际上,我们第一节中的第一个EJB程序就是一个无状态Session Bean。

在本节中你将了解到:

什么是无状态Session Bean?

无状态Session Bean寿命周期

编写一个无状态Session Bean程序

部署到应用服务器

开发和部署测试程序

运行测试程序

什么是无状态Session Bean?

无状态Session Bean每次调用只对客户提供业务逻辑,但不保存客户端的任何数据状态。但并不意味着stateless类型的Bean没有状态,而是这些状态被保持在客户端,容器不负责治理。如《再别康桥》中写到的"静静的我走了,正如我静静的来。挥一挥衣袖,不带走一片云彩"。

无状态Session Bean在EJB中是最简单的一种Bean,假如数据实际上是数据的瞬像,则建议使用无状态会话Bean。但是无状态会话Bean也有自己的问题,本该存储在服务器端(J2EE服务器)的数据被存储在客户中,每次调用这些数据都要以参数的方式传递给Bean,假如是一个比较复杂的数据集合,则网络需要传递大量数据,造成更多的负载。在客户端维护状态还要注重安全性问题,假如数据状态非常敏感,则不要使用无状态会话Bean,这些情况可以使用状态会话Bean,将用户状态保存到服务器中。

无状态Session Bean寿命周期

无状态Session Bean寿命周期由容器控制,Bean的客户并不实际拥有Bean的直接引用,当我们部署一个EJB时,容器会为这个Bean分配几个实例到组件池(component pooling)中,当客户请求一个Bean时,J2EE服务器将一个预先被实例化的Bean分配出去,在客户的一次会话里,可以只引用一次Bean,就可以执行这个Bean的多个方法。假如又有客户请求同样一个Bean,容器检查池中空闲的Bean(不在方法中或事务中,假如一个客户长时间引用一个Bean但执行一个方法后需要等待一段时间再执行另一个方法,则这段时间也是空闲的),假如全部的实例都已用完则会自动生成一个新的实例放到池中,并分配给请求者。当负载减少时,池会自动治理Bean实例的数量,将多余的实例从池中释放。 无状态Session Bean有两种状态:存在或不存在。

当客户端不存在一个无状态Session Bean时,通过远程主接口的create()方法创建一个Bean,newInstance()负责将Bean实例化,EJB容器调用Bean类的setSessionContext()方法把运行环境对象SessionContext传递给Bean;随后调用Bean的ejbCreate方法进行必要的初始化和资源分配。在下面这个实战例子中,Bean的实现类就是StatelessDateEJB类。

编写一个无状态的Session Bean程序

这个Session Bean组件提供一个日期计算器,通过getDayInRange()方法计算两个日期之间相差的天数,通过getDayForOlympic()得到距离北京申办2008年奥林匹克运动会天数。并且我们为这个Bean起名为StatelessDate

设计一个无状态的Session Bean至少包括四个步骤:

开发主接口

开发组件接口

开发Bean实现类

编写部署文件

注重:本节假设你使用的Windows操作系统。假如使用其他操作系统,可能影响到存储路径和JDK命令,但这与程序代码和部署文件内容无关。

1.开发主接口(StatelessDateHome.java):

是由Bean开发人员编写的一个Bean的主接口(interface)程序,负责控制一个Bean的生命周期(生成、删除、查找Bean)。只需要开发人员给出一个主接口类,类方法的实现由容器来完成。主接口扩展了javax.ejb.EJBHome接口,参考avax.ejb.EJBHome接口定义如下:

package javax.ejb;

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface EJBHome extends Remote{

public abstract EJBMetaData getEJBMetaData() throws RemoteException;

public abstract HomeHandle getHomeHandle() throws RemoteException;

public abstract void remove(Object obj) throws RemoteException,RemoveException;

public abstract void remove(Handle handle) throws RemoteException,RemoveException;

}

方法getEJBMetaData()返回EJBMetaData接口的引用,取得Bean的信息,EJBMetaData不是远程接口。这个类扩展了java.io.Serializable,所以可序列化,具有序列化的特性

方法getHomeHandle()返回主对象的句柄,句柄是主接口StatelessDateHome的持久性引用,这个类扩展了java.io.Serializable,所以可序列化,具有序列化的特性,HomeHandle对象可以传递给另一个JVM,且不传递安全信息,这样新的应用可以不使用JNDI来查找对象既可以获得这个主接口,并来创建和获得Bean实例。

方法remove()用来删除一个Bean的实例,对于一个会话Bean,执行Remove操作将引用的Bean返回到池中,由池来治理其生命周期。

一般情况下,习惯将主接口的命名规则规定为Home,所以我们把这个主接口类起名为StatelessDateHome

大部分逻辑方法已经被EJBHome定义,在我们要设计的远程主接口StatelessDateHome里,不必再重新定义。值得注重的是,我们需要为这个接口定义一个create()方法,用来获得一个实例Bean的引用,返回的对象类型是组件接口类StatelessDate。

StatelessDateHome.java代码:

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EJBHome;

public interface StatelessDateHome extends EJBHome{

public StatelessDate create() throws RemoteException,CreateException;

}

假设我们保存到D:\ejb\StatelessDate\src\StatelessDateHome

.java

2.开发组件接口(StatelessDate.java):

当远程用户调用主接口类生成方法(create())时,客户要得到一个组件的远程引用,因此EJB容器要求你为这个Bean的所有方法提供一个接口类,而类的实现则与远程主接口StatelessDateHome一样由容器在部署时自动生成。

组件接口扩展了avax.ejb.EJBObject接口,参考avax.ejb.EJBObject接口定义如下:

package javax.ejb;

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface EJBObject extends Remote{

public abstract EJBHome getEJBHome() throws RemoteException;

public abstract Handle getHandle() throws RemoteException;

public abstract Object getPRimaryKey() throws RemoteException;

public abstract boolean isIdentical(EJBObject ejbobject) throws RemoteException;

public abstract void remove() throws RemoteException,RemoveException;

}

方法getEJBHome()返回远程主接口对象的引用

方法getHandle() 当前组件接口对象的句柄,和远程主接口的句柄HomeHandle一样,这个对象是被序列化的,所以可以保存到本地或通过RMI/IIOP协议传输给其他JVM上的客户使用,而免去JNDI查找和调用主接口的create方法,只要执行Handle.getEJBObject()方法即可取得这个Bean实例的引用。

getPrimaryKey()方法一般用于Entity Bean,假如在Session Bean中调用,抛出java.rmi.RemoteException。

方法isIdentical()用于对当前引用的Bean实例和另一Bean实例进行比较,因为即便是Bean实例相同但有可能不是来自同一个引用,不能使用equals()方法。

方法remove() 删除当前引用的Bean实例,由容器来决定是否真的释放气内存,通常会返换到组件池中。注重删除之后要将对象的引用指向为null。

一般情况下,习惯将组件接口的命名规则规定为,所以我们把这个组件接口类起名为StatelessDate

大部分逻辑方法已经被EJBObject 定义,在我们要设计的组件接口StatelessDate里,不必再重新定义,只要我们重申组件中有关业务逻辑的接口即可。逻辑方法getDayInRange()得到两个日期间的天数间隔,假如输入的时间非法或不合适将抛出InsufficientDateException异常。逻辑方法getDayForOlympic()得到距离北京申办奥运会的天数,假如输入的时间非法或不合适将抛出InsufficientDateException异常。

StatelessDate.java代码:

import javax.ejb.EJBObject;

import java.rmi.RemoteException;

import java.util.Date;

public interface StatelessDate extends EJBObject{

public int getDayInRange(Date lowerLimitDate,Date upperLimitDate)

throws RemoteException,InsufficientDateException;

public int getDayForOlympic()

throws RemoteException,InsufficientDateException;

}

假设我们保存到D:\ejb\St

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有