一、基础知识
要开发一个Session Bean,我们需要创建两个Java接口和一个Java类,这些接口和类分别叫做:home interface、bean interface、bean class,如下图所示:
Home Interface:为了让session bean的客户端能够获得一个它的bean接口的引用,我们必须要使用bean的Home Interface。一个EJB的Home Interface必须继承EJBHome接口,这个接口来自于javax.ejb包。
Bean Interface:session bean通过一个接口来向客户端暴露它的business method,这个接口就是Bean Interface,Bean Interface必须继承EJBObject接口,它也来自于javax.ejb包。
Bean Class:session bean的所有商业逻辑都是在Bean Class中实现的,所有的Bean Class都实现了SessionBean接口,它也来自于javax.ejb包。
Home Stub & Bean Stub:上图中的那些stub被客户端用来调用位于服务器端的EJB中的方法。Stub通过RMI来调用服务器端它们对应的接口。
二、开发一个简单的Session Bean
按照上面所说的,首先创建1个Home Interface、1个Bean Interface和1个Bean Class,它们的代码如下所示:
SimpleSessionHome.java:Home Interface
package beans;
import java.rmi.RemoteException;
import javax.ejb.EJBHome;
import javax.ejb.CreateException;
/**
* @author CMTobby 2007 - 11 - 11
* 这个类是一个Home Interface,它的主要作用是让客户端获得一个EJB的Bean
interface的引用<br>
* 所有的Home Interface必须实现javax.ejb.EJBHome接口
*/
public interface SimpleSessionHome extends EJBHome {
//The create() method for the SimpleSession bean
public SimpleSession create() throws CreateException, RemoteException;
}
SimpleSession.java:Bean Interface
package beans;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
/**
* @author CMTobby 2007 - 11 - 11 <br>
* 这时一个Bean Interface,它的主要作用是向客户端暴露EJB的Business Method<br>
* 所有的Bean Interface都必须实现javax.ejb.EJBObject接口
*/
public interface SimpleSession extends EJBObject{
//The public business method on the SimpleSession bean
public String getEchoString(String clientString) throws RemoteException;
}
SimpleSessionBean.java:Bean Class
package beans;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
/**
* @author CMTobby 2007 - 11 - 11 <br>
* 这是一个Bean Class,它负责具体实现所有的Bussiness Mehotd.<br>
* 所有的Bean Class都必须实现javax.ejb.SessionBean接口
*/
public class SimpleSessionBean implements SessionBean {
public void ejbActivate() throws EJBException, RemoteException {
}
public void ejbPassivate() throws EJBException, RemoteException {
}
public void ejbRemove() throws EJBException, RemoteException {
}
public void ejbCreate() {}
public void setSessionContext(SessionContext arg0) throws EJBException,
RemoteException {
}
/**
* EJB中的Bussiness Method。在远程接口中必须也有这个方法。<br>
* @param clientString 来自于客户端的信息
* @return
*/
public String getEchoString(String clientString) {
return clientString + " - from session bean";
}
}
二、部署EJB
我用的Application Server是Sun免费提供的PE(Platform Edition),为了将我们上面所写的一个简单的EJB部署到Server上需按照如下步骤(我用的IDE是Eclipse):
1. 从程序中启动Application Server,如下图所示:
2. 仍然是在上图中,点击Deploytool菜单,打开部署工具,界面如下所示:
3. 在上图中,点击【File】---【New】---【Application】,出现如下界面:
这里将会创建一个EAR文件,EAR是Enterprise Application Resource的缩写,它包含了一个J2EE应用的所有组件,类似于一个War文件包。在上图中我们要指定EAR文件名字和路径,我取的名字是SimpleSessionApp.ear。此时DeployTool将会在指定的路径为我们生成一个ear文件,它里面的内容基本是空的,只有几个配置文件。
4.在步骤2中的菜单中,选择【File】---【New】---【Enterprise Bean】,点击【next】来到如下的界面:
在上图中我们指定了这个Bean Jar的名字为SimpleSessionJar,同时也指定了它存放的位置:存放在我们刚才新建的ear文件中,如上图中红色矩形所示。
5.上图中点击Edit Contents按钮,可以选择要放入Jar中的class文件,如下图所示:
如上图所示,我选择了前面3个Java文件编译之后产生的class文件,然后点击add按钮将它们加入到bean jar中,最后点击OK按钮。这里要注意,在选择class时,上面的Starting Directory是支持手写的,它会默认显示为ear文件所在的目录。
6.上图中点击OK,再点击Next,来到如下界面:
从Enterprise Bean Class下拉列表中选择beans.SimpleSessionBean,从Enterprise Bean Type下拉表中选择Stateless Bean,从Remote Home Interface下拉列表中选择beans.SimpleSessionHome,从Remote Interface中选择beans.SimpleSession。Enterprise Bean Name是我们想让它在EJB工具中显示的名称,我取名为SimpleSessionEjb。
7.现在一路狂奔,点击Next,直到最后的Finish。
8.为EJB指定对应的JNDI名,以便客户端得到它的引用。点击主界面上的Sun-specific settings按钮,进入如下界面:
在上图中红色矩形框所示处输入我们命名的JNDI名称,这里我们的是:ejb/beans.SimpleSession。点击Close,然后保存。
9.从步骤2所示的图中选择Tool菜单下的Verify J2EE Compliance功能,对应用进行校验,这里就不多说了。
10.选择Tool菜单下的Deploy,出现如下界面:
输入用户名、密码,选中Return Client Jar,点击OK即可。这一步会在我们指定的目录下生成一个Jar文件,这个Jar文件的命名规则是:应用名+Client.jar,如本例中就是SimpleSessionAppClient.jar。
现在,我们的EJB就已经部署成功了,并可供客户端调用。
三、测试部署是否成功
为了测试上面的部署是否成功,可以写一个程序来进行测试,如下所示:
SimpleSessionClient.java:
package client;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import beans.SimpleSession;
import beans.SimpleSessionHome;
/**
* @author CMTobby 2007 - 11 - 11
*/
public class SimpleSessionClient {
public static void main(String[] args) {
try {
InitialContext jndiContext = new InitialContext();
// Get a reference to the SimpleSession JNDI entry
Object ref = jndiContext.lookup("ejb/beans.SimpleSession");
// Get a reference from this to the Bean's Home interface
SimpleSessionHome home = (SimpleSessionHome) PortableRemoteObject
.narrow(ref, SimpleSessionHome.class);
// Create a SimpleSession object from the Home interface
SimpleSession simpleSession = home.create();
// Loop through the words
for (int i = 0; i < args.length; i++) {
String returnedString = simpleSession.getEchoString(args[i]);
System.out.println("sent string: " + args[i]
+ ", received string: " + returnedString);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
将之前部署过程中产生的SimpleSessionAppClient.jar、j2ee.jar、appserv-rt.jar加入到classpath中,然后指定参数为now is the time,运行成功,输入如下:
sent string: now, received string: now - from session bean
sent string: is, received string: is - from session bean
sent string: the, received string: the - from session bean
sent string: time, received string: time - from session bean
这样,我们就成功完成了我们第一个Session Bean的开发。