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