??xml version="1.0" encoding="utf-8" standalone="yes"?>69视频在线观看,日韩在线一区二区三区免费视频,亚洲黄一区二区http://www.aygfsteel.com/microlab4321/category/25531.html适时ȝ是一U很好的彌补Ҏ!zh-cnMon, 03 Sep 2007 05:16:35 GMTMon, 03 Sep 2007 05:16:35 GMT60EJB3.0入门 http://www.aygfsteel.com/microlab4321/articles/142226.html冬天的猪冬天的猪Mon, 03 Sep 2007 02:55:00 GMThttp://www.aygfsteel.com/microlab4321/articles/142226.htmlhttp://www.aygfsteel.com/microlab4321/comments/142226.htmlhttp://www.aygfsteel.com/microlab4321/articles/142226.html#Feedback0http://www.aygfsteel.com/microlab4321/comments/commentRss/142226.htmlhttp://www.aygfsteel.com/microlab4321/services/trackbacks/142226.html

作者: Lynn Munsinger
译Q草?br /> 旉Q?007q??9日(My BirthdayQ?br /> 原文地址Q?span class="Apple-style-span" style="word-spacing: 0px; font: 12px 'Lucida Grande'; text-transform: none; color: #000000; text-indent: 0px; white-space: pre; letter-spacing: normal; border-collapse: separate; font-size-adjust: none; font-stretch: normal; orphans: 2; widows: 2">http://www.oracle.com/technology/tech/java/newto/introejb.htm


EJB3.0规范使开发EJB比过LҎQ可能诱惑你考虑开发第一个EJB。如果真是这U情况,那么贺你,
你经成功避免了在你以前EJB开发者的很多挫折Qƈ且n受到EJB3.0开发的便利性。但是你开始开发以前,
你可能想知道EJB是什么和它们用于什么目的。本文章解释了EJB的基和你如何在一个J2EEE序中?br /> 它们?br />
什么是EJBQ?/span>

一个企业JavaBean (EJB)是一个可重用的,可移植的J2EElg?EJB由封装了业务逻辑的多个方法组成?br /> 例如Q一个EJB可以有包括一个更新客h据库中数据的Ҏ的业务逻辑。多个远E和本地客户端可以调用这
个方法。另外,EJBq行在一个容器里Q允许开发者只x与bean中的业务逻辑而不用考虑象事务支持,安全
性和q程对象讉K{复杂和Ҏ出错的事情。EJB以POJO或者普通旧的Java对象形式开发,开发者可以用元数
据注释来定义容器如何理q些Bean?/p>

EJBcd

EJB主要有三U类型:会话BeanQ实体Bean和消息驱动Bean。会话Bean完成一个清晰的解耦的dQ例?br /> 查客戯̎户历史记录。实体Bean是一个代表存在于数据库中业务对象的复杂业务实体。消息驱动Bean用于
接收异步JMS消息。让我们更详l的认识q些cd?/p>

会话Bean

会话Bean一般代表着业务程中象"处理订单"q样的动作。会话BeanZ是否l护q度状态分为有?br /> 态或者无状态?br /> 无状态会话Bean 没有中间状态。它们不保持q踪一个方法调用另一个方法传递的信息。因此一个无?br /> 态业务方法的每一ơ调用都独立于它的前一个调用;例如Q税费计或者{U̎ƾ?当计税贚w的方法被
调用ӞE费D计算q返回给调用的方法,没有必要存储调用者ؓ来调用备用的内部状态。因为它们不
l护状态,所以这些Bean是仅仅由容器理。当客户端请求一个无状态的Bean实例Ӟ它可以接收来自由容器理的无状态会话Bean实例集中的一个实例。也因ؓ无状态会话Bean能够被共享,所以容器可以维护更?br /> 数量的实例来为大量的客户端服务。简单地象该Bean增加元注?span style="font-family: Courier New">@Stateless 来指定一?Java Bean作ؓ一?br /> 无状态会话Bean被部|和理?br /> 一个有状态的会话Beanl护一个跨多个方法调用的会话状态;例如在线购物应用。当客户开始在U?br /> 购物Ӟ客户的详l信息从数据库获得。相同的信息对于当客户从购物中增加或者移除商品等{操作时被调用的其他Ҏ也是可访问的 。但是因状态不是在会话l束Q系l崩溃或者网l失败时保留Q所以有?br /> 态会话Bean是暂时的。当一个客Lh一个有状态会话Bean实例Ӟ客户端将会得C个会话实例,该Bean的状态只为给客户端维持。通过向方法增加元注释@Remove来告诉容器当某个Ҏ调用l束一个有状?br /> 会话Bean实例应该被移除?/span>

会话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对象q且可以依靠主键被唯一识别。?br /> q包?span style="font-family: Courier New">@Entity 元注释来指定一个类是一个实体Bean。实体Bean表示来自数据库的持久化数据,例如客户?br /> 中的一个记录,或者一个员工表中的一个员工记录。实体Bean也可以被多个客户端共享。例如一个员工实?br /> 能够被多个计一个员工每q工资总额或者更新员工地址的客L使用。实体Bean对象特定变量能够保持?br /> 久化。实体Bean中所有没?span style="font-family: Courier New">@Transient 元注释的变量需要考虑持久化。EJB3.0的一个主要特色是创徏包含使用元数据注释的对象/关系映射实体Bean的能力。例如,指定实体Bean的empId变量映射到employee表中?br /> EMPNO属性,象下面实例中一L@Table(name="Employees") 注释q个表的名字和用@Column
(name="EMPNO")注释empId变量。另外,EJB3.0中的一个特色是你可以很Ҏ的在开发时试实体
BeanQ可以用Oracle Application Server Entity Test Harness在容器外部运行一个实体Bean?/span>

实体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消息服务QJMSQ更Ҏ地方法。创建MDB?br /> 收异步JMS消息。容器处理ؓJMS队列和主题所要求加蝲处理的大部分工作。它向相关的MDB发送所有的?br /> 息。一个MDB允许J2EE应用发送异步消息,该应用能处理q些消息。实?span style="font-family: Courier New">javax.jms.
MessageListener接口和?code>@MessageDriven注释该Bean?/code>指定一个Bean是消息驱动Bean?/p>

消息驱动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队列或者主题和通过当一个消息发送到队列或者主?br /> *
调用它的onMessage()Ҏ得到提醒的一个简单的消息驱动
*该Bean打印消息的内?br />
*/

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

客户端是讉KBean的应用程序。虽然没有必要保存在客户层,但是能够作ؓ一个独立的应用QJSPQ?br /> ServletQ或者另一个EJB。客L通过Bean的远E或者本地接口访问EJB中的ҎQ主要取决于客户端和Bean
q行在同一个还是不同的JVM中。这些接口定义了Bean中的ҎQ而由Beancd际实现这些方法。当一?br /> 客户端访问该BeancM的一个方法时Q容器生成Bean的一个代理,被叫做远E对象或者本地对象。远E或?br /> 本地对象接收hQ委z֮到相应的Bean实例Q返回结果给客户端。调用一个Bean中的ҎQ客L使用?br /> 义在EJB不是描述文g的名字查扑ֈBean。在以下实例中,客户端用上下文对象扑ֈ命名?StateLessejb"
Bean?/p>

EJB 客户端实?/p>

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

/**
* 一个调用无状态会话Bean中方法的单的Bean客户?br /> */

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();
}
}


ȝ

EJB3.0开发企业JavaBean是相当容易的。此规范使用元数据注释定义Bean的类型和暴露l客L的方法?br /> 因此Q无Z创Z个执行特定Q务的会话Beanq是映射一个表到实体Bean来更新数据,你都能象使用?br /> 通Java对象和接口一栯行处理,在业务方法中使用元注释向客户端暴露方法。既然你已经理解了EJB的基,
可以到OTN?a >EJB 3.0 Resources Page发现更多信息?/p>



冬天的猪 2007-09-03 10:55 发表评论
]]>
վ֩ģ壺 ٰ| | Ӧ| | | | Ѿ| ԣ| | | | | Ƥɽ| Ͱ| | | | ͷ| | ̫| ÷ӿ| | | ɽ| ̩| Դ| ٺ| | | | | ȷ| | ʷ| | ɽ| | ̫| | dz| ׶|