<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    EJB3.0入門

    Posted on 2007-09-02 22:04 semovy 閱讀(224) 評論(0)  編輯  收藏 所屬分類: EJB
    EJB3.0規范使開發EJB比過去更容易,可能誘惑你考慮開發第一個EJB。如果真是這種情況,那么祝賀你,
    你經成功避免了在你以前EJB開發者的很多挫折,并且享受到EJB3.0開發的便利性。但是你開始開發以前,
    你可能想知道EJB是什么和它們用于什么目的。本篇文章解釋了EJB的基礎和你如何在一個J2EE程序中使用
    它們。

    什么是EJB?

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

    EJB類型

    EJB主要有三種類型:會話Bean,實體Bean和消息驅動Bean。會話Bean完成一個清晰的解耦的任務,例如
    檢查客戶賬戶歷史記錄。實體Bean是一個代表存在于數據庫中業務對象的復雜業務實體。消息驅動Bean用于
    接收異步JMS消息。讓我們更詳細的認識這些類型。

    會話Bean

    會話Bean一般代表著業務流程中象"處理訂單"這樣的動作。會話Bean基于是否維護過度狀態分為有狀
    態或者無狀態。
    無狀態會話Bean 沒有中間狀態。它們不保持追蹤一個方法調用另一個方法傳遞的信息。因此一個無狀
    態業務方法的每一次調用都獨立于它的前一個調用;例如,稅費計算或者轉移賬款。 當計算稅費額的方法被
    調用時,稅費值被計算并返回給調用的方法,沒有必要存儲調用者為將來調用備用的內部狀態。因為它們不
    維護狀態,所以這些Bean是僅僅由容器管理。當客戶端請求一個無狀態的Bean實例時,它可以接收來自由容器管理的無狀態會話Bean實例集中的一個實例。也因為無狀態會話Bean能夠被共享,所以容器可以維護更少
    數量的實例來為大量的客戶端服務。簡單地象該Bean增加元注釋@Stateless 來指定一個 Java Bean作為一個
    無狀態會話Bean被部署和管理。
    一個有狀態的會話Bean維護一個跨越多個方法調用的會話狀態;例如在線購物籃應用。當客戶開始在線
    購物時,客戶的詳細信息從數據庫獲得。相同的信息對于當客戶從購物籃中增加或者移除商品等等操作時被調用的其他方法也是可訪問的 。但是因為該狀態不是在會話結束,系統崩潰或者網絡失敗時保留,所以有狀
    態會話Bean是暫時的。當一個客戶端請求一個有狀態會話Bean實例時,客戶端將會得到一個會話實例,該Bean的狀態只為給客戶端維持。通過向方法增加元注釋@Remove來告訴容器當某個方法調用結束一個有狀態
    會話Bean實例應該被移除。

    會話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對象并且可以依靠主鍵被唯一識別。通
    過包括@Entity 元注釋來指定一個類是一個實體Bean。實體Bean表示來自數據庫的持久化數據,例如客戶表
    中的一個記錄,或者一個員工表中的一個員工記錄。實體Bean也可以被多個客戶端共享。例如一個員工實體
    能夠被多個計算一個員工每年工資總額或者更新員工地址的客戶端使用。實體Bean對象特定變量能夠保持持
    久化。實體Bean中所有沒有@Transient 元注釋的變量需要考慮持久化。EJB3.0的一個主要特色是創建包含使用元數據注釋的對象/關系映射實體Bean的能力。例如,指定實體Bean的empId變量映射到employee表中的
    EMPNO屬性,象下面實例中一樣用@Table(name="Employees") 注釋這個表的名字和用@Column
    (name="EMPNO")注釋empId變量。另外,EJB3.0中的一個特色是你可以很容易的在開發時測試實體
    Bean,可以用Oracle Application Server Entity Test Harness在容器外部運行一個實體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();
    }
    }

    消息驅動Bean

    驅動Bean (MDB) 提供了一個實現異步通信比直接使用Java消息服務(JMS)更容易地方法。創建MDB接
    收異步JMS消息。容器處理為JMS隊列和主題所要求加載處理的大部分工作。它向相關的MDB發送所有的消
    息。一個MDB允許J2EE應用發送異步消息,該應用能處理這些消息。實現javax.jms.
    MessageListener接口和使用@MessageDriven注釋該Bean來指定一個Bean是消息驅動Bean。

    消息驅動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隊列或者主題和通過當一個消息發送到隊列或者主題
    *
    調用它的onMessage()方法得到提醒的一個簡單的消息驅動
    *該Bean打印消息的內容
    */

    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的應用程序。雖然沒有必要保存在客戶層,但是能夠作為一個獨立的應用,JSP,
    Servlet,或者另一個EJB。客戶端通過Bean的遠程或者本地接口訪問EJB中的方法,主要取決于客戶端和Bean
    運行在同一個還是不同的JVM中。這些接口定義了Bean中的方法,而由Bean類實際實現這些方法。當一個
    客戶端訪問該Bean類中的一個方法時,容器生成Bean的一個代理,被叫做遠程對象或者本地對象。遠程或者
    本地對象接收請求,委派它到相應的Bean實例,返回結果給客戶端。調用一個Bean中的方法,客戶端使用定
    義在EJB不是描述文件的名字查找到Bean。在以下實例中,客戶端使用上下文對象找到命名為"StateLessejb"
    Bean。

    EJB 客戶端實例

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

    /**
    * 一個調用無狀態會話Bean中方法的簡單的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();
    }
    }


    總結

    EJB3.0開發企業JavaBean是相當容易的。此規范使用元數據注釋定義Bean的類型和暴露給客戶端的方法。
    因此,無論你將創建一個執行特定任務的會話Bean還是映射一個表到實體Bean來更新數據,你都能象使用普
    通Java對象和接口一樣進行處理,在業務方法中使用元注釋向客戶端暴露方法。既然你已經理解了EJB的基礎,
    可以到OTN中EJB 3.0 Resources Page發現更多信息。

    主站蜘蛛池模板: 日木av无码专区亚洲av毛片| 中文亚洲AV片在线观看不卡| 亚洲图片一区二区| 中文字幕免费在线播放| 在线精品亚洲一区二区三区| fc2免费人成在线视频| 亚洲精品无码久久一线| a级毛片免费全部播放| 久久精品国产亚洲AV麻豆不卡 | 一区二区三区免费视频观看| 亚洲av片一区二区三区| 国产99久久久久久免费看| 最新精品亚洲成a人在线观看| 成全高清在线观看免费| 亚洲黄色免费观看| 免费毛片在线看片免费丝瓜视频| 亚洲色大成网站www| 亚洲A∨精品一区二区三区| 成全高清在线观看免费| 亚洲综合久久久久久中文字幕| 无码精品A∨在线观看免费| 亚洲aⅴ无码专区在线观看| 亚洲熟女乱综合一区二区| 可以免费观看的毛片| 亚洲午夜精品一区二区公牛电影院| 好大好深好猛好爽视频免费| 日韩精品无码永久免费网站| 亚洲成a人片在线观看日本| 日韩免费a级毛片无码a∨ | 久久精品国产精品亚洲毛片| 国产免费久久精品99re丫y| 精品一区二区三区免费毛片| 区久久AAA片69亚洲| 无码人妻久久一区二区三区免费丨 | 国产成人综合亚洲亚洲国产第一页| 欧洲人成在线免费| 亚洲欧美中文日韩视频| 亚洲日韩精品无码一区二区三区 | 午夜两性色视频免费网站| 成在人线av无码免费高潮水| 亚洲天堂一区二区三区四区|