技术开发 频道

会话组件(Session Beans)


EjbCreate方法

  由于企业组件运行在EJB容器中,所以客户端无法直接示例化这些组件。只有EJB容器可以示例化企业组件,在本文所述例子中完成实例化需要实现以下步骤:
 
1. 客户端调用本地接口的create方法:Cart shoppingCart = home.create("Duke DeEarl","123");
2. EJB容器实例化企业组件。

3. EJB容器调用CartEJB中对应的ejbCreate方法:

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(); }
  典型的, ejbCreate 创建方法初始化企业组件的状态。前面所提到的ejbCreate方法,如通过create方法传递参数初始化客户名( customerName )和客户ID( customerId )变量。
 
  企业组件可以有一个或多个ejbCreate 方法,方法的命名必须满足下面需求:
 
·访问控制修饰词必须是public.
·返回值必须是void.
·参数必须是Java RMI的合法类型
·修饰词(modifier)不能是static或final.
 
  此外,异常抛出必须包括javax.ejb.CreateException 和其它你应用中指定需要抛出的异常。如果输入的参数无效,ejbCreate 方法通常抛出CreateException 异常。
 
商业方法
 
  会话组件的最根本的用法是实现客户端所需要的商业任务,客户端通过create方法返回的参考调用远程对象的商业方法。从客户端角度看,商业方法是在本地运行的,但实际上是在远程会话组件中运行,下面的代码摘录描述了CartClient程序中对商业方法的调用过程:
Cart shoppingCart = home.create("Duke DeEarl", "123"); . . . shoppingCart.addBook("The Martian Chronicles"); shoppingCart.removeBook("Alice In Wonderland"); bookList = shoppingCart.getContents(); public void addBook(String title) { contents.addElement(new String(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; }
商业逻辑的用法必须符合下面的规则:
 
·方法名不能与EJB体系结构规范中定义的有冲突,如不能命名为ejbCreate、ejbActive等
·访问控制修饰符必须是public
·参数类型必须是合法的Java RMI类型
·修饰词不能为static或final
 
  方法抛出异常语句可能包括为具体应用而定义的异常,如当书不在购物车中时removeBook方法抛出BookException 异常。
 
  为了指出如无法连接数据库这样的系统级错误,商业方法需要抛出javax.ejb.EJBException 异常。当商业方法抛出EJBException时,EJB容器将其包装成客户端捕获得RemoteException 异常。对于应用定义的异常BookException,容器是不会对其进行包装的,因为EJBException 是RuntimeException 异常的子类。
 
本地接口
 
本地接口继承EJBHome接口,主要用于定义客户端调度的create方法,如CartClient调用create方法:
Cart shoppingCart = home.create("Duke DeEarl", "123");
在本地接口中每个create 方法与组件类的一个ejbCreate 方法相对应,在CartEJB类中的ejbCreate方法的用法如下:
public void ejbCreate(String person) throws CreateException . . . public void ejbCreate(String person, String id) throws CreateException
比较一下ejbCreate 与CartHome中create 方法的用法:
import java.io.Serializable; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; public interface CartHome extends EJBHome { Cart create(String person) throws RemoteException, CreateException; Cart create(String person, String id) throws RemoteException, CreateException; }
  ejbCreate与 create 方法的用法类似,当在重要的方面是不一致的,本地接口中create方法的使用原则定义如下:
 
·create方法的参数数量和类型必须与所定义的ejbCreate 方法一致
·create方法参数和返回类型必须是合法的RMI类型
·create 方法企业组件远程接口类型(而djbCreate方法返回空)
·create方法异常抛出语句必须包括java.rmi.RemoteException和javax.ejb.CreateException
 
远程接口
 
  远程接口继承于javax.ejb.EJBObject, 定义了客户端可以调用的商业方法,下面是购物车的远程接口代码:
import java.util.*; import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface Cart extends EJBObject { public void addBook(String title) throws RemoteException; public void removeBook(String title) throws BookException, RemoteException; public Vector getContents() throws RemoteException; }
  远程接口定义方法必须遵循下述原则:
 
·每个在远程接口中定义的方法必须与企业组件类中多定义的方对应
·远程接口中方法的用法必须与企业组件类中的方法一致
·方法的参数和返回值必须是合法的RMI类型
·异常抛出语句必须包括java.rmi.RemoteException

 

0
相关文章