选择显示字体大小

一个无状态的会话beans示例(5)

p align="justify">   为了使大家对ejb容器和enterprisebeans有一个感性的认识,我们介绍一个简单的client/server例子。就是inprise的应用服务器自带的例子--sortclient。是一个无状态的会话beans,它实现了一个排序(sort)算法。本例子演示了如何编译enterprise beans例子,如何在ejb容器中运行bean的一些基本操作。还演示了如何将一个对象放在jndi命名服务中。

  首先,我们来看一下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接口:

//sort.java
import java.util.vector;
public interface sort extends javax.ejb.ejbobject{
vector sort(vector v, compare c) throws java.rmi.remoteexcetpion;
vector merge(vector a, vector b, compare c) throws java.rmi.remoteexception;
}

编写会话bean的实现代码:

  因为sortbean是一个会话bean。必须实现javax.ejb.sessionbean接口。同时也要注意,sortbean类要定义成公共的。

  sortbean的实现类定义了一些应用方法可以供客户端调用。在这个例子中,sortbean定义了sort()和merge()两个方法的实现。运行客户应用程序时,将会调用两个方法。

  一个会话bean实现了ejbcreate()的方法,并且与home接口中的create()方法相对应。sorthome的home接口定义了一个无参数的create()方法,抛出了一个java.rmi.remoteexception异常。但是,与sorthome接口的create()方法不同,create()返回了一个sort类型的对象,而ejbcreate()方法返回的是void类型。

  会话bean可以有一个公共的构造函数,而sortbean却不可以。sortbean除了创建和应用方法以外,另外有四个方法,它们是:ejbremove(),ejbactivate(),ejbpassivate(),和setsessioncontext()。容器拥有这些方法的句柄,在sortbean里,只需要将这些方法声明为public并将返回值置为void。

  下面是会话bean:sortbean的实现类的源代码:为简洁起见,我们并没有完全显示sort()方法和merge()方法的实现部分。也没有把调试信息给显示出来。

//sortbean.java
import java.util.vector
public class sortbean implements javax.ejb.sessionbean{
public void setsessioncontext {javax.ejb.sessioncontext
sessioncontext} {}
public void ejbcreate() throws java.rmi.remoteexception {}
public void ejbremove() throws java.rmi.remoteexception {}
public void ejbactivate() throws java.rmi.remoteexception {}
public void ejbpassivate() throws java.rmi.remoteexception {}
public vector sort (vector v, compare c) throws java.rmi.remoteexcetpion{
try{

……

return result;

}

catch(javax.ejb.createexception e){
throw new java.rmi.serverexception(“could not create sort instance”, e);
}
catch(javax.ejb.removeexception e){
throw new java.rmi.serverexception(“could not remove sort instance”,e);
}
}
public vector merge(vector a, vector b, compare c) throws java.rmi.remoteexception{
…….
}
}
}

编写客户端代码:

  客户端程序sortclient,必须首先使用jndi的api来定位enterprise beans的home接口。在下面的例子代码中,sortclient客户首先端生成了一个jndi上下文,使用jdni的的lookup方法来为sort定位home接口。

//sortclient.java
public class sortclient{

public static void main(string[] args) throw exception{
java.name.context context;
{ //get a jndi context using the naming service
context = new java.naming.initialcontext{};
}
object objref = {sorthome} context.lookup(“sort”);
sorthome home = {sorthome} javax.rmi.potableremoteobject.narrow{
objref, sorthome.class}
sort sort = home.create();
…//do zhe sort and zhe merge work.
sort.remove();
}
}

  在获得了sorthome的引用之后,客户就能够调用home接口的create()方法来获得sort的remote接口的引用。一旦客户有了sortbeans的remote接口引用。就能够象调用普通方法一样调用remote接口的sort()方法和merge()方法。

编译链接sort会话bean和它的客户端:

  我们用一个makefile文件编译链接了sort 会话 bean和它的客户端。makefile文件做了java2iiop,jar,verify等实用工具做的工作。首先,正确的设置环境变量-classpath和path

然后编译和build你的例子:

prompt% makeall
make文件非常简单,需要的话,可以自己修改它。
sort的makefile文件如下:
#makefile
default: all
include ../makefile.rules
srcs=\
sortclient.java \
sorthome.java\
sortbean.java
classes = $(srcs:.java=.class)
beans.jar: $(classes}
$(java2iiop) sorthome
$(jar) cmf beans.jar meta-inf *.class
$(verify) beans.jar
all: $(classes) beans.jar

生成配置描述器:

  配置描述器是一个xml文件, 在xml文件里面定义了enterprise bean的属性。可以通过标准的xml编辑工具来生成xml文件。然后,就可以用配置描述编辑器来编辑。

  注意:如果你用的是标准的xml编辑器,必须保证符合ejb1.1的规范要求。这样,enterprise bean才能够与ejb容器一起工作。必须使用inprise的文件类型定义(dtd)。目前,必须用标准的配置描述生成器来生成一个配置描述。一旦配置描述成为了jar文件的一部分。就可以用配置描述编辑器来修改它。配置描述器提供了enterprise bean代码的配置信息,可以通过编辑器来更改它。

  enterprise beans是可以用在不同的应用程序,而不修改其源代码的。但是,因为每个应用程序按照它自己的方式来使用enterprise beans。使用配置描述器就能够让beans适应这样的不同。sortbean的描述器定义了它的类型(无状态的session),指定了其home接口(sorthome)和remote接口(sort)的名字。还指定了其事务的类型(容器管理的事务)。

最后,运行例子sort:

  要运行例子,首先要启动visibroker smart agent来处理初始化的接口调用(例如客户如何定位命名服务等)。smart agent是通过应用服务器来运行的。

用如下命令启动ejb容器:

prompt% vbj com.inprise.ejb.container. ejbcontainer sort_beans.jar -jts -jns

  从一个终端窗口用如下命令运行客户端程序:

promtp% vbj sortclient

  客户定位并调用sortbean来对一组数组进行排序。输入输出如下:输入(用in标志的行),输出(用out标志的行)的数据。当然,并不一定要一模一样。根据你的输入数据的不同,将产生不同的输出。但其形式是这样的。

in: [1]
out:[1]
in: [1,2]
out:[1,2]
………
……….
in:[this is a test]


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons