• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • J2EE從零開始之EJB(1)

    發表于:2007-04-29來源:作者:點擊數: 標簽:本章內容包括討論ejb開始
    本章討論的內容包括:什么是會話EJB,兩種會話EJB以及它們的區別、特性和應用場合,會話EJB的編程模型。并提供了兩種會話EJB的 開發 實例。 4.1 什么是會話EJB 會話EJB實現了運行于 服務器 上的業務邏輯。對客戶端來說,一個會話對象是一個非持久性的對象。
    本章討論的內容包括:什么是會話EJB,兩種會話EJB以及它們的區別、特性和應用場合,會話EJB的編程模型。并提供了兩種會話EJB的開發實例。

      4.1 什么是會話EJB

      會話EJB實現了運行于服務器上的業務邏輯。對客戶端來說,一個會話對象是一個非持久性的對象。對會話對象的一種理解是把它看成運行在服務器上的客戶端程序的擴展。
       會話EJB一個最顯著的特征是它是依附于客戶端的。從會話EJB的產生和銷毀都由客戶端控制。會話EJB的狀態不會被永久保存。也就是說,會話EJB不具備持久性。
       會話EJB在實際應用中的一個典型例子是訂單的處理。例如對于某個登錄的用戶,他進行訂單的操作由若干步驟完成,在所有步驟完成之前,并不是把每個步驟的操作都記錄到永久性的存儲器(如javascript:;" onClick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" target="_self">數據庫)中,而是由會話EJB暫保存這些狀態數據,并完成所有步驟之后,再把所有的狀態數據提交到相應的處理模塊。另一個類似的例子是寵物商店中的購物車(關于寵物商店的詳細介紹參見第14章),用戶把選購的商品放入購物車中,選完所有商品后才一起結賬,一個購物車可以設計成一個會話EJB。
       會話EJB的狀態指的是會話EJB所保存的某個客戶端的狀態。有狀態會話EJB指的是能夠保持某個客戶端狀態的會話EJB;無狀態會話EJB指的是不保存某個客戶端狀態的會話EJB。因此,從這個意義上說,無狀態會話EJB并不是完全的沒有狀態,它只是沒有保存特定客戶端的狀態而已。無狀態會話EJB適用在不保持客戶端的狀態和狀態不隨客戶端的不同而不同的情況。例如計算一個實數的平方根(不保存狀態);有狀態會話EJB的例子是把商品類型的數據庫映射成無狀態EJB(對于不同客戶端,商品類型是一致的)。很多資料認為會話EJB是有狀態的,而把無狀態會話EJB看做是它的一個特殊情況。之所以采用無狀態會話EJB。僅僅是為了在特殊的情況下,提高會話EJB的效率。也就是說,無狀態會話EJB從響應速度和占用資源方面比有狀態會話EJB效率高。
       在下面的章節中會進一步討論兩種會話EJB的異同。

    4.2 會話EJB編程模型

      如圖4-1所示,會話EJB的編程模型簡述如下:客戶端通過Bean的遠程接口訪問會話對象。而實現這個遠程接口的Java');" target="_self">Java對象是一個會話對象EJBObject。一個EJBObject會話對象是一個能被客戶端通過標準的遠程方法調用Java API訪問的遠程Java對象。從創建到銷毀,會話對象存在于容器中。容器對客戶端來說是透明的,容器為Session對象提供了安全、并發、事務、緩存和其他的服務,每個Session對象擁有一標識。一般情況下,該標識隨著服務器的停止而結束。Session Bean的客戶端視圖與位置無關,一個和Session對象運行在同一個JVM的客戶端和運行在相同或不同機器上的不同JVM的客戶端使用相同的APIs。一個會話對象的客戶端可能是另外一個部署在相同或不同容器上的企業Bean,或者是任意的Java程序,如應用程序、Applet,或Servlet。一個Session Bean的客戶端視圖也可以映射成非Java客戶端環境,如CORBA客戶端,這不是由Java程序語言寫的。
      
       多企業Bean可以安裝在一個容器中。容器允許客戶端通過JNDI查找安裝好的主接口。一個Session Bean的主接口提供了這個Bean創建、刪除的方法。一個會話對象的客戶端視圖是一致的,它不隨session Bean和容器的不同而不同。
       下面深入討論其中相關的問題。

    4.2.1 定位Bean的主接口

      多個EJB可以部署在同一個容器中??蛻舳丝梢允褂肑NDI查找指定企業Bean的主接口。
       客戶端使用JNDI來查找會話Bean的主接口。例如,一個Cart會話Bean的主接口可以使用如下代碼查找。
       Context initialContext = new InitialContext();
       CartHome cartHome = (CartHome)javax.rmi.PortableRemoteObject.narrow(
        initialContext.lookup("java:comp/env/ejb/cart"),CartHome.class);
       一個客戶端的JNDI命名空間可以配置起來包含網絡上在不同機器上的、不同EJB容器中的EJB的主接口。而EJB容器的實際位置對使用企業Bean的客戶端來說是透明的。
       實現主接口的分布式對象(即EJBHome對象)的生命周期是與EJB容器相關的??蛻舳藨贸绦蚩梢垣@取主接口,而且在客戶端的生命周期中多次使用??蛻舳丝梢园阎鹘涌诘囊脗鬟f給另一個應用程序,而接受的應用程序可以使用主接口對象的引用,就和通過JNDI獲取的一樣。
       容器實現了安裝在容器中的EJB的主接口。實現會話Bean主接口的對象叫做EJBHome對象。容器使會話Bean的主接口通過JNDI對客戶端可用。

       主接口允許客戶端進行如下操作。
       ·創建一個新的會話對象
       ·刪除一個會話對象
       ·為會話Bean獲取javax.ejb.EJBMetaData接口
       javax.ejb.EJBMetaData接口使應用程序裝配工具發現關于Session Bean的信息,并允許松散的Client/Server綁定客戶端腳本。
       ·獲取主接口的一個句柄
       主句柄是可序列化的,能寫入到固定的存儲器。然后,句柄可以在另一個不同的JVM中,從固定存儲器中反序列化以獲取主接口的引用。

    4.2.2 創建并使用會話對象

      主接口定義一個或多個create(...)方法,每個方法定義了一種創建會話對象的方式,create方法的參數用來初始化創建的會話對象的狀態。
       下面這個例子演示了有兩個create<METHOD>(...)方法的主接口:
       public interface CartHome extends javax.ejb.EJBHome{
        Cart create(String customerName,String aclearcase/" target="_blank" >ccount)
         throws RemoteException,BadAccountException,CreateException;
       Cart createLargeCart(String customerName,String account)
        throws RemoteException,BadAccountException,CreateException;}
       下面演示了客戶端怎樣使用主接口的create<METHOD>(...)方法創建遠程對象:
       cartHome.create("John","7506");
       客戶端從來不會直接訪問會話Bean類的實例??蛻舳耸褂脮払ean的遠程接口來訪問會話Bean的實例。實現會話Bean的遠程接口的實例由容器提供,它的實例叫做會話EJBObjects。
       會話EJBObject支持:
       ·對象的業務邏輯方法
       會話EJBObject代理對會話Bean實例的業務邏輯方法的調用。
       ·javax.ejb.EJBObject接口定義的方法。這些方法允許客戶端:
       ·獲取會話對象的主接口
       ·獲取會話對象的句柄
       ·測試會話對象是否與另一個是同一個
       ·刪除會話對象
       javax.ebj.EJBObject接口中定義的方法是由容器實現的,而并不是由會話Bean類代理的。
       一個會話Bean運行期對象的例子如圖4-2所示。
       客戶端使用Cart主接口的create方法創建一個Cart會話對象??蛻舳耸褂眠@個會話對象來填寫購物單并購買相關內容。
       假設用戶開始購買后終止一兩天,然后再去完成.客戶端可以通過獲取會話對象的句柄,把句柄序列化到持久性的存儲器中,然后重新用它來創建最初的Cart來實現。
       對下列例子,開始,在JNDI中查找Cart的主接口,然后使用主接口來創建一個Cart會話對象并加入一些購物項:
       CartHome cartHome = (CartHome)javax.rmi.PortableRemoteObject.narrow{
       initialContext.lookup(...),CartHome.class);
       Cart cart = cartHome.createLargeCart(...);
       cart.addItem(66);
       cart.addItem(22);
       下面我們決定稍候完成這次購物,因此要序列化這個Cart會話對象的句柄并把它存在一個文件里:
       Handle cartHandle = cart.getHandle();
       //serialize cartHandle,store in a file...
       最后我們從文件中反序列化句柄,并重新創建cart會話對象的引用,并購買購物單里的商品:
       Handle cartHandle = ...;//deserialize from a file...
       Cart cart = (Cart)javax.rmi.PortableRemoteObject.narrow(
       cartHandle.getEJBObject(),Cart.class);
       cart.purchase();
       cart.remove();

    4.2.3 刪除會話對象

      客戶端可以使用javax.ejb.EJBObject接口的remove()方法刪除一個會話Bean,或者使用接口javax.ejb.EJBHome中定義的remove(Handle hanele)方法。
       因為會話對象沒有主鍵供客戶端訪問,調用方法javax.ejb.EJBHome.remove(Object primaryKey)會拋出異常javax.ebj.RemoveException。
       擁有會話引用的客戶端可以做如下事情:
       ·調用會話對象遠程接口中定義的業務方法
       ·獲取會話對象主接口的引用
       ·獲取會話對象的句柄
       ·在客戶端的范圍內把引用作為參數或返回值
       ·刪除會話對象,會話對象也可以在生命周期到時被容器自動刪除。
       引用一個不存在的會話對象是無效的。試圖調用一個存在的會話對象會拋出異常:java.rmi.NoSuchObjectException。

    4.2.4 會話標識

      會話對象作為創建它的客戶端的私有資源,在客戶端看來是匿名的。和實體對象相反,實體對象有主鍵作為標識,會話對象隱藏它們的標識。結果是,調用會話Bean的EJBObject.getPrimaryKey()方法和EJBHome.remove(Object primaryKey)方法會拋出java.rmi.RemoteException異常。
       如果調用會話Bean的EJBMetaData.getPrimaryKeyClass()方法,會拋出異常java.lang.RuntimeException。
       既然所有的會話隱藏了它它們的標識,就不需要為它們提供finder方法。因此,會話Bean的主接口沒有定義任何finder方法。
       會話對象句柄在客戶端生命結束后可以繼續保持,可以把它序列化到一個持久的存儲器中。當句柄被反序列化后,會話對象可以正常工作,只要服務器上的會話對象依然存在(時間到或服務器關閉會銷毀會話對象)。
       客戶端代碼必須使用javax.rmi.PortableRemoteObject.narrow(...)方法來把調用句柄上的getEJBObject()方法的結果轉化成遠程接口類型。
       自動允許句柄的所有者來調用遠程對象的方法。當會話對象的引用從一個句柄中獲得,并當會話對象的方法被調用時,容器會基于調用的原則進行訪問檢查。
       1. 有狀態會話EJB標識
       有狀態會話對象具有惟一的標識,在容器創建的時候被分配。
       客戶端通過調用isIdentical(EJBObject otherEJBObject)方法能判斷兩個會話對象引用是否一致。
       下面演示了有狀態會話對象中isIdentical方法的使用:
       FooHome fooHome = ...;//obtain home of a stateful session bean
       Foo foo1 = fooHome.create(...);
       Foo foo2 = fooHome.create(...);
       if (foo1.isIdentical(foo1)){//返回true
       ...
       }
       if (foo1.isIdentical(foo2)){//返回false
       ...
       }
       2. 無狀態會話EJB標識
       同一標識對象創建的所有無狀態會話Bean擁有同樣的標識,這個標識是容器分配的。如果無狀態會話EJB被部署了多次(每次部署導致一個不同的home的創建),不同的主接口的會話對象就會有不同的標識。
       當用來比較同一個無狀態什么Bean的不同對象應用時,方法isIdentical(EJBObject otherEJBObject)總會返回true。
       下面例子演示了stateless session object的isIdentical方法的使用。
       FooHome fooHome = .../obtain home of a stateless session bean
       Foo foo1 = fooHome.create();
       Foo foo2 = fooHome.create();
       if (foo1.isIdentical(foo1)){//返回true
        ...
       }
       if (foo1.isIdentical(foo2)){//仍然返回true
        ...
       }
       3. getPrimaryKey()
       會話對象的標識對客戶端來說是透明的,調用會話EJBObject的getPrimaryKey()方法會拋出java.rmi.RemoteException異常。


    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    ...

    熱門標簽

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>