EJB简介

核心提示:什么是EJB? 一个企业JavaBean (EJB)是一个可重用的,可移植的J2EE组件。 EJB由封装了业务逻辑的多个方法组成。例如,一个EJB可以有包括一个更新客户数据库中数据的方法的业务逻辑。多个远程和本地客户端可以调用这个方法。另外,EJB运行在一个容器里。

什么是EJB?

一个企业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能够被共享,所以容器可以维护更少数量的实例来为大量的客户端服务。简单地象该Bean增加元注释@Stateless 来指定一个 Java Bean作为一个无状态会话Bean被部署和管理。

一个有状态的会话Bean维护一个跨越多个方法调用的会话状态;例如在线购物篮应用。当客户开始在线购物时,客户的详细信息从数据库获得。相同的信息对于当客户从购物篮中增加或者移除商品等等操作时被调用的其他方法也是可访问的 。但是因为该状态不是在会话结束,系统崩溃或者网络失败时保留,所以有状态会话Bean是暂时的。当一个客户端请求一个有状态会话Bean实例时,客户端将会得到一个会话实例,该Bean的状态只为给客户端维持。通过向方法增加元注释@Remove来告诉容器当某个方法调用结束一个有状态会话Bean实例应该被移除。

会话Bean实例

import javax.ejb.Stateless.*;

/**
* 一个简单无状态会话Bean实现了CalculateEJB接口的incrementValue()方法
**/
@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中所有没有@Transient 元注释的变量需要考虑持久化。EJB3.0的一个主要特色是创建包含使用元数据注释的对象/关系映射实体Bean的能力。例如,指定实体Bean的 empId变量映射到employee表中的EMPNO属性,象下面实例中一样用@Table(name="Employees") 注释这个表的名字和用@Column(name="EMPNO")注释empId变量。另外,EJB3.0中的一个特色是你可以很容易的在开发时测试实体 Bean,可以用Oracle Application Server Entity Test Harness在容器外部运行一个实体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应用发送异步消息,该应用能处理这些消息。实现 javax.jms.MessageListener接口和使用@MessageDriven注释该Bean来指定一个Bean是消息驱动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'") })
/** *监听可配置JMS队列或者主题和通过当一个消息发送到队列或者主题
* *调用它的onMessage()方法得到提醒的一个简单的消息驱动 *该Bean打印消息的内容
* */
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 receivedntDate: "
+ new java.util.Date() + "ntSubject: " + subject
+ "ntMessage: " + 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) {
}
}

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

客户端是访问Bean的应用程序。虽然没有必要保存在客户层,但是能够作为一个独立的应用,JSP,Servlet,或者另一个EJB。客户端通过 Bean的远程或者本地接口访问EJB中的方法,主要取决于客户端和Bean运行在同一个还是不同的JVM中。这些接口定义了Bean中的方法,而由 Bean类实际实现这些方法。当一个客户端访问该Bean类中的一个方法时,容器生成Bean的一个代理,被叫做远程对象或者本地对象。远程或者本地对象接收请求,委派它到相应的Bean实例,返回结果给客户端。调用一个Bean中的方法,客户端使用定义在EJB不是描述文件的名字查找到Bean。在以下实例中,客户端使用上下文对象找到命名为"StateLessejb" Bean。

EJB客户端实例

import javax.naming.Context;
import javax.naming.InitialContext;

/** * 一个调用无状态会话Bean中方法的简单的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开发企业JavaBean是相当容易的。此规范使用元数据注释定义Bean的类型和暴露给客户端的方法。因此,无论你将创建一个执行特定任务的会话 Bean还是映射一个表到实体Bean来更新数据,你都能象使用普通Java对象和接口一样进行处理,在业务方法中使用元注释向客户端暴露方法。既然你已经理解了EJB的基础,可以到OTN中EJB 3.0 Resources Page发现更多信息。

转载至:[url]http://ajava.org/course/java/7769.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值