程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> Enterprise JavaBeans導論二

Enterprise JavaBeans導論二

編輯:J2EE
理解EJB組件 你現在應該已經熟悉了整個EJB體系結構及其主要的部件。這一節更詳細地描述了這些部件,並解釋它們運行時的行為語意。 Home接口 EJB庫使用enterprise bean的客戶端通過它的home接口創建它的實例。Home接口包含一個或多個用來創建enterprise bean實例的create()方法。這個home接口不是由bean來實現,而是通過稱為home object的類來實現。一個home object的實例在服務器中實例化,使得客戶端可以訪問它們。 定位home object 一個home object的引用被放在名字服務中,客戶端能通過JNDI訪問它。EJB服務器一般提供某種名字空間的實現,雖然有時可以使用外部的名字空間。在這兩種情況下客戶端都必須知道名字空間的位置以及JNDI的上下文類。例如,一個客戶端的applet可能接收名字空間和JNDI上下文類作為applet的參數。 除了提供位置和類名,客戶端也必須知道在名字樹中定位home object.這些必須在客戶端啟動時提供。當部署者把enterprise bean部署進EJB服務器中時,他必須可以以參數形式指定名字樹,如ejb/accounting/AccountsPayable.客戶端必須獲得這個完整的路徑名來定位並獲得AccountsPayable home object的引用。並不是說客戶端通過JNDI獲得容器。客戶端使用JNDI查找home接口的實現。Home接口的實現由某個特殊的container來提供,但這是該容器廠商的細節,enterprise bean開發者和客戶端應該忽略它。 Home接口中的方法 Enterprise bean開發者定義ejbCreate()方法的同時必須在home接口中聲明與其相應的create()方法。實體bean可以包含finder方法以使得客戶端能定位已有的實體bean. Home接口是通過繼承javax.ejb.EJBHome來定義的。該接口包含如下的方法: public interface javax.ejb.EJBHome extends Remote { public EJBMetaData getEJBMetaData() throws RemoteException; public void remove(Handle handle) throws RemoteException,RemoveException; public void remove(Object primaryKey) throws RemoteException,RemoveException; 一個bean的home接口可以象下面這樣: public interface myHome extends EJBHome { public myRem create() throws RemoteException,CreateException; public myRem create(String str) throws RemoteException,CreateException; 其中 public interface myRem extends EJBObject { … } 容器開發商負責提供實現home接口的home對象,因為只有開發商才能實現存貯enterprise bean的庫的編碼。 容器 定義容器在理解EJB規范時容器這個術語並不應從字面上簡單地理解為類,而是一層代替bean執行相應服務的接口。容器開發商提供運行在EJB服務器中一套完成這些功能的工具和接口。 這些服務包括: ·與二級存儲中交換(對會話bean) ·持久性管理(對實體bean) ·實現創建和查找服務的home object的可用性 ·在可通過JNDI訪問的名字空間home object的可視性 ·正確的創建、初始化和刪除bean ·保證商業方法正確地運行在事務上下文中 ·實現某一基本的安全服務 ·從home object和EJBObject上的RMI上產生stub和skeleton 容器和EJBObject對規范經常引用由容器或EJBObject提供的服務。這些服務只是用來說明而不暗示特殊類的服務需求。支持enterprise bean的EJBObject和容器類都由容器開發商提供。這些類必須完成bean容器的功能。對bean來說容器和EJBObject是不同的入口點,對某個特殊的服務提供支持獨特的能力。例如,容器通過讀部署描述符來知道應用於bean方法的事務屬性。然而,這些商業方法通過EJBObject調用。 EJBObject必須與容器通訊來確定調用商業方法的事務上下文。確定以後,EJBObject在調用商業方法以前建立事務上下文。重要的是EJBObject 和容器的協同工作來實現容器所需的事務。容器廠商提供二者的實現,但對二者的功能分割卻是自由的。與home接口的關系 目前廠商提供工具來讀home 接口並產生作為容器的home object.在這種情況下廠商對每個enterprise bean類使用不同的容器類。容器廠商可以使用其它的實現策略,如一個容器類實現多個home接口,甚至一個標准的容器類創建獨立的home object實現。唯一的必要條件是容器廠商必須使客戶端能通過JNDI訪問home object. 客戶端和bean開發者都不需關心容器和home object的實現細節。 Enterprise JavaBean Enterprise bean是開發者編寫的提供應用程序功能的類。開發者可以選擇創建會話bean或實體bean,通過實現不同的接口聲明其部署描述符來加以區分。 對於會話bean: public class myBean implements javax.ejb.SessionBean … 對於實體bean: public class myBean implements javax.ejb.EntityBean … 客戶端不會直接訪問enterprise bean中的任何方法。客戶端通過EJBObject 間接調用bean中的方法,EJBObject就象一個代理一樣。在把調用通過EJBObject傳遞時,容器開發商通過包裝編碼插入其自己的功能,這稱為方法插入。方法插入的一個例子是為每個方法調用創建一個新的事務上下文,當方法返回到EJBObject時提交或回滾事務。 當容器廠商的工具在安裝bean產生stub和skeleton時,它產生bean的EJBObject一個stub和skeleton.實際上它並不創建bean本身的stub和skeleton,因為bean不會通過網絡被訪問。EJBObject是真正的網絡對象。Bean 是包含應用相關的商業編碼的代表。 容器也可以調用bean中的某個方法。例如,容器保證當一個bean 實例生成後,home object中的create()的任何參數會傳遞bean相應的ejbCreate()方法。 Enterprise bean還有其它的接口和要求。然而,會話bean和實體bean的要求是不同的。這些在隨後詳述會話和實體bean的章節中會cover. Remote Interface 編寫完enterprise bean後開發者創建了一個客戶端可訪問創建方法的home interface,在home interface中每一個create()方法在相應的bean中都必須有一個ejbcreate()方法。同樣,開發者必須創建描述客戶端能夠訪問的商業方法的remote interface。 因為所有的客戶端調用都通過EJBObject,因此實現這個接口的是EJBObject而不是home object. Remote interface中列出的方法名和signature必須和實現bean的方法名和signature相同。這不同於home interface--方法signature是一樣的,而名字卻不同。以下是一個remote interface的例子: public interface Account extends javax.ejb.EJBObject { public void deposit(double amount) throws RemoteException; public void withdraw(double amount) throws RemoteException; public double balance() throws RemoteException; } 所有聲明的方法都必須拋出一個RemoteException例外,因為規范要求客戶端stub是RMI兼容的。但這並不意味著排除了用其它的傳輸方式的stub/skeleton實現,如CORBA/IIOP. Remote interface繼承javax.ejb.EJBObject接口,增加了額外的方法要求。 EJBObject EJBObject是網絡上可視的對象,包含stub和skeleton,作為bean的代理。Bean的remote interface繼承了EJBObject接口,而EJBObject類實現這個remote interface,使得bean類有自己的EJBObject類。對每個bean類有一個定制的EJBObject類。 如下是EJBObject接口的定義,被bean的remote interface繼承: public interface javax.ejb.EJBObject extends Java.rmi.Remote { public EJBHome getEJBHome() throws RemoteException; public Object getPrimaryKey() throws RemoteException; public Handle getHandle() throws RemoteException; public void remove() throws RemoteException,RemoveException; public boolean isIdentical(EJBObject other) throws RemoteException; } 實現這個接口的EJBObject類是一個RMI服務器對象,因為它是他實現了一個RMI remote interface.注意bean本身不是一個remote object,在網絡上是不可視的。當容器實例化了這個EJBObject類時,容器會初始化bean實例的引用,使得它能正確地delegate商業方法調用。 廠商的實現是維護EJBObject實例和bean實例的一對一關系。因為remote interface包含EJBObject接口的方法,所以bean不必顯式地實現這個接口,雖然它提供了列出的商業方法的實現。因為EJBObject必須正式地實現bean的remote interface,容器在bean安裝時產生EJBObject的源代碼,這些產生的源代碼實現了bean的remote interface.典型的EJBObject有一個獨特的類名,作為EJBObject類和bean的聯系。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved