一个无状态的会话beans示例(5)
首先,我们来看一下Enterprise bean的原代码。通常由Enerprise beans的提供者来编写。(sort例子已经提供了代码,所以我们实际上什么都不用写。*_^)。下面,我们演示如何编译和链接此Enterprise bean。如何配置,如何打包成应用程序。然后演示如何编译链接客户。最后才运行客户和服务程序。
以下是开发具有Enterprisebeans的C/S应用程序的一些基本的步骤。
编写Enterprise beans的代码,包括beans的代码中远程(remote)接口和本地(home)接口的代码。
编写客户端代码。
编译和链接源代码,包括beans的和客户的源代码。
在目录META-INF中产生一个配置描述器。
打包Enterprise bean。
将Enterprise bean配置到jar文件中。
运行客户端。
编写一个Enterprise bean:
所有的Enterprisebeans都由三个部分组成,都必须由Enterprisebeans的提供者编写。这三个部分是:
实现类implementation class:这是一个Enterprisebean类,包括Enterprise beans应用逻辑的实现、和本地(home)、远程(remote)接口的功能定义。对于Sort例子,实现类就是SortBean.java文件。
本地(home)接口:本地接口定义了createing,finding,removing Enterprise beans的操作。在我们这个例子中,本地接口就是SortHome.java文件。
远程(remote)接口:远程接口定义了一些对客户可用的应用逻辑的方法。由Enterprisebeans提供。本例中,远程接口就是Sort.java文件。
客户要能够调用Bean的应用逻辑方法,Bean必须由这三个组成部分。客户应用程序使用Home接口来定位beans的remote接口。一旦客户拥有了remote接口的引用(refereenece),就? 调用在remote接口中声明的任何方法。客户并不知道方法是在本地还是在远程系统中执行。对客户而言,调用Enterprise beans的方法就和调用本地方法一样简单。EJB容器将远程调用传递给实际的Enterprisebeans的实例。控制所有的通信协议,并通过remote接口将返回值传给客户。
下图显示了当SortClient客户需要调用SortBean 会话bean的merge()方法的时候的可能发生的调用情况。注意,SortClient首先调用SortHome接口的Create()方法。返回了Sort的remote接口的一个引用。然后,客户端才调用Sort remote接口的merge()方法。方法传回了所需要的结果。
EJB 容器
Create Sort 的实例
Sort的引用
Merge函数
结果
例子Sort是一个无状态的会话bean。大多数的会话beans都有状态。在会话中,应客户的要求,容器产生一个bean的实例。并且在整个会话中,这个实例都为这个这个特定的客户服务。根据定义,一个有状态的会话bean在整个会话的过程中都保持着与客户的会话状态。
另一方面,无状态的状态bean并没有指向某一个特定的客户,也就是说,说它并没有保持着与客户会话的任何状态。当客户调用一个无状态的会话bean方法时,容器给客户指定一个在缓冲池中的beans实例为之服务。被指定的实例保持着方法有关的变量,一直到完成方法调用。实例在方法调用的时候就返回的状态是任意值。而自己却不保存任何的状态,也不再与调用它的客户相联系。容器可以将实例归还给实例缓冲池,也可以不归还给缓冲池而由系统自动处理。
编写本地(home)接口:
home接口定义了创建(create),查找(find),删除(remove)等方法。无状态会话bean的home接口要比有状态的会话bean或者实体bean的home接口要来得简单。SortHome的home接口扩展了javax.ejb.EJBHome接口,声明了create()方法。Create()方法没有参数,抛出两个异常:RemoteException和CreateException。
Create()返回了一个类型为Sort的对象,它实际上是一个对remote接口的一个引用。注意,客户并没有直接调用beans实例的任何方法。客户只是调用了通过beans的remote接口调用在remote接口定义了的方法。
因为有状态的会话bean和实体bean保持了客户的状态,可以有多个方法来产生实例,可以传递初始的参数给Create()方法。而无状态的会话bean并不需要保存客户的状态,可以只有一个Create()方法。这个唯一的Create()方法不能含有任何参数。将beans实例从实例缓冲池中取消的方法是Remove()方法,这是从EJBHome中继承过来的,而不需要另外在SortHome的Home接口中声明。
Sorthome的home接口如以下代码所示:
//SortHome.java
public interface SortHome extends javax.ejb.EJBHome(
Sort create() throws java.rmi.RemoteException, javax.ejb.CreateExcepion;)
编写remote接口代码:
remote接口定义、发布了Enterprise bean的应用方法,使这些应用方法可以在客户端被调用。它扩展了javax.ejb.EJBObject接口。Remote接口中的每一个方法都必须与SortBean实现类中的声明相匹配。方法必须有同样的名字和标识。另外,在sort的remote接口中必须抛出java.rmi.RemoteException异常,必须返回有效的RMI类型。Sort的remote接口声明了两个方法:sort()和merge()。两个方法都抛出了java.rmi.RemoteException异常,都返回了Vector类型。如下代码就是Sort的Remote接口:

