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

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

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

    大風起兮

    我不知道風是在哪一個方向吹

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      7 隨筆 :: 0 文章 :: 3 評論 :: 0 Trackbacks

    無論你創(chuàng)建bean會話是為了執(zhí)行特定任務,還是把表映射到實體bean以更新數(shù)據(jù),都可以使用普通的Java對象和接口來完成這些工作,并且可以通過在業(yè)務方法中使用注釋,把方法提供給客戶端。

    Enterprise JavaBean (EJB) 是可重用的、可移植的 J2EE 組件。EJB 由封裝業(yè)務邏輯的方法組成。譬如說,EJB 可能有這樣的業(yè)務邏輯:包含了更新數(shù)據(jù)庫中客戶數(shù)據(jù)的方法。眾多遠程和本地客戶端可以調(diào)用該方法。另外,EJB 在容器里面運行,這樣開發(fā)人員只要關(guān)注bean里面的業(yè)務邏輯,不必擔心復雜、容易出錯的問題,譬如事務支持、安全性和遠程對象訪問等。EJB 作為普通Java對象(POJO)的形式來開發(fā),開發(fā)人員可以使用元數(shù)據(jù)注釋(metadata annotations)來指定容器如何管理這些bean。

    EJB 包括三種主要類型:會話 bean、實體 bean和消息驅(qū)動的bean。會話bean執(zhí)行獨立的、解除耦合的任務,譬如檢查客戶的信用記錄。實體bean是一個復雜的業(yè)務實體,它代表數(shù)據(jù)庫中存在的業(yè)務對象。消息驅(qū)動的bean用于接收異步JMS 消息。下面,讓我們進一步研究EJB 3.0規(guī)范中的這些類型。

    一、會話bean

    會話bean通常代表業(yè)務流程里面的操作,譬如“處理訂單”。可根據(jù)對話狀態(tài)的保持性,即有狀態(tài)和無狀態(tài)對會話bean進行分類。

    無狀態(tài)的會話 bean沒有內(nèi)部狀態(tài)。它們不跟蹤記錄從一個方法調(diào)用傳遞到另一個方法調(diào)用的信息。因此,每次調(diào)用無狀態(tài)的業(yè)務方法都獨立于前一次調(diào)用,譬如計算稅款或者運費。用某個應稅值調(diào)用計算稅款的方法時,對稅款值進行計算并返回給調(diào)用方法,而不必保存調(diào)用者的內(nèi)部狀態(tài)供以后調(diào)用。因為這些bean并不保持狀態(tài),所以容器對它們進行管理就很簡單。客戶端請求無狀態(tài)的bean實例時,可以從容器保持的無狀態(tài)的會話bean 實例池當中接收一個實例。另外,因為無狀態(tài)的會話 bean可以共享,所以容器可保持數(shù)量較少的實例為許多客戶端提供服務。想指定Java Bean作為無狀態(tài)的會話bean加以部署及管理,只需要為該bean添加注釋@Stateless。

    有狀態(tài)的會話 bean在方法調(diào)用時可保持對話狀態(tài),譬如客戶的網(wǎng)上購物車。客戶開始網(wǎng)上購物時,可以從數(shù)據(jù)庫中檢索客戶的詳細信息。客戶往購物車里面添加商品或者從里面刪除商品、下訂單等時調(diào)用的其他方法也可以使用這些詳細信息。不過,有狀態(tài)的會話bean是暫時性的,因為出現(xiàn)會話終止、系統(tǒng)崩潰或者網(wǎng)絡(luò)故障后,狀態(tài)不復存在。客戶端請求有狀態(tài)的會話bean實例時,就為該客戶端分配一個有狀態(tài)的實例,并為該客戶端保持該組件的狀態(tài)。要指定容器在某個方法完成后刪除有狀態(tài)的會話bean實例,只要為該方法添加注釋@Remove。

    會話 bean示例如下:
                

    import javax.ejb.Stateless.*;

    /*A simple stateless session bean implementing the incrementValue() method of the * CalculateEJB interface.*/

    @Stateless(name="CalculateEJB")

    public class CalculateEJBBean

    implements CalculateEJB

    {

    int value = 0;

    public String incrementValue()

    {

    value++;

    return "value incremented by 1";

    }

    }

    二、實體bean

    實體bean是管理持久性數(shù)據(jù)的一個對象,有可能使用幾個相關(guān)的Java對象,并可以通過主鍵實現(xiàn)惟一性。通過添加@Entity注釋,可以把某類指定為實體bean。實體bean代表數(shù)據(jù)庫中的持久性數(shù)據(jù),如客戶表中的一行或者員工表中的一條員工記錄。實體bean還可以在多個客戶端之間共享。譬如說,某個員工實體bean可以由多個客戶端用于計算某員工的年薪或者更新員工地址。實體bean對象的特定字段可以成為持久性字段。實體bean中沒有被@Transient注釋標記的所有字段都被視為持久性字段。EJB 3.0的一個主要特性就是,能夠使用元數(shù)據(jù)注釋來創(chuàng)建包含對象/關(guān)系映射的實體bean。譬如說,想指定把實體bean的empId字段映射到 Employees表中的EMPNO屬性,就要使用@Table(name="Employees") 來注釋表名,使用 @Column(name="EMPNO") 來注釋字段,如下面的例子所示。另外,EJB 3.0 的一個特性是,在開發(fā)期間可以方便地測試實體bean,因為現(xiàn)在使用 Oracle 應用服務器實體測試工具,就可以在容器外面運行實體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();}

    }

    三、消息驅(qū)動的bean

    消息驅(qū)動的bean(MDB)為實現(xiàn)異步通信提供了一種比使用直接的Java消息服務(JMS)更簡單的方法。MDB用于接收異步JMS消息。容器處理JMS隊列和主題所需的大部分設(shè)置進程。它把所有消息發(fā)送給相關(guān)的MDB。MDB允許J2EE應用程序發(fā)送異步消息,隨后這些消息由應用程序來處理。要把bean指定為MDB,需要實現(xiàn)javax.jms.MessageListener接口,并且用@MessageDriven注釋該bean。

    消息驅(qū)動的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'") } )

    /** A simple Message-Driven Bean that listens to the configured JMS Queue or Topic and gets notified via an * invocation of it's onMessage() method when a message has been posted to the Queue or Topic.The bean

    * prints the contents of the message. */

    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 3.0

    EJB客戶端是訪問bean的應用程序。它不必位于客戶端層上,但可以是獨立的應用程序、Java服務器頁面(JSP)、服務器小程序或者另一個EJB。客戶端通過bean的遠程或本地接口來使用EJB的方法,遠程還是本地取決于客戶端是在同一個JVM里面還是不同的JVM里面。這些接口定義了bean的方法,而bean類負責實際實現(xiàn)這些方法。客戶端訪問bean類的方法時,容器就會為bean生成一個代理,名為遠程或者本地對象。遠程或者本地對象接收請求后,交給相應的bean實例,并將結(jié)果返回給客戶端。想調(diào)用bean的方法,客戶端需要通過使用EJB部署描述符(deployment descriptor)里面定義的bean名稱來找到該bean。在以下的示例中,客戶端使用Context對象找到名為“Statelessejb”的bean。

    EJB 客戶端示例如下:
                

    import javax.naming.Context;

    import javax.naming.InitialContext;

    /* A simple bean client which calls methods on a stateless session 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();
    }

    }

    posted on 2007-07-18 11:55 三胖 閱讀(356) 評論(1)  編輯  收藏

    評論

    # re: EJB 3.0 的三大類型(轉(zhuǎn)) 2007-08-11 22:09 dreamstone
    ejb3還是不錯的,不過現(xiàn)實工作中沒機會用到  回復  更多評論
      


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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 高清永久免费观看| 亚洲国产主播精品极品网红| 女性无套免费网站在线看| 国产伦精品一区二区三区免费下载| 久久综合亚洲色HEZYO社区| 久久黄色免费网站| 国产男女猛烈无遮挡免费网站| 亚洲熟妇无码AV| 男女作爱在线播放免费网站| 久久久久久久综合日本亚洲 | 亚洲精品亚洲人成在线| 毛片免费全部免费观看| 亚洲国产第一站精品蜜芽| a级片在线免费看| 亚洲色大成网站www永久| 午夜福利不卡片在线播放免费 | 精品韩国亚洲av无码不卡区| 日本高清免费观看| 亚洲最新视频在线观看| 国产99久久久久久免费看| 成人免费看黄20分钟| 精品久久久久亚洲| 亚洲午夜久久久久妓女影院| 黄色a三级三级三级免费看| 午夜福利不卡片在线播放免费| 亚洲伊人久久精品| 欧洲精品免费一区二区三区| 亚洲伊人久久大香线焦| 日韩视频免费一区二区三区| 色吊丝性永久免费看码| 日日AV拍夜夜添久久免费| 久久一区二区免费播放| 久久精品国产亚洲精品2020| 影音先锋在线免费观看| 一级成人毛片免费观看| 亚洲?v女人的天堂在线观看| 免费人成网站在线观看不卡| 亚洲成A∨人片在线观看不卡| 日本免费网站视频www区| 久久精品国产亚洲AV无码娇色| 成年女人毛片免费观看97|