【正确答案】
【答案解析】在EJB的开发流程中有非常重要的3个对象:Remote接口、Home接口和Bean类。其中Remote接口定义了业务方法,用于EJB客户端调用业务方法,需要注意的是,开发EJB时,只需要对其进行定义即可,并不需要去实现它,因为容器会在编译时会根据接口定义和Enterprise Bean类的内容自动创建一个实现了该接口的类。Home接口提供了产生和定位Remote接口实例的方法,用于EJB工厂创建、移除、查找EJB实例,它又分为远程Home接口与本地Home接口两种。Bean类指的是实现了javax.ejb.EnterpriseBean接口的类,它定义了应用的商业逻辑。
具体而言,EJB开发步骤如下所示。
1)定义Romote接口。编写一个接口继承自javax.ejb.EJBObject。在这个接口中定义需要实现业务逻辑的方法对应的接口。需要注意的是,这个接口中定义的类都必须抛出RemoteException异常,示例如下。
import javax.ejb.*;
import java.rmi.*;
public interface HelloInterface extends EJBObject{
String hello()throws RemoteException;
}
2)编写一个接口继承javax.ejb.EJBHome。这个接口中实现create()方法,这个方法的返回值必须为Remote接口类型(可以被远程访问的接口),同时这个方法还需要抛出两个异常:CreateException和RemoteException。create()方法取代传统OO(Object Oriented,面向对象)中的constructor(构造方法)来初始化一个对象。EJB容器可以维护一定数量的对象实例,示例如下。
import javax.ejb.*;
public interface HelloHome extends EJBHome{
public HelloInterface create()throws
java.rmi.RemoteException, jaw.ejb.CreateException;
}
以上这个例子中的create()方法返回值为上面创建的HelloInterface接口。
3)编写bean类的实现类(SessionBean)。实现类必须实现下面5个方法:
①public void ejbCreate()方法。EJB容器会调用这个方法创建enterprise bean的对象。
②public void ejbRemove(){}方法。
③public void ejbActivate(){}方法。
④public void ejbPassivate(){}方法。
⑤public void setSessionContext(SesssionCOntext ctx){
this.ctx=ctx;
}
以上4个方法(ejbRemove()、ejbActivate()、ejbPassivate()、setSessionContext())主要用来控制SessionBean的生命周期。具体而言,容器在删除enterprise bean的实例之前会调用其ejbRemove()方法。容器在将enterprise bean的实例从临时持久存储介质加载到内存中后会调用其ejbActivate()方法。容器在将enterprise bean的实例转移到临时持久存储介质之前会调用其ejbPassivate()方法。每次创建一个SessionBean时,容器会调用setSessionContext()方法,用来初始化enterprise bean使用的SessionContext变量。具体使用方法如下所示:
import javax.ejb.*;
public class HelloBean implements SessionBean{
SessionContext context;
public void ejbActivate(){}
pubhc void ejbPassivate(){}
public void ejbRemove(){}
public void setSessionContext(SessionContext context){
this.context=context;
}
public String hello(){
return "Hello world!";
}
}
4)在项目的META-INF目录中创建两个文件:ejb-jar.xml和jboss.xml。其中,ejbjar.xml文件的内容如下所示:
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>HelloBean</ejb-name>
<home>HelloHome</home>
<remote>HelloInterface</remote>
<ejb-class>HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
jboss.xml文件的内容如下所示:
<jboss>
<enterprise-beans>
<session>
<ejb-name>HelloBean</ejb-name>
<jndi-name>Hello</jndi-name>
</session>
</enterprise-beans>
</jboss>
5)把上述EJB项目发布到JBoss容器上以后,客户端就可以调用该EJB对象了。
客户端调用EJB的步骤如下:设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用create()方法创建Remote接口,通过Remote接口调用其业务方法,示例如下:
import javax.naming.*;
public class Client{
public static void main(String[]args){
try{
Context initial=new InitialContext();
//从JNDI中以Hello名字来定位到对象
HelloHome home=(HeHoHome)initial.lookup("Hello");
HelloInterfaee h=home.create();
System.out.println(h.hello());
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}