注意: 在这个界面中,对所能够指定的内容有一定的限制。完整的限制清单,请参见Enterprise JavaBeans Specification(企业JavaBean规范)第16节。重要的一点是,所有使用的对象、参数、返回值和异常在"Java
to IDL Mapping Specification(Java对IDL的映射规范)"中都应该是有效的类型。 为简单的DemoBean编写的远程界面源程序如下:
/**
* Demo -- this is the "remote" interface of
* our enterprise JavaBean, it
* defines only one simple method called
* demoSelect(). As this is meant to be
* the simplest of examples demoSelect()
* never goes to a database, it just
* returns a string
*
* Note: The implementation of this interface is
* provided by the container tools
* but the demoSelect() method and any
* other methods in this interface
* will need to have equivalent
* implementations in the demobean.java
* which is supplied by the bean writer
* ..i.e., you!
*/
package ejb.demo;
import java.rmi.RemoteException;
import java.rmi.Remote;
import javax.ejb.*;
public interface Demo extends EJBObject, Remote {
// NB this simple example does not even do a
// lookup in the database
public String demoSelect() throws RemoteException;
}
步骤3: 指定宿主界面 (Home Interface)
一个会话 bean 的宿主界面提供了一种机制,用这种机制,容器可以代表客户端创建新的会话 bean。就象远程界面一样,宿主界面是由 bean
的开发人员用RMI语法声明的,并同样由容器供应商所提供的工具来实现。它基本上不需要程序员进行编码----所要作的仅是声明性的工作。
1) 阅读如下宿主界面的有关描述并注意在代码片段中的注释。
2) 将示例源代码存储到指定文件,并进行下一步。
这里是DemoBean EJB的源代码:
/**
* DemoHome.java - This is the Home interface it must
* extend javax.ejb.EJBHome and define one or more
* create() methods for the bean.
*
* Note: The implementation of this interface is
* generated by the container tools.
*/
package ejb.demo;
import javax.ejb.*;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.*;
/**
* This interface is extremely simple it declares only
* one create method.
*/
public interface DemoHome extends EJBHome {
public Demo create() throws CreateException,
RemoteException;
}
步骤4: 编写企业JavaBeanTM 类
这一步将向你演示如何编写应用程序代码(事务逻辑)。到现在为止,你已经声明了容器工具将为其生成代码的界面,但是,这里演示的是JavaBean的功能是如何编码的。
关于此bean的实现值得注意的一点是,几乎没有什么代码需要你来编写。大部分代码都简单地通过企业JavaBeans 规范来实现。很容易想见这里有许多模板和工具,它们为你完成大部分实现工作。这与GUI
beans 环境中所使用的工具的演变过程是相似的。
1)阅读如下 DemoBean 代码的描述并注意在示例代码中的注释,特别是那些在标题"Business Logic"下面的注释。
2)将示例源代码存储到指定文件,并转向下一步。
这里是 DemoBean 企业JavaBeans DemoBean.java 的源代码:
/**
* DemoBean -- This is implemented by the EnterPrise
* Bean author This class must extend
* javax.ejb.SessionBean and implement
* the methods in this interface as well as providing
* the implementation of the business methods.
*
*/
package ejb.demo;
import javax.ejb.*;
import java.io.Serializable;
import java.util.*;
import java.rmi.*;
public class DemoBean implements SessionBean {
static final boolean verbose = true;
private transient SessionContext ctx;
private transient Properties props;
// Implement the methods in the SessionBean
// interface
public void ejbActivate() {
if (verbose)
System.out.println("ejbActivate called");
}
public void ejbRemove() {
if (verbose)
System.out.println("ejbRemove called");
}
public void ejbPassivate() {
if (verbose)
System.out.println("ejbPassivate called");
}
/**
* Sets the session context.
*
* @param SessionContext
*/
public void setSessionContext(SessionContext ctx) {
if (verbose)
System.out.println("setSessionContext called");
this.ctx = ctx;
props = ctx.getEnvironment();
}
/**
* This method corresponds to the create method in
* the home interface DemoHome.java.
* The parameter sets of the two methods are
* identical. When the client calls
* DemoHome.create(), the container allocates an
* instance of the EJBean and calls ejbCreate().
*/
public void ejbCreate () {
if (verbose)
System.out.println("ejbCreate called");
}
/**
* **** HERE IS THE BUSINESS LOGIC *****
* Do the demoSelect() but don"t even go to
* the database in this eg but instead just
* return a String.
* The really BIG thing to notice here is that
* this is the only code we have invented at all
* the rest of the code has been declarations
* or simply implementing methods which are
* part of the EJB interfaces and in this example
* are not even used.
*/
public String demoSelect()
throws RemoteException
{
return("hello world");
}
}