会话组件(Session Beans)
来源:网络 更新时间:2014-12-11
胡德平编译(hudeping@263.netwww.JavaUnion.org)
会话组件在J2EE服务器中表现为一个客户端,该客户端通过调用会话组件方法获取远程服务。会话组件为其客户端完成指定任务,屏蔽了客户端需要在服务器端执行商业任务的复杂性。
正如其名所暗示,会话组件工作原理类似于交互会话。会话组件是不共享得--它在会话期间只能与一个客户端交互、一个用户交互。和交互会话一样,会话组件没有持续,当客户端中断会话后会话组将也将中断并不再与客户端相关联。
会话组件是非常有用而强大的,因为它将你的客户端范围扩展到了远程服务器--并且它们容易开发。本文将通过简单示例,为你展示如何编写、编译和部署一个简单的会话组件。
会话组件示例
本文所举例子是一个在线书店中关于购物车的演示,组件的客户端需要实现往购物车增加、删除、查询等操作功能。为了实现这个例子,你需要完成下面程序的编码:
·会话组件类(CartEJB.java)
·本地接口(CartHome.java)
·远程接口(Cart.java)
上述三个文件在所有企业组件(EJB)编程中都是必须的,为了满足特定应用更多需求,企业组件可能需要更多的帮助类(helperclass)。CartEJB会话组件使用了两个帮助类,即BookException.java和IdVerifier.java。
如果你安装了J2EE,上述源码文件可以在doc/guides/ejb/examples/cart目录中找到。
会话组件类
本例子中会话组件类命名为CartEJB.,与其它所有的会话组件一样,CartEJB类必须满足以下要求:
·实现SessionBean接口
·类定义为公共类(public)
·类不能是抽象类或终极类
·实现一个或多个ejbCreate方法
·实现商业方法
·有无参数的构造方法
·必须没有终极方法(finalizemethod)
CartEJB源码如下:
importjava.util.*;
importjavax.ejb.*;
publicclassCartEJBimplementsSessionBean{
StringcustomerName;
StringcustomerId;
Vectorcontents;
publicvoidejbCreate(Stringperson)throwsCreateException{
if(person==null){
thrownewCreateException("Nullpersonnotallowed.");
}
else{
customerName=person;
}
customerId="0";
contents=newVector();
}
publicvoidejbCreate(Stringperson,Stringid)
throwsCreateException{
if(person==null){
thrownewCreateException("Nullpersonnotallowed.");
}
else{
customerName=person;
}
IdVerifieridChecker=newIdVerifier();
if(idChecker.validate(id)){
customerId=id;
}
else{
thrownewCreateException("Invalidid:" id);
}
contents=newVector();
}
publicvoidaddBook(Stringtitle){
contents.addElement(title);
}
publicvoidremoveBook(Stringtitle)throwsBookException{
booleanresult=contents.removeElement(title);
if(result==false){
thrownewBookException(title "notincart.");
}
}
publicVectorgetContents(){
returncontents;
}
publicCartEJB(){}
publicvoidejbRemove(){}
publicvoidejbActivate(){}
publicvoidejbPassivate(){}
publicvoidsetSessionContext(SessionContextsc){}
}
会话组件接口(SessionBean)
会话组件接口SessionBean继承EntERPriseBean接口,而后者继承了Serializable接口。SessionBean接口定义了ejbRemove,ejbActivate,ejbPassivate和setSessionContext方法。CartEJB类没有用到这些类,但必须实现它们否则应该定义成抽象类。因此,这些方法在CartEJB类中被声明为空方法,随后的内容中将就这些方法何时有什么用途进行说明。