Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

Enterprise JavaBeans简介

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  Entity beans表现为一个持久稳定的对象,它不依赖于请求而独立存在。一个entity bean可能描述了有关存货和订单的信息。每一个entity bean是唯一确定的。关键问题是entity beans是使用容器管理其持续的,也就是说,这个工作是由EJB container(例如应用程序服务器)。这使得开发者不必关注于与请求和重启无关的beans的维持。

  通常,在设计一个需要持续化的beans时,我们会使用entity beans,因为容器会提供数据的持续化。然而,EJB说明书并不要求应用程序服务器支持entity beans,并能够实现容器管理其持续。因为它们本来就是可选择的功能,我们要达到最大限度的灵活性和部署的弹性,我们可以主要使用session beans来实现功能,而我们用得最多的将是stateless beans。除非将来服务器管理entity beans变得很正常,你应该使用你自己的持久稳固的对象。

  如果你想使得你的应用容易升级,你应该避免使用诸如stateful session beans和entity beans这样的持续化的对象。如果在一个群集环境下部署一个stateful session beans,你将不得不担心你必须在请求之间维持这样的一个bean尽管后来的请求可能是由群集中另一个不同的服务器处理的。这样,如果你有一个反映货物的entity bean,并将这个entity bean部署在一个建立在群集环境下的应用程序中,你将不得不面临一个两难的选择:要么你要确保后来的所有请求都由最初的那一个服务器来处理(这样就抵消了最初使用群集环境的意义);要么你得着手解决在各个请求之间各个服务器上信息的同步。

  建立一个简单的EJB组件

  现在让我们看看建立一个简单的EJB组件的过程。在这个例子中,我们会开发一个shipping bean,它将可以被使用在任何需要运输包裹的应用中。这样的一个bean可能是电子商务软件包的一部分,它也可以是一个运输代理商提供给他的消费者的一个工具。这个shipping bean会提供这样的服务:运输包裹、计算运费、跟踪包裹。我们在这个例子中不会编写完整的代码,我们只是想让你对以下问题有个感觉:beans看上去是什么样子的,我们如果编写它们的接口,如果实现它们与应用程序服务器和客户端应用的交互。

  因为stateless session beans具有最大的弹性和灵活性,因此我们的shipping bean采用这样的类型。

  建立Bean的接口

  当你建立一个bean时,你必须首先建立home interface类和remote interface类,客户端应用将采用这些格式来访问这个bean所提供的服务。interface类仅仅定义了可用的服务和方法;而不会实现它们。所有的类使用RMI语法来表示,作为一个RMI程序员,你可能会注意到EJB的调用看上去非常相似,你也许想知道Enterprise JavaBeans和基于RMI的解决方案有什么不同。主要的不同是:在RMI中,程序员有责任处理事务和安全问题,而在Enterprise JavaBeans中,这些问题是由它的容器自行处理的。

  remote interface是用来处理客户端与beans的交互的。它提供了一系列的服务,而这些服务最终是由beans所在的容器来实现的,正如你在清单1中看到的,你只需要编写很少的代码。但是,你必须在主要的Javabean类里建立相应的方法,这个类我们将在下面看到。remote interface继承自 javax.ejb.EJBObject和 javax.ejb.Remote。


--------------------------------------------------------
清单1. 建立remote interface类 
package commerce.shipping;
import javax.ejb.*;
import java.rmi.RemoteException;
 public interface Shipper extends EJBObject, java.rmi.Remote {
  public String genTrackingNum() throws RemoteException;
  public dollarAmount calcCharge(ZipCode origZip, ZipCode destZip)
  throws Remote Exception;}
---------------------------------------------------------

  在清单2中所示的home interface(有时也被称为local interface),提供了一系列的方法,客户端使用这些方法来控制beans的生命周期,也就是说,在容器中创建和销毁beans。它继承自 EJBHome接口,而且至少必须实现一个create()方法,我们将调用这个方法在容器中将这个bean实例化。我们可以重载create()以实现几个不同的可能的初始化情况。在这里,我们使用了一个备用的create()方法,得用这个方法,我们可以建立一个有“优先级”(第二天、紧急等等)的shipper bean。如果我们建立了一个entity bean,我们还需要定义一个finder()方法,利用这个方法我们在容器中定位这个entity bean确定的实例。


---------------------------------------------------------
清单2. 建立home interface类 
package commerce.shipping;
import javax.ejb.*;
import java.rmi.RemoteException;
import java.rmi.Remote;
 public interface ShipperHome extends EJBHome {
public Shipper create() throws CreateException, RemoteException;
public Shipper create(int priority) throws CreateException, RemoteException;}
----------------------------------------------------------

  编写Enterprise JavaBeans类

  我们刚刚建立的home interfaces和remote interfaces只有很少的代码和很少的功能。商业逻辑是在真正的bean的类中。我们需要实现我们建立的bean的类型的接口,在这里是一个session bean。我们还需要实现在我们的remote interface定义的方法以及其它我们所实现的bean的类型所需的方法,代码如清单3所示:


----------------------------------------------------------
清单3. 建立JavaBeans类 
package commerce.shipping;
import javax.ejb.*;
import java.rmi.*;
 public interface ShipperBean implements SessionBean {
private transient SessionContext context;
private transient Properties props;
private int priority;
// 这些方法是SessionBean接口所需要的,它将响应有关诸如激活和销毁的
// beans的生命周期的事件。如果你有一个复杂的bean需要管理数据库连接
// 或其它资源,你需要在这里打开和关闭它。绝大多数的SessionBeans只需要
// 空执行。
public void ejbActivate() { System.err.println("Actived..."); }
public void ejbRemove() { System.err.println("Removed..."); }
public void ejbPassivate() { System.err.println("Passivated..."); }
// 这些方法是由容器调用的,用来实现与bean的交互。
public void setSessionContext(SessionContext context) {
  this.context = context;
  properties = context.getEnvironment();
}
// 这些方法是与我们的home interface所建立的create()方法相对应的。它将
// 被容器所调用。因此我们需要执行我们前面所建立的方法名。请注意,否则
// 当我们执行home interface时将不能返回一个对象。
public void ejbCreate() {
  System.err.println("New Shipper Bean created");
}
public void ejbCreate(int priority) {
  this.priority = priority;
}
// 下面是在我们的remote interface中所定义的“商业逻辑”方法
public String genTrackingNum() throws RemoteException {
  // 插入代码以产生下一个跟踪号。
  return trackingNumber;
}
public dollarAmount calcCharge(ZipCode origZip, ZipCode destZip)
  throws RemoteException {
  // 计算运费。
  return totalCharges;
}}
----------------------------------------------------------


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:J2SE1.4的I/O新特性   下一篇:全面研读 EJB 2.0

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章