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

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

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

    posts - 495,  comments - 11,  trackbacks - 0
      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ù)庫中數(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ù)庫中業(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)樗鼈儾痪S護(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);例如在線購物籃應(yīng)用。當(dāng)客戶開始在線購物時(shí),客戶的詳細(xì)信息從數(shù)據(jù)庫獲得。相同的信息對(duì)于當(dāng)客戶從購物籃中增加或者移除商品等等操作時(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ù)庫的持久化數(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)更多信息。
    posted on 2007-09-11 16:26 jadmin 閱讀(87) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 美女无遮挡拍拍拍免费视频| 精品国产亚洲AV麻豆 | 国产高清免费的视频| 亚洲午夜精品在线| 日本一区二区三区免费高清| 亚洲制服丝袜精品久久| 青青青国产在线观看免费网站 | 亚洲第一香蕉视频| 无码国产精品一区二区免费式直播| 亚洲黄色在线观看视频| 91热成人精品国产免费| 久久精品国产99国产精品亚洲| 成人毛片18岁女人毛片免费看| 国产偷国产偷亚洲清高APP| 亚洲精品人成无码中文毛片 | 中文有码亚洲制服av片| 成年人免费网站在线观看| 亚洲av无码无线在线观看| 免费大黄网站在线观看| 三级黄色片免费看| 91亚洲精品视频| 成人免费在线观看网站| 国产亚洲精品仙踪林在线播放| 亚洲欧洲精品成人久久奇米网| 最近中文字幕免费大全| 亚洲校园春色小说| 永久久久免费浮力影院| eeuss影院免费直达入口| 久久精品国产99精品国产亚洲性色 | 亚洲乱码一区二区三区在线观看 | 国产亚洲综合一区二区三区| 4338×亚洲全国最大色成网站| 国产婷婷成人久久Av免费高清| 亚洲午夜一区二区电影院| 免费国产成人午夜私人影视| 中文字幕不卡高清免费| 亚洲人成伊人成综合网久久| 亚洲高清成人一区二区三区| 999久久久免费精品播放| 日日摸日日碰夜夜爽亚洲| 亚洲精选在线观看|