<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    無為

    無為則可為,無為則至深!

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

    作者: Lynn Munsinger
    翻譯:草兒
    時(shí)間:2007年8月29日(My Birthday)
    原文地址:http://www.oracle.com/technology/tech/java/newto/introejb.htm


    EJB3.0規(guī)范使開發(fā)EJB比過去更容易,可能誘惑你考慮開發(fā)第一個(gè)EJB。如果真是這種情況,那么祝賀你,
    你經(jīng)成功避免了在你以前EJB開發(fā)者的很多挫折,并且享受到EJB3.0開發(fā)的便利性。但是你開始開發(fā)以前,
    你可能想知道EJB是什么和它們用于什么目的。本篇文章解釋了EJB的基礎(chǔ)和你如何在一個(gè)J2EE程序中使用
    它們。

    什么是EJB?

    一個(gè)企業(yè)JavaBean (EJB)是一個(gè)可重用的,可移植的J2EE組件。 EJB由封裝了業(yè)務(wù)邏輯的多個(gè)方法組成。
    例如,一個(gè)EJB可以有包括一個(gè)更新客戶數(shù)據(jù)庫(kù)中數(shù)據(jù)的方法的業(yè)務(wù)邏輯。多個(gè)遠(yuǎn)程和本地客戶端可以調(diào)用這
    個(gè)方法。另外,EJB運(yùn)行在一個(gè)容器里,允許開發(fā)者只關(guān)注與bean中的業(yè)務(wù)邏輯而不用考慮象事務(wù)支持,安全
    性和遠(yuǎn)程對(duì)象訪問等復(fù)雜和容易出錯(cuò)的事情。EJB以POJO或者普通舊的Java對(duì)象形式開發(fā),開發(fā)者可以用元數(shù)
    據(jù)注釋來定義容器如何管理這些Bean。

    EJB類型

    EJB主要有三種類型:會(huì)話Bean,實(shí)體Bean和消息驅(qū)動(dòng)Bean。會(huì)話Bean完成一個(gè)清晰的解耦的任務(wù),例如
    檢查客戶賬戶歷史記錄。實(shí)體Bean是一個(gè)代表存在于數(shù)據(jù)庫(kù)中業(yè)務(wù)對(duì)象的復(fù)雜業(yè)務(wù)實(shí)體。消息驅(qū)動(dòng)Bean用于
    接收異步JMS消息。讓我們更詳細(xì)的認(rèn)識(shí)這些類型。

    會(huì)話Bean

    會(huì)話Bean一般代表著業(yè)務(wù)流程中象"處理訂單"這樣的動(dòng)作。會(huì)話Bean基于是否維護(hù)過度狀態(tài)分為有狀
    態(tài)或者無狀態(tài)。
    無狀態(tài)會(huì)話Bean 沒有中間狀態(tài)。它們不保持追蹤一個(gè)方法調(diào)用另一個(gè)方法傳遞的信息。因此一個(gè)無狀
    態(tài)業(yè)務(wù)方法的每一次調(diào)用都獨(dú)立于它的前一個(gè)調(diào)用;例如,稅費(fèi)計(jì)算或者轉(zhuǎn)移賬款。 當(dāng)計(jì)算稅費(fèi)額的方法被
    調(diào)用時(shí),稅費(fèi)值被計(jì)算并返回給調(diào)用的方法,沒有必要存儲(chǔ)調(diào)用者為將來調(diào)用備用的內(nèi)部狀態(tài)。因?yàn)樗鼈儾?br /> 維護(hù)狀態(tài),所以這些Bean是僅僅由容器管理。當(dāng)客戶端請(qǐng)求一個(gè)無狀態(tài)的Bean實(shí)例時(shí),它可以接收來自由容器管理的無狀態(tài)會(huì)話Bean實(shí)例集中的一個(gè)實(shí)例。也因?yàn)闊o狀態(tài)會(huì)話Bean能夠被共享,所以容器可以維護(hù)更少
    數(shù)量的實(shí)例來為大量的客戶端服務(wù)。簡(jiǎn)單地象該Bean增加元注釋@Stateless 來指定一個(gè) Java Bean作為一個(gè)
    無狀態(tài)會(huì)話Bean被部署和管理。
    一個(gè)有狀態(tài)的會(huì)話Bean維護(hù)一個(gè)跨越多個(gè)方法調(diào)用的會(huì)話狀態(tài);例如在線購(gòu)物籃應(yīng)用。當(dāng)客戶開始在線
    購(gòu)物時(shí),客戶的詳細(xì)信息從數(shù)據(jù)庫(kù)獲得。相同的信息對(duì)于當(dāng)客戶從購(gòu)物籃中增加或者移除商品等等操作時(shí)被調(diào)用的其他方法也是可訪問的 。但是因?yàn)樵摖顟B(tài)不是在會(huì)話結(jié)束,系統(tǒng)崩潰或者網(wǎng)絡(luò)失敗時(shí)保留,所以有狀
    態(tài)會(huì)話Bean是暫時(shí)的。當(dāng)一個(gè)客戶端請(qǐng)求一個(gè)有狀態(tài)會(huì)話Bean實(shí)例時(shí),客戶端將會(huì)得到一個(gè)會(huì)話實(shí)例,該Bean的狀態(tài)只為給客戶端維持。通過向方法增加元注釋@Remove來告訴容器當(dāng)某個(gè)方法調(diào)用結(jié)束一個(gè)有狀態(tài)
    會(huì)話Bean實(shí)例應(yīng)該被移除。

    會(huì)話Bean實(shí)例

    import javax.ejb.Stateless.*;

    /**
    * 一個(gè)簡(jiǎn)單無狀態(tài)會(huì)話Bean實(shí)現(xiàn)了CalculateEJB接口的incrementValue()方法
    **/

    @Stateless(name="CalculateEJB")
    public class CalculateEJBBean
    implements CalculateEJB
    {
    int value = 0;
    public String incrementValue()
    {
    value++;
    return "value incremented by 1";
    }
    }

    實(shí)體Bean

    實(shí)體Bean是管理持久化數(shù)據(jù)的一個(gè)對(duì)象,潛在使用一些相關(guān)的Java對(duì)象并且可以依靠主鍵被唯一識(shí)別。通
    過包括@Entity 元注釋來指定一個(gè)類是一個(gè)實(shí)體Bean。實(shí)體Bean表示來自數(shù)據(jù)庫(kù)的持久化數(shù)據(jù),例如客戶表
    中的一個(gè)記錄,或者一個(gè)員工表中的一個(gè)員工記錄。實(shí)體Bean也可以被多個(gè)客戶端共享。例如一個(gè)員工實(shí)體
    能夠被多個(gè)計(jì)算一個(gè)員工每年工資總額或者更新員工地址的客戶端使用。實(shí)體Bean對(duì)象特定變量能夠保持持
    久化。實(shí)體Bean中所有沒有@Transient 元注釋的變量需要考慮持久化。EJB3.0的一個(gè)主要特色是創(chuàng)建包含使用元數(shù)據(jù)注釋的對(duì)象/關(guān)系映射實(shí)體Bean的能力。例如,指定實(shí)體Bean的empId變量映射到employee表中的
    EMPNO屬性,象下面實(shí)例中一樣用@Table(name="Employees") 注釋這個(gè)表的名字和用@Column
    (name="EMPNO")注釋empId變量。另外,EJB3.0中的一個(gè)特色是你可以很容易的在開發(fā)時(shí)測(cè)試實(shí)體
    Bean,可以用Oracle Application Server Entity Test Harness在容器外部運(yùn)行一個(gè)實(shí)體Bean。

    實(shí)體Bean實(shí)例

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

    消息驅(qū)動(dòng)Bean

    驅(qū)動(dòng)Bean (MDB) 提供了一個(gè)實(shí)現(xiàn)異步通信比直接使用Java消息服務(wù)(JMS)更容易地方法。創(chuàng)建MDB接
    收異步JMS消息。容器處理為JMS隊(duì)列和主題所要求加載處理的大部分工作。它向相關(guān)的MDB發(fā)送所有的消
    息。一個(gè)MDB允許J2EE應(yīng)用發(fā)送異步消息,該應(yīng)用能處理這些消息。實(shí)現(xiàn)javax.jms.
    MessageListener接口和使用@MessageDriven注釋該Bean來指定一個(gè)Bean是消息驅(qū)動(dòng)Bean。

    消息驅(qū)動(dòng)Bean實(shí)例

    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'")

    }
    )

    /**
    *監(jiān)聽可配置JMS隊(duì)列或者主題和通過當(dāng)一個(gè)消息發(fā)送到隊(duì)列或者主題
    *
    調(diào)用它的onMessage()方法得到提醒的一個(gè)簡(jiǎn)單的消息驅(qū)動(dòng)
    *該Bean打印消息的內(nèi)容
    */

    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

    客戶端是訪問Bean的應(yīng)用程序。雖然沒有必要保存在客戶層,但是能夠作為一個(gè)獨(dú)立的應(yīng)用,JSP,
    Servlet,或者另一個(gè)EJB??蛻舳送ㄟ^Bean的遠(yuǎn)程或者本地接口訪問EJB中的方法,主要取決于客戶端和Bean
    運(yùn)行在同一個(gè)還是不同的JVM中。這些接口定義了Bean中的方法,而由Bean類實(shí)際實(shí)現(xiàn)這些方法。當(dāng)一個(gè)
    客戶端訪問該Bean類中的一個(gè)方法時(shí),容器生成Bean的一個(gè)代理,被叫做遠(yuǎn)程對(duì)象或者本地對(duì)象。遠(yuǎn)程或者
    本地對(duì)象接收請(qǐng)求,委派它到相應(yīng)的Bean實(shí)例,返回結(jié)果給客戶端。調(diào)用一個(gè)Bean中的方法,客戶端使用定
    義在EJB不是描述文件的名字查找到Bean。在以下實(shí)例中,客戶端使用上下文對(duì)象找到命名為"StateLessejb"
    Bean。

    EJB 客戶端實(shí)例

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

    /**
    * 一個(gè)調(diào)用無狀態(tài)會(huì)話Bean中方法的簡(jiǎn)單的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();
    }
    }


    總結(jié)

    EJB3.0開發(fā)企業(yè)JavaBean是相當(dāng)容易的。此規(guī)范使用元數(shù)據(jù)注釋定義Bean的類型和暴露給客戶端的方法。
    因此,無論你將創(chuàng)建一個(gè)執(zhí)行特定任務(wù)的會(huì)話Bean還是映射一個(gè)表到實(shí)體Bean來更新數(shù)據(jù),你都能象使用普
    通Java對(duì)象和接口一樣進(jìn)行處理,在業(yè)務(wù)方法中使用元注釋向客戶端暴露方法。既然你已經(jīng)理解了EJB的基礎(chǔ),
    可以到OTN中EJB 3.0 Resources Page發(fā)現(xiàn)更多信息。



    凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
    、轉(zhuǎn)載請(qǐng)注明來處和原文作者。非常感謝。

    posted on 2007-09-02 14:22 草兒 閱讀(22618) 評(píng)論(1)  編輯  收藏 所屬分類: 軟件構(gòu)架 、JAVA WEB應(yīng)用

    Feedback

    # re: EJB3.0入門[未登錄] 2008-06-27 18:51 sean
    jboss測(cè)試失敗。  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 中文字幕永久免费视频| 亚洲精品国产精品乱码在线观看| 免费的全黄一级录像带| WWW国产亚洲精品久久麻豆| 亚洲另类古典武侠| 亚洲va无码手机在线电影| 亚洲乱码中文字幕手机在线| 成人在线视频免费| 嫖丰满老熟妇AAAA片免费看| 久久国产免费观看精品| 国产黄在线观看免费观看不卡 | 亚洲一级片免费看| 国产AV无码专区亚洲AV麻豆丫| 亚洲中文久久精品无码1 | 免费一级毛片在线播放视频| 成在线人直播免费视频| 国产区图片区小说区亚洲区| 亚洲人成电影网站免费| 亚洲AV无码乱码麻豆精品国产 | 免费国产成人高清在线观看网站| 久久大香香蕉国产免费网站| 在线人成免费视频69国产| 美女无遮挡拍拍拍免费视频 | 免费黄色网址入口| 思思99re66在线精品免费观看| 日日麻批免费40分钟日本的| 亚洲人成免费网站| 在线看无码的免费网站| 一级毛片**不卡免费播| 蜜桃成人无码区免费视频网站 | 久久精品国产亚洲av瑜伽| 亚洲精品GV天堂无码男同| 中文字幕亚洲精品无码| 亚洲午夜精品一区二区麻豆| 亚洲性色AV日韩在线观看| jzzijzzij在线观看亚洲熟妇| 亚洲AV无码AV吞精久久| 黄色一级视频免费观看| 无码日韩人妻AV一区免费l| 人人公开免费超级碰碰碰视频| 国产免费久久精品99久久|