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

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

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

    posts - 0, comments - 77, trackbacks - 0, articles - 356
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    EJB3.0入門

    Posted on 2007-09-02 22:04 semovy 閱讀(224) 評(píng)論(0)  編輯  收藏 所屬分類: EJB
    EJB3.0規(guī)范使開(kāi)發(fā)EJB比過(guò)去更容易,可能誘惑你考慮開(kāi)發(fā)第一個(gè)EJB。如果真是這種情況,那么祝賀你,
    你經(jīng)成功避免了在你以前EJB開(kāi)發(fā)者的很多挫折,并且享受到EJB3.0開(kāi)發(fā)的便利性。但是你開(kāi)始開(kāi)發(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è)容器里,允許開(kāi)發(fā)者只關(guān)注與bean中的業(yè)務(wù)邏輯而不用考慮象事務(wù)支持,安全
    性和遠(yuǎn)程對(duì)象訪問(wèn)等復(fù)雜和容易出錯(cuò)的事情。EJB以POJO或者普通舊的Java對(duì)象形式開(kāi)發(fā),開(kāi)發(fā)者可以用元數(shù)
    據(jù)注釋來(lái)定義容器如何管理這些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ù)過(guò)度狀態(tài)分為有狀
    態(tài)或者無(wú)狀態(tài)。
    無(wú)狀態(tài)會(huì)話Bean 沒(méi)有中間狀態(tài)。它們不保持追蹤一個(gè)方法調(diào)用另一個(gè)方法傳遞的信息。因此一個(gè)無(wú)狀
    態(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)用的方法,沒(méi)有必要存儲(chǔ)調(diào)用者為將來(lái)調(diào)用備用的內(nèi)部狀態(tài)。因?yàn)樗鼈儾?br /> 維護(hù)狀態(tài),所以這些Bean是僅僅由容器管理。當(dāng)客戶端請(qǐng)求一個(gè)無(wú)狀態(tài)的Bean實(shí)例時(shí),它可以接收來(lái)自由容器管理的無(wú)狀態(tài)會(huì)話Bean實(shí)例集中的一個(gè)實(shí)例。也因?yàn)闊o(wú)狀態(tài)會(huì)話Bean能夠被共享,所以容器可以維護(hù)更少
    數(shù)量的實(shí)例來(lái)為大量的客戶端服務(wù)。簡(jiǎn)單地象該Bean增加元注釋@Stateless 來(lái)指定一個(gè) Java Bean作為一個(gè)
    無(wú)狀態(tài)會(huì)話Bean被部署和管理。
    一個(gè)有狀態(tài)的會(huì)話Bean維護(hù)一個(gè)跨越多個(gè)方法調(diào)用的會(huì)話狀態(tài);例如在線購(gòu)物籃應(yīng)用。當(dāng)客戶開(kāi)始在線
    購(gòu)物時(shí),客戶的詳細(xì)信息從數(shù)據(jù)庫(kù)獲得。相同的信息對(duì)于當(dāng)客戶從購(gòu)物籃中增加或者移除商品等等操作時(shí)被調(diào)用的其他方法也是可訪問(wèn)的 。但是因?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)只為給客戶端維持。通過(guò)向方法增加元注釋@Remove來(lái)告訴容器當(dāng)某個(gè)方法調(diào)用結(jié)束一個(gè)有狀態(tài)
    會(huì)話Bean實(shí)例應(yīng)該被移除。

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

    import javax.ejb.Stateless.*;

    /**
    * 一個(gè)簡(jiǎn)單無(wú)狀態(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í)別。通
    過(guò)包括@Entity 元注釋來(lái)指定一個(gè)類是一個(gè)實(shí)體Bean。實(shí)體Bean表示來(lái)自數(shù)據(jù)庫(kù)的持久化數(shù)據(jù),例如客戶表
    中的一個(gè)記錄,或者一個(gè)員工表中的一個(gè)員工記錄。實(shí)體Bean也可以被多個(gè)客戶端共享。例如一個(gè)員工實(shí)體
    能夠被多個(gè)計(jì)算一個(gè)員工每年工資總額或者更新員工地址的客戶端使用。實(shí)體Bean對(duì)象特定變量能夠保持持
    久化。實(shí)體Bean中所有沒(méi)有@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è)特色是你可以很容易的在開(kāi)發(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來(lái)指定一個(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)聽(tīng)可配置JMS隊(duì)列或者主題和通過(guò)當(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

    客戶端是訪問(wèn)Bean的應(yīng)用程序。雖然沒(méi)有必要保存在客戶層,但是能夠作為一個(gè)獨(dú)立的應(yīng)用,JSP,
    Servlet,或者另一個(gè)EJB。客戶端通過(guò)Bean的遠(yuǎn)程或者本地接口訪問(wèn)EJB中的方法,主要取決于客戶端和Bean
    運(yùn)行在同一個(gè)還是不同的JVM中。這些接口定義了Bean中的方法,而由Bean類實(shí)際實(shí)現(xiàn)這些方法。當(dāng)一個(gè)
    客戶端訪問(wèn)該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)用無(wú)狀態(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開(kāi)發(fā)企業(yè)JavaBean是相當(dāng)容易的。此規(guī)范使用元數(shù)據(jù)注釋定義Bean的類型和暴露給客戶端的方法。
    因此,無(wú)論你將創(chuàng)建一個(gè)執(zhí)行特定任務(wù)的會(huì)話Bean還是映射一個(gè)表到實(shí)體Bean來(lái)更新數(shù)據(jù),你都能象使用普
    通Java對(duì)象和接口一樣進(jìn)行處理,在業(yè)務(wù)方法中使用元注釋向客戶端暴露方法。既然你已經(jīng)理解了EJB的基礎(chǔ),
    可以到OTN中EJB 3.0 Resources Page發(fā)現(xiàn)更多信息。

    主站蜘蛛池模板: 在线亚洲精品自拍| 波多野结衣久久高清免费| 亚洲日韩涩涩成人午夜私人影院| 亚洲一区精彩视频| 和日本免费不卡在线v| 亚洲国产亚洲片在线观看播放 | 狠狠色婷婷狠狠狠亚洲综合| 最新亚洲人成网站在线观看 | 国产在线观a免费观看| 亚洲国产精品无码久久久蜜芽| 亚洲视频在线免费| 久久亚洲精品视频| 99在线观看视频免费| 亚洲制服在线观看| 成年女人看片免费视频播放器| 亚洲国产AV无码一区二区三区| 国产一级淫片免费播放| 人妻无码中文字幕免费视频蜜桃 | 成人性生交大片免费看无遮挡 | 亚洲日本香蕉视频| 三级黄色片免费看| 亚洲小视频在线观看| 99久久久国产精品免费无卡顿| 精品国产日韩久久亚洲| 国产大片91精品免费看3| 国产精品美女免费视频观看| 久久被窝电影亚洲爽爽爽| 91九色老熟女免费资源站 | 亚洲AV成人精品网站在线播放 | 久久久久久亚洲精品影院| 国产一级做a爱免费视频| 丝袜捆绑调教视频免费区| 亚洲熟妇无码久久精品| 全免费a级毛片免费**视频| 成人特级毛片69免费观看| 国产男女性潮高清免费网站| 中文字幕在线成人免费看| 亚洲精彩视频在线观看| 免费一级毛片一级毛片aa| 亚洲免费福利视频| 无码 免费 国产在线观看91|