胡德平 编译(hudeping@263.net www.
JavaUnion.org)
会话组件在
J2EE服务器中表现为一个客户端,该客户端通过调用会话组件方法获取远程服务。会话组件为其客户端完成指定任务,屏蔽了客户端需要在服务器端执行商业任务的复杂性。
正如其名所暗示,会话组件工作原理类似于交互会话。会话组件是不共享得--它在会话期间只能与一个客户端交互、一个用户交互。和交互会话一样,会话组件没有持续,当客户端中断会话后会话组将也将中断并不再与客户端相关联。
会话组件是非常有用而强大的,因为它将你的客户端范围扩展到了远程服务器--并且它们容易开发。本文将通过简单示例,为你展示如何编写、编译和部署一个简单的会话组件。
会话组件示例
本文所举例子是一个在线书店中关于购物车的演示,组件的客户端需要实现往购物车增加、删除、查询等操作功能。为了实现这个例子,你需要完成下面程序的编码:
·会话组件类(Cart
EJB.java)
·本地接口(CartHome.java)
·远程接口(Cart.java)
上述三个文件在所有企业组件(EJB)
编程中都是必须的,为了满足特定应用更多需求,企业组件可能需要更多的帮助类(helper class)。CartEJB会话组件使用了两个帮助类,即 BookException.java和IdVerifier.java。
如果你安装了J2EE,上述源码文件可以在doc/guides/ejb/examples/cart目录中找到。
会话组件类
本例子中会话组件类命名为CartEJB.,与其它所有的会话组件一样, CartEJB 类必须满足以下要求:
·实现SessionBean 接口
·类定义为公共类(public)
·类不能是抽象类或终极类
·实现一个或多个ejbCreate方法
·实现商业方法
·有无参数的构造方法
·必须没有终极方法(finalize method)
CartEJB源码如下:
import java.util.*; import javax.ejb.*;
public class CartEJB implements SessionBean {
String customerName; String customerId; Vector contents;
public void ejbCreate(String person) throws CreateException {
if (person == null) { throw new CreateException("Null person not allowed."); } else { customerName = person; }
customerId = "0"; contents = new Vector(); }
public void ejbCreate(String person, String id) throws CreateException {
if (person == null) { throw new CreateException("Null person not allowed."); } else { customerName = person; }
IdVerifier idChecker = new IdVerifier(); if (idChecker.validate(id)) { customerId = id; } else { throw new CreateException("Invalid id: " + id); }
contents = new Vector(); }
public void addBook(String title) {
contents.addElement(title); }
public void removeBook(String title) throws BookException {
boolean result = contents.removeElement(title); if (result == false) { throw new BookException(title + " not in cart."); } }
public Vector getContents() { return contents; }
public CartEJB() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {}
}
|
会话组件接口(SessionBean)
会话组件接口SessionBean继承EnterpriseBean 接口,而后者继承了Serializable 接口。SessionBean 接口定义了ejbRemove, ejbActivate, ejbPassivate 和setSessionContext 方法。CartEJB 类没有用到这些类,但必须实现它们否则应该定义成抽象类。因此,这些方法在CartEJB类中被声明为空方法,随后的内容中将就这些方法何时有什么用途进行说明。
EjbCreate方法
由于企业组件运行在EJB容器中,所以客户端无法直接示例化这些组件。只有EJB容器可以示例化企业组件,在本文所述例子中完成实例化需要实现以下步骤:
9
7
3
1
2
3
4
4
8
: