免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1183 | 回复: 0
打印 上一主题 下一主题

Enterprise JavaBeans 3.0 简介 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-28 10:22 |只看该作者 |倒序浏览
Enterprise JavaBeans 3.0
EJB 3.0 规范使开发 Enterprise JavaBeans 变得比以前更容易,这可能促使您考虑尝试开发 EJB。如果是这样的话,那么祝贺您,您已经成功避免了您之前的 EJB 开发人员所遇到的许多困难,并能享受 EJB 3.0 开发的便利。但是在您开始进行开发之前,您可能希望了解 Enterprise JavaBeans 是什么以及它们有什么用途。本文解释了 EJB 的基础知识以及如何在 J2EE 应用程序中使用它们。
EJB 是什么?
Enterprise JavaBean (EJB) 是一个可重用的、可移植的 J2EE 组件。EJB 由封装业务逻辑的方法组成。例如,EJB 可以拥有包含更新数据库中客户数据的方法的业务逻辑。多种远程和本地客户端可以调用此方法。此外,EJB 在容器内运行,从而允许开发人员集中精力处理 bean 中的业务逻辑而不必担心复杂且易于出错的问题,如事务支持、安全性和远程对象访问。EJB 以 POJO 即传统 Java 对象的形式开发,开发人员可以使用元数据批注来指定容器如何管理这些 bean。
EJB 的类型
EJB 包括三种主要类型:会话 bean、实体 bean 和消息驱动的 bean。会话 bean 执行独立的、去耦的任务,如检查客户的信用记录。实体 bean 是一个复杂的业务实体,它表示数据库中存在的业务对象。消息驱动的 bean 用于接收异步 JMS 消息。我们来进一步研究一下这些类型:
会话 Bean
会话 bean 通常表示业务流程中的操作,如“处理订单”。会话 bean 基于对话状态的保持情况而进行分类,即有状态或无状态。
无状态会话 bean 没有内部状态。它们不记录从一个方法调用传递到另一个方法调用的信息。因此,无状态业务方法的每次调用都独立于其前一次调用;例如计算税款或运费。当用特定的应税值调用计算税款的方法时,对税款值进行计算并返回给调用方法,而不必存储调用者的内部状态以供日后调用。因为这些 bean 并不保持状态,所以容器管理它们很简单。当客户端请求无状态 bean 实例时,可以从容器所保持的无状态会话 bean 实例池中接收一个实例。此外,由于可以共享无状态会话 bean,因此容器可以保持较少的实例为大量的客户端提供服务。要指定将 Java 组件作为无状态会话 Bean 部署和管理,只需为该组件添加批注 @Stateless 即可。
有状态会话 bean 在方法调用间保持一个对话状态;例如,客户的在线购物车。当客户开始在线购物时,从数据库中检索客户的详细信息。客户从购物车中添加或删除商品、下订单等时调用的方法也可以使用这些详细信息。然而,有状态会话 bean 是暂时的,一旦出现会话终止、系统崩溃或网络故障,其状态则不复存在。当客户端请求有状态会话 bean 实例时,即为该客户端分配一个有状态实例,并为该客户端维护该组件的状态。要指示容器在某个方法结束时删除有状态会话 bean 实例,为该方法添加批注 @Remove。
会话 Bean 示例
import javax.ejb.Stateless.*;
/**
* A simple stateless session bean implementing the incrementValue() method of the * CalculateEJB interface.
*/
@Stateless(name="CalculateEJB")
public class CalculateEJBBean
implements CalculateEJB
{
int value = 0;
public String incrementValue()
{
value++;
return "value incremented by 1";
}
}

实体 Bean
实体 Bean 是一个管理持久性数据的对象,有可能使用几个相关的 Java 对象,并可根据主键唯一确定。通过包含 @Entity 批注,可以将类指定为实体 bean。实体 bean 表示数据库中的持久性数据,如客户表中的一行或者员工表中的一条员工记录。实体 bean 还可以在多个客户端间共享。例如,一个员工实体 bean 可以由多个客户端用于计算一个员工的年工资或者更新员工地址。可以将实体 bean 对象的特定字段设成持久性字段。实体 bean 中没有被 @Transient 批注标记的所有字段均被视为持久字段。EJB 3.0 的一个主要特性就是能使用元数据批注来创建包含对象/关系映射的实体 bean。例如,要指定将实体 bean 的 empId 字段映射到 Employees 表的 EMPNO 属性,需要使用 @Table(name="Employees") 来批注表名并使用 @Column(name="EMPNO") 来批注字段,如下面的例子所示。此外,EJB 3.0 的一个特性是,您在开发期间可以方便地测试实体 bean,因为现在使用 Oracle 应用服务器实体测试工具可以在容器外运行实体 bean。
实体 bean 示例
import javax.persistence.*;
import java.util.ArrayList;
import java.util.Collection;
@Entity
@Table(name = "EMPLOYEES")
public class Employee implements java.io.Serializable
{
private int empId;
private String eName;
private double sal;
@Id
@Column(name="EMPNO", primaryKey=true)
public int getEmpId()
{
return empId;
}
public void setEmpId(int empId)
{
this.empId = empId;
}
public String getEname()
{
return eName;
}
public void setEname(String eName)
{
this.eName = eName;
}
public double getSal()
{
return sal;
}
public void setSal(double sal)
{
this.sal = sal;
}
public String toString()
{
StringBuffer buf = new StringBuffer();
buf.append("Class:")
.append(this.getClass().getName()).append(" ::").append(" empId:").append(getEmpId()).append(" ename:").append(getEname()).append("sal:").append(getSal());
return buf.toString();
}
}

消息驱动的 Bean
消息驱动的 bean (MDB) 为实现异步通信提供了一种比使用直接 Java 消息服务 (JMS) 更简单的方法。MDB 用于接收异步 JMS 消息。容器处理 JMS 队列和主题所需的大部分建立过程。它将所有消息发送给相关的 MDB。MDB 允许 J2EE 应用程序发送异步消息,随后应用程序可以处理这些异步消息。要将 bean 指定为 MDB,需要实现 javax.jms.MessageListener 接口并用 @MessageDriven 批注该 bean。
消息驱动的 Bean 示例
import javax.ejb.MessageDriven;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.Inject;
import javax.jms.*;
import java.util.*;
import javax.ejb.TimedObject;
import javax.ejb.Timer;
import javax.ejb.TimerService;
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName="connectionFactoryJndiName", propertyValue="jms/TopicConnectionFactory"),
@ActivationConfigProperty(propertyName="destinationName", propertyValue="jms/myTopic"),
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Topic"),
@ActivationConfigProperty(propertyName="messageSelector", propertyValue="RECIPIENT = 'MDB'")
}
)
/**
* A simple Message-Driven Bean that listens to the configured JMS Queue or Topic and gets notified via an * invocation of it's onMessage() method when a message has been posted to the Queue or Topic.The bean
* prints the contents of the message.
*/
public class MessageLogger implements MessageListener, TimedObject
{
@Inject javax.ejb.MessageDrivenContext mc;
public void onMessage(Message message)
{
System.out.println("onMessage() - " + message);
try
{
String subject = message.getStringProperty("subject");
String inmessage = message.getStringProperty("message");
System.out.println("Message received\n\tDate:" + new java.util.Date() + "\n\tSubject:" + subject + "\n\tMessage:" + inmessage + "\n");
System.out.println("Creating Timer a single event timer");
TimerService ts = mc.getTimerService();
Timer timer = ts.createTimer(30000, subject);
System.out.println("Timer created by MDB at:" + new Date(System.currentTimeMillis()) +" with info:"+subject);
}
catch (Throwable ex)
{
ex.printStackTrace();
}
}
public void ejbTimeout(Timer timer)
{
System.out.println("EJB 3.0:Timer with MDB");
System.out.println("ejbTimeout() called at:" + new Date(System.currentTimeMillis()));
return;
}
}

使用 EJB
EJB 客户端是访问该 bean 的应用程序。它不必位于客户端层,但可以是单机版应用程序、JSP、servlet 或其他 EJB。客户端通过远程或本地(取决于客户端是位于同一个 JVM 还是不同的 JVM 上,而不取决于 bean)的 bean 接口来访问 EJB 的方法。这些接口定义了 bean 的方法,而 bean 类实际实现这些方法。当客户端访问 bean 类的方法时,容器为 bean 生成一个代理,称为远程或本地对象。该远程或本地对象接收请求,将其委托给相应的 bean 实例,并将结果返回给客户端。要调用 bean 的方法,客户端需要通过使用 EJB 部署描述文件中定义的该 bean 的名称来找到它。在以下的示例中,客户端使用 Context 对象找到名为“Statelessejb”的 bean。
EJB 客户端示例
import javax.naming.Context;
import javax.naming.InitialContext;
/**
* A simple bean client which calls methods on a stateless session bean.
*/
public class CalculateejbClient
{
public static void main(String [] args)
{
Context context = new InitialContext();
CalculateEJB myejb =
(CalculateEJB)context.lookup("java:comp/env/ejb/CalculateEJB");
myejb.incrementValue();
}
}

总结
使用 EJB 3.0 规范开发 Enterprise JavaBeans 非常简单。该规范使用元数据批注来定义 bean 的类型以及提供给客户端的方法。因此,无论您是为执行特定任务而创建会话 bean 还是为更新数据而将表映射到实体 bean,您都可以使用传统 Java 对象和接口来完成这些工作,并通过在业务方法中使用批注向客户端提供方法。现在您已经了解了 EJB 的基础知识,接下来请参考 OTN 的
EJB 3.0 资源页面
,以获得更多信息。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/86974/showart_2040130.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP