站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题EJB入门文章

EJB入门文章

摘要: EJB入门文章
内容: 一.Enterprise Beans
在EJB(Enterprise Java Beans)中定义了两种不同类别的Enterprise Bean :
*会话 Bean (Session Bean)
*实体Bean (Entity Bean)

1. 会话 Bean (Session Bean)
会话 Bean 是调用它的客户端代码要完成的工作。当客户端与服务器建立联系,那么一个会话 Bean 就建立起来了。根据会话 Bean 的状态不同有分为:
A. 状态会话 Bean (Stateful Session Bean)
B. 无状态会话 Bean (Stateless Session Bean)
1.1 状态会话 Bean (Stateful Session Bean)
当客户机和服务器建立连接之后,状态会话 Bean (Stateful Session Bean) 将一直在客户机和服务器之间保持着用户的某个状态。例如:用户使用银行的ATM时,经过验证之后,用户可以连续执行多次操作,在这个过程当中,用户的合法状态将一直被保留,直到她将信用卡取出,结束这次操作。这时,状态会话 Bean (Stateful Session Bean) 也就被销毁。
1.2无状态会话 Bean (Stateless Session Bean)
当客户机和服务器建立连接之后,无状态会话 Bean (Stateless Session Bean)处理单一的用户请求或商务过程。无状态会话 Bean (Stateless Session Bean)不需要从以前的请求中提取任何状态。例如,用户的用户密码确认。用户输入密码后,发送请求。组件返回真或假来确认用户,一旦过程完成,无状态会话 Bean (Stateless Session Bean) 也宣告结束。
2. 实体Bean (Entity Bean)
实体Bean (Entity Bean)只是数据模型,它不包括商务逻辑。实体Bean (Entity Bean)可以将关系/对象数据库的数据映射到内存中供其它组件使用。实体Bean (Entity Bean)是一直存在的,而且具有很高的容错性能。实体Bean (Entity Bean)能供允许多用户同时访问。

二. 会话 Bean (Session Bean)
Ejb的执行过程是被放在一个EJB容器中进行的,所以客户端不会直接调用我们写好的Enterprise Bean ,而是调用EJB容器生成的一个EJBObject (EJB对象)来实现。那么,我们在编写服务器端的Enterprise Bean 时,就要考虑这点。既然客户端不能直接访问,就由EJBObject来代劳,所以在编写服务器端时,就要编写服务器端的一个接口(Remote)用来与客户机联系,实力化EJBObject。要生成EJBObject 就要调有Home 接口,来建立这个实力。


以下是会话 Bean 的代码分析:
A.Enterprise Bean 类:sailorsy.class
1.setSessionContext(SessionContext ctx)方法
它是EJB容器和Enterprise Bean互相作用的关口。




import java.rmi.*;
import javax.ejb.*;
public class sailorsy implements SessionBean{
private SessionContext ctx=null;
public voic setSessionContext(SessionContext ctx){
this.ctx=ctx;
}//setSessionContext
}//class sailorsy



2.ejbCreate(…)方法
它可以初始化Enterprise Bean ,可以定义不同的ejbCreate(…)方法,每个方法所带的参数不同。但是,必许要存在至少一种。




 import java.rmi.*;
import javax.ejb.*;
public class sailorsy implements SessionBean{
private SessionContext ctx=null;
public voic setSessionContext(SessionContext ctx){
this.ctx=ctx;
}//setSessionContext
public void ejbCreate() {
}//ejbCreate
}//class sailorsy



3.ejbPassivate()方法
如果初始化的Enterprise Bean 过多,EJB容器将其中的一些挂起(passivate),释放他们所占用的空间。




 import java.rmi.*;
import javax.ejb.*;
public class sailorsy implements SessionBean{
private SessionContext ctx=null;

public voic setSessionContext(SessionContext ctx){
this.ctx=ctx;
}//setSessionContext

public void ejbCreate() {
}//ejbCreate
public void ejbPassivate() {
}//ejbPassivate

}//class sailorsy



4.ejbActivate()方法
和ejbPassivate正好相反,它将被挂起的Bean从新调回。




import java.rmi.*;
import javax.ejb.*;
public class sailorsy implements SessionBean{
private SessionContext ctx=null;

public voic setSessionContext(SessionContext ctx){
this.ctx=ctx;
}//setSessionContext

public void ejbCreate() {
}//ejbCreate
public void ejbPassivate() {
}//ejbPassivate

public void ejbActivate() {
}//ejbActivate

}//class sailorsy



5.ejbRemove()方法
它可以清除EJB容器中的Bean。




import java.rmi.*;
import javax.ejb.*;
public class sailorsy implements SessionBean{
private SessionContext ctx=null;

public voic setSessionContext(SessionContext ctx){
this.ctx=ctx;
}//setSessionContext

public void ejbCreate() {
}//ejbCreate

public void ejbPassivate() {
}//ejbPassivate

public void ejbActivate() {
}//ejbActivate

public void ejbRemove() {
}//ejbRemove

public String showname(){
return "Hello,my name is sailorsy";
}//自己的商务方法
}//class sailorsy


以上这些是EJB必需的回调方法,我们可以在里面加入自己的方法,加入自己的商务逻辑。
B.Home 接口: sailorsyHome




import java.rmi.*;
import javax.ejb.*;

public interface sailorsyHome extends EJBHome {
public sailorsyRemote create() throws RemoteException, CreateException;
}


C. Remote接口:sailorsyRemote
import java.rmi.*;
import javax.ejb.*;

public interface sailorsyRemote extends EJBObject {
public java.lang.String showname() throws RemoteException;
}


三.调用会话 Bean:sailorsyTestClient1




  import javax.naming.*;
import javax.ejb.*;
import javax.rmi.PortableRemoteObject;
import java.rmi.*;

public class sailorsyTestClient1 {
private sailorsyHome sailorsyHomeObject = null;

//Construct the EJB test client
public sailorsyTestClient1() {
try {
//以下是客户端使用JNDI定位Home对象。
Context ctx = new InitialContext();

//look up jndi name
Object ref = ctx.lookup("sailorsy");

//cast to Home interface
sailorsyHomeObject = (sailorsyHome) PortableRemoteObject.narrow(ref, sailorsyHome.class);

}
catch(Exception e) {
e.printStackTrace();
}
}

//----------------------------------------------------------------------------
// Utility Methods
//----------------------------------------------------------------------------

public sailorsyHome getHome() {
return sailorsyHomeObject;
}
//Main method

public static void main(String[] args) throws Exception{
sailorsyTestClient1 client = new sailorsyTestClient1();
sailorsyRemote sr=client.getHome() .create() ;
String s=sr.showname() ;
System.out.print(s);
// Use the getHome() method of the client object to call Home interface
// methods that will return a Remote interface reference. Then
// use that Remote interface reference to access the EJB.
}
}


以上的EJB在win2000+jbuilder5/jbuilder6+BAS4.5经过测试。


以下是整个EJB的执行过程:
1. 客户端通过JNDI检索Home对象的引用;
2. JNDI返回Home对象的引用;
3. 请求创建一个新的EJB对象;
4. 创建EJB对象;
5. 返回EJB对象;
6. 调用商务方法;
7. 调用Enterprise Bean.

EJB入门文章 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd, scwcd 一.E
↑返回目录
前一篇: jsp预编译问题
后一篇: J2EE 组件开发:消息驱动的EJB 内容: