📄 master-ejb-2.htm
字号:
配置描述符允许EJB容器向企业级的bean组件提供隐含的中间件服务。隐含的中间件服务是bean可以获得不必将任何中间件API解码,可以自动获得服务的一种服务。
</p>
<p>Bean的特殊属性 <br>
最后,你还需要有一个基于java的bean的属性文件。Bean在运行时读这些属性,这些属性在使用bean函数时会被用到。 </p>
<p>Ejb-jar文件 <br>
一旦生成bean的类、home接口、远程接口、配置描述符和bean的属性,我们就可以把它们打包成一个实体。这个实体称作Ejb-jar文件。这是个压缩文件。
</p>
<p>建立Ejb-jar文件 </p>
<p>什么是会话bean <br>
一个Session Beans针对单一的客户完成一次连接或会话,其生存直到客户完成连接与会话,或系统意外中止。Session Beans必须实现接口javax.ejb.SessionBean。
</p>
<p>会话bean的生存期 <br>
会话bean和实体bean的主要不同是它们的生存期的长短。会话bean的生存期短。与客户的会话时间相当。在与客户连接端开时,EJB容器会破坏会话bean。
<br>
相反,实体bean可以存活相当长的时间,实体bean是永久存取的一部分,例如:数据库。 <br>
会话bean不能保存永久的存储数据,但是,它可以进行数据库操作。 <br>
所有的会话bean都需要管理callback方法,容器定时的调用它,用来对bean的重要事件发出警告。这个方法仅能被容器调用。
</p>
<p>Conversational versus Nonconversational Session Beans </p>
<p>如何写会话Bean <br>
写会话bean的类,必须实现javax.ejb.SessionBean接口 <br>
public interface javax.ejb.SessionBean <br>
extends javax.ejb.EnterpriseBean <br>
{ <br>
public abstract void setSessionContext(SessionContext ctx) <br>
throws java.rmi.RemoteException; </p>
<p>public abstract void ejbPassivate() <br>
throws java.rmi.RemoteException; </p>
<p>public abstract void ejbActivate() <br>
throws java.rmi.RemoteException; </p>
<p>public abstract void ejbRemove() <br>
throws java.rmi.RemoteException; <br>
} <br>
会话bean和实体bean都继承了javax.ejb.EnterpriseBean接口 <br>
让我们详细看看接口中的各种方法: <br>
setSessionContext(SessionContext ctx) <br>
容器调用这个方法来通过会话上下文与bean连接。Bean可以通过会话上下文向容器查询当前事物的状态和当前的安全状态等。 <br>
import javax.ejb.*; <br>
public class MyBean implements SessionBean { <br>
private SessionContext ctx; <br>
public void setSessionContext(SessionContext ctx) { <br>
this.ctx = ctx; <br>
} <br>
... <br>
} </p>
<p>ejbCreate(…) <br>
用来初始化你的会话bean,可以定义多个不同参数的ejbCreate()方法来用不同的方法初始化bean。 <br>
import javax.ejb.*; <br>
public class MyBean implements SessionBean { <br>
private int memberVariable; <br>
public void ejbCreate(int initialValue) { <br>
this.memberVariable = initialValue; <br>
} <br>
... <br>
} <br>
ejbCreate()方法是容器可以调用的callback方法,客户端代码不能调用它,因为客户端不能直接处理beans——他们必须通过容器,但是客户端必须采用某种方法向ejbCreate方法传递参数,客户端提供初始化参数。Home接口是客户端用来初始化调用的接口工厂。你必须在home接口中复制每一个ejbCreate()方法,例如:如果在bean类中你有下面的ejbCreate方法
<br>
public void ejbCreate(int i) throws ... <br>
那么你必须在你的home接口里有下面的create()方法 <br>
public void create(int i) throws ... <br>
客户端调用home接口中的create()方法,将参数传递给ejbCreate()。 <br>
EjbPassivate() <br>
如果出现太多的实例bean,EJB容器可以将它们中的一些钝化,将它们写到临时的存出空间例如数据库或文件系统。容器释放它们所申请的空间。
<br>
import javax.ejb.*; <br>
public class MyBean implements SessionBean { <br>
public void ejbPassivate() { <br>
<close socket connections, etc...> <br>
} <br>
... <br>
} <br>
ejbActivate() <br>
当客户需要使用被钝化的bean时,容器将被钝化的bean重新导入内存,激活它们。 <br>
Bean又被导致内存,这时需要重新得到bean所需要的资源。 <br>
import javax.ejb.*; <br>
public class MyBean implements SessionBean { <br>
public void ejbActivate() { <br>
<open socket connections, etc...> <br>
} <br>
... <br>
} <br>
ejbRemove() <br>
当容器将会话bean实例remove掉时,调用此方法。所有的bean都有这种方法,它没有参数,它将释放所有以分配的资源。 <br>
import javax.ejb.*; <br>
public class MyBean implements SessionBean { <br>
public void ejbRemove() { <br>
<prepare for destruction> <br>
} <br>
... <br>
} <br>
容器可以在任何时候调用ejbRemove()方法,但如果遇到异常,则有可能禁止容器调用此方法。 </p>
<p>业务方法 <br>
应该定义一些解决业务问题的方法:例如: <br>
import javax.ejb.*; <br>
public class MyBean implements SessionBean { <br>
public int add(int i, int j) { <br>
return (i + j); <br>
} <br>
... <br>
} <br>
因为客户端要调用这些方法,因此,你必须在bean的远程接口中列出这些方法。 </p>
<p>如何调用会话beans <br>
我们现在来看客户方,客户方要通过使用一个或多个bean解决一些现实的问题。 <br>
有两种不同的客户方: <br>
Java RMI-based clients:这种客户方通过使用JNDI定位对象,使用JTA控制事务。 <br>
CORBA客户方:客户方也可以使用CORBA标准来写。CORBA客户方使用CORBA名字服务(COS Naming)在网络上定位对象,使用CORBA的OTS控制事务。
<br>
无论是用CORBA还是RMI,典型的客户端代码都必须实现: <br>
1、 定位Home接口 <br>
2、 使用Home接口建立EJB对象 <br>
3、在EJB对象上调用业务方法 <br>
4、清除EJB对象 <br>
定位Home接口 <br>
客户端使用JNDL定位Home对象。 <br>
J2EE中JNDL的作用 <br>
J2EE的目标之一是使应用程序实现“write once,run anywhere”。任何的运行在企业级配置的java代码在多层结构中应该是不受约束的。因此必须实现定位的透明化。
<br>
J2EE通过使用JNDL来实现定位的透明化。已有目录服务的产品如Netscape的Directory Server,微软的Active
Directory,IBM的Lotus Notes。 <br>
通常我们使用目录服务存储用户名、密码、机器位置、打印机位置等等。J2EE扩展目录服务存储资源的本地信息,这些资源也可以是Home对象、企业级bean的环境属性、数据库驱动、信息服务驱动和其他资源。使用目录服务,在些应用程序代码时可以不必关心确切的机器名字和机器地址,这样保证了代码的可移植性。无论资源在何处,都不需要重新编译代码。
<br>
JNDL通过为本地用户、机器、网络、对象和服务提供一个标准接口向企业级配置中增加值。 <br>
为了在J2EE中定位资源,必须实现以下两步: <br>
1、 用配置描述符中的“绰号”关联资源,J2EE将向资源绑定绰号。 <br>
2、 资源的客户端使用JNDL中的绰号定位资源。 </p>
<p>怎样使用JNDL定位Home对象 <br>
客户端不必关心Home对象在网络的什么地方。JNDL为Home对象提供绰号来定位Home对象。通过绰号可以得到Home对象的参考。
<br>
具体点,客户端代码必须执行以下几步来通过JNDL得到参考。 <br>
1、 建立环境。必须配置将要使用目录服务,包括为验证身份所需的用户名、密码。 <br>
2、 建立初始的上下文。初始上下文是连接目录结构的本地出发点。通过初始上下文得到设定的环境属性。 <br>
3、 得到Home对象。执行lookup()操作,返回一个RMI远程对象。 </p>
<p>得到Home对象的参考 <br>
/* <br>
* Get System properties for JNDI initialization <br>
*/ <br>
Properties props = System.getProperties(); <br>
/* <br>
* Form an initial context <br>
*/ <br>
Context ctx = new InitialContext(props); <br>
/* <br>
* Get a reference to the home object - the <br>
* factory for EJB objects <br>
*/ <br>
MyHome home = (MyHome) ctx.lookup("MyHome"); <br>
建立EJB对象 <br>
得到Home对象以后,可以将Home对象作为建立EJB对象的工厂。调用create()方法建立EJB对象。 <br>
MyRemoteInterface ejbObject = home.create(); <br>
无参数是因为无状态beans不需要初始参数。 <br>
调用方法 <br>
客户端有了EJB对象以后就可以通过它来调用方法。当客户端在EJB对象上调用方法时,EJB对象必须选择一个bean实例来应答。EJB对象可以建立一个新的实例或是重用已经存在的实例。
<br>
ejbObject.add(); <br>
破坏EJB对象 <br>
调用EJB或Home对象上的remove()方法来破坏EJB对象。 <br>
ejbObject.remove(); <br>
</p>
<!-- #EndEditable --></td>
</tr>
</table>
<div align="center">
<br>
</div>
</body>
<!-- #EndTemplate --></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -