Conversational versus Nonconversational Session Beans
如何写会话Bean 写会话bean的类,必须实现javax.ejb.SessionBean接口 public interface javax.ejb.SessionBean extends javax.ejb.EnterpriseBean { public abstract void setSessionContext(SessionContext ctx) throws java.rmi.RemoteException;
public abstract void ejbPassivate() throws java.rmi.RemoteException;
public abstract void ejbActivate() throws java.rmi.RemoteException;
public abstract void ejbRemove() throws java.rmi.RemoteException; } 会话bean和实体bean都继续了javax.ejb.EnterpriseBean接口 让我们具体看看接口中的各种方法: setSessionContext(SessionContext ctx) 容器调用这个方法来通过会话上下文与bean连接。Bean可以通过会话上下文向容器查询当前事物的状态和当前的安全状态等。 import javax.ejb.*; public class MyBean implements SessionBean { private SessionContext ctx; public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } ... }
ejbCreate(…) 用来初始化你的会话bean,可以定义多个不同参数的ejbCreate()方法来用不同的方法初始化bean。 import javax.ejb.*; public class MyBean implements SessionBean { private int memberVariable; public void ejbCreate(int initialValue) { this.memberVariable = initialValue; } ... } ejbCreate()方法是容器可以调用的callback方法,客户端代码不能调用它,因为客户端不能直接处理beans??他们必须通过容器,但是客户端必须采用某种方法向ejbCreate方法传递参数,客户端提供初始化参数。Home接口是客户端用来初始化调用的接口工厂。你必须在home接口中复制每一个ejbCreate()方法,例如:假如在bean类中你有下面的ejbCreate方法 public void ejbCreate(int i) throws ... 那么你必须在你的home接口里有下面的create()方法 public void create(int i) throws ... 客户端调用home接口中的create()方法,将参数传递给ejbCreate()。 EjbPassivate() 假如出现太多的实例bean,EJB容器可以将它们中的一些钝化,将它们写到临时的存出空间例如数据库或文件系统。容器释放它们所申请的空间。 import javax.ejb.*; public class MyBean implements SessionBean { public void ejbPassivate() { <close socket connections, etc...> } ... } ejbActivate() 当客户需要使用被钝化的bean时,容器将被钝化的bean重新导入内存,激活它们。 Bean又被导致内存,这时需要重新得到bean所需要的资源。 import javax.ejb.*; public class MyBean implements SessionBean { public void ejbActivate() { <open socket connections, etc...> } ... } ejbRemove() 当容器将会话bean实例remove掉时,调用此方法。所有的bean都有这种方法,它没有参数,它将释放所有以分配的资源。 import javax.ejb.*; public class MyBean implements SessionBean { public void ejbRemove() { <prepare for destrUCtion> } ... } 容器可以在任何时候调用ejbRemove()方法,但假如碰到异常,则有可能禁止容器调用此方法。
业务方法 应该定义一些解决业务问题的方法:例如: import javax.ejb.*; public class MyBean implements SessionBean { public int add(int i, int j) { return (i + j); } ... } 因为客户端要调用这些方法,因此,你必须在bean的远程接口中列出这些方法。
得到Home对象的参考 /* * Get System properties for JNDI initialization */ Properties props = System.getProperties(); /* * Form an initial context */ Context ctx = new InitialContext(props); /* * Get a reference to the home object - the * factory for EJB objects */ MyHome home = (MyHome) ctx.lookup("MyHome"); 建立EJB对象 得到Home对象以后,可以将Home对象作为建立EJB对象的工厂。调用create()方法建立EJB对象。 MyRemoteInterface ejbObject = home.create(); 无参数是因为无状态beans不需要初始参数。 调用方法 客户端有了EJB对象以后就可以通过它来调用方法。当客户端在EJB对象上调用方法时,EJB对象必须选择一个bean实例来应答。EJB对象可以建立一个新的实例或是重用已经存在的实例。 ejbObject.add(); 破坏EJB对象 调用EJB或Home对象上的remove()方法来破坏EJB对象。 ejbObject.remove();