現在,從如下幾個方面來介紹Enterprise bean的開發:
一、開發EJB的主要關鍵的步驟
二、如何使用使用Jbuilder
三、使用Jbuilder之外的其它的開發工具
四、如何開發Eneterprise Beans的詳細的細節
一、開發EJB的主要步驟:
一般來說,整個的開發步驟(開發,配置,組裝)包括如下幾個方面:
開發:首先要定義三個類:Bean類本身,Bean的本地(Home)和遠程(Remote)介面類。
配置:配置包括產生配置描述器--這是一個XML檔案、聲明了Enterprise Bean的屬性、綁定了bean的class檔案(包括stub檔案和skeleton檔案)。最後將這些配置都放到一個jar檔案中。還需要在配置器中定義環境屬性。
組裝應用程式:包括將Enterprise beans安裝到Server伺服器中,測試各層的串連情況。程式組合器將若干個Enterprise Beans與其它的組件(Servlet,Applet,Script等等)結合起來。組合成一個完整的應用程式。或者將若干個Enterprise beans組合成一個複雜的Enterprise Bean。
管理Enterprise Bean。
二、使用Jbuilder:
Jbuilder與EJB Container能夠進行無縫串連。Jbuilder和Inprise的應用伺服器包括了所有的開發和配置Enterprise Beans的工具以及所需要的庫:
運行和管理Enterprise Bean的容器。
命名服務。
事務服務。
Java資料庫。
開發Enterprise Beans所需要的API。
一個增強java-to-iiop編譯器,支援實值型別和RMI訊號。
Jbuilder還提供了一個快速開發應用程式Enterprise Beans的工具和嚮導。通過簡單而且直觀的步驟,嚮導協助你建立一個Enterprise Bean。自己設定某些預設值,產生了bean的模板,在上面,我們可以增加我們自己的應用邏輯。
Jbuilder也提供了一個EJB的介面產生嚮導。嚮導在Enterprise Bean的公用方法基礎上產生了Remote介面和Home介面。Jbuilder還提供一個配置器的嚮導協助我們逐步的建立XML描述器檔案。並將產生的Stubs集中到一個jar檔案中。
三、使用Jbuilder之外的Integration Environment:
如果你使用其它的除了別的Integration Environment(IDE)。要確定使用了Integration EnvironmentIDE所帶的容器工具。也要驗證IDE是否支援EJB規範的相應的版本,還要確定它是否正確的支援EJB的API。
要確定JD到所支援的EJB容器的版本。可以通過檢查Inprise的安裝說明來確定EJB容器所支援的支援JDK的版本。
在配置Enterprise Bean的時候,你必須使用Inprise的應用伺服器所提供的工具。這些工具能夠編輯和修改第三方的代理商提供的Inprise配置描述器。還能夠驗證配置描述器,能夠驗證bean的原始碼。
四、Enterprise Beans的開發:
這一節我們主要討論Enterprise bean的提供者要開發enterprise bean必須完成的任務上面。這些任務包括:
定義和編寫Enterprise bean類:這是Enterprise bean內部應用邏輯的實現。
編寫Enterprise bean的遠程remote介面類。
編寫Enterprise bean的本地home 介面類。
說明主鍵類,主鍵類只是對於Entity bean才需要的。在Enterprise bean的配置描述器中指定主鍵的名字。
Enterprise beans提供者定義了遠程(Remote)介面和本地(home)介面,實現了Enterprise bean類本身。Remote介面中提供了客戶調用Enterprise bean實現的應用邏輯函數的介面。而home介面提供了產生和定位remote介面執行個體的方法。
在Enterprise bean本身類的實現,本地home介面,遠程remote介面之間並沒有正式的聯絡(例如繼承關係)。但是,在三個類裡面聲明的方法卻必須遵守EJB裡面定義的規範。例如: 你在Enterprise bean裡面聲明了一個應用程式的方法或者說應用邏輯。也在beans的remote介面中聲明了這個方法,那麼,這兩個地方必須要同樣的名字。Bean的實現裡面必須至少有一個Create()方法:ejbCreate()。但是可以有多個帶有不同參數的create()方法。在home介面中,也必須有相同的方法定義(參數的個數相同)。EjbCreate()方法返回的一個容器管理的持久對象。它們都返回一個容器管理持久性的主索引值。但是,在home的相應的Create()方法中傳回值的類型是remote介面。
注意:實體bean的實現的ejbCreate()方法有點不同。實體bean可以不定義ejbCreate()方法。如果實體只是通過應用程式或通過資料庫管理程式的的途徑被加到資料庫中,實體bean就省略了ejbCreate()方法。ejbCreate()返回的值是主鍵類型的。如果ejbCreate()方法是容器管理持久性的實體bean的方法,它的傳回值就是NULL類型。如果實體bean實現了Bean管理的持久性,ejbCreate()方法就傳回值類型就是主鍵類型。在以後,我們會詳細討論它們的不同。
Entereprise Bean提供者定義了Enterprise bean的語義。容器的任務是把home介面,remote介面和Enterprise bean的實作類別結合起來。保證在編譯時間和運行時,remote介面和bean的實作類別是相對應的。
Enterprise bean的繼承關係:
Enterprise bean的實作類別,remote介面,home介面都要從不同的基類中繼承下來。Home介面是從javax.ejb.EJBHome中繼承過來的。Remote介面從javax.ejb.EJBObject中繼承而來。Remote和home介面的基類都是javax.rmi.Remote。
一個會話bean必須實現基類javax.ejb.SessionBean。而實體bean必須實現基類javax.ejb.EntiyBean。這些EJB的基類都是從javax.ejb.EnterpriseBean繼承而來。而javax.ejb.EnterpriseBean又是從java.io.Serializable繼承而來。
Remote 介面:
每一個Enterprise Bean都必須有一個remote介面。Remote介面定義了應用程式規定客戶可以調用的邏輯操作。這些是一些可以由客戶調用的公用的方法,通常由Enterprise beans類來實現。注意,Enterprise bean的客戶並不直接存取Bean。而是通過remote介面來訪問。
EJBObject基類:
Enterprise bean類的remote介面擴充了javax.ejb.EJBObject類的公用java介面。而Javax.ejb.EJBObject是所有remote介面的基類。其代碼如下:
package javax.ejb;
public interface EJBObject extends java.rmi.Remote{
public EJBHome getEJBHome() throws java.rmi.RemoteException;
public Object getPrimaryKey() throws java.rmi.RemoteException;
public void Remove() throws java.rmi.RemtoeException, java.rmi.RemoveException
public Handle getHandle() throws java.rmi.RemoteException;
boolean isIdentical (EJBObject p0) throws java.rmi.RemoteException;
}
getEJBHome()方法允許你取得一個相關的Home介面。對於 實體Bean,用getPrimaryKey()方法獲得實體Bean的主索引值。Remove()可以刪除一個Enterprise bean。具體的語義在各種不同類型的enterprise beans的生命週期中,由上下文中解釋的。方法getHandle()返回了一個Enterprise bean執行個體的持久的控制代碼。IsIndentical()方法允許你去比較Enterprise beans是否相同。
方法的要求:
所有的remote介面中的方法必須聲明為公用(public)的,並必須拋出java.rmi.RemotException異常。另外,所有的remote介面中的方法定義的參數和都必須是在RMI-IIOP中有效。對每一個在remote介面中定義的方法,在Enterprise bean 類裡面都要有相應的方法。相應的方法必須要有同樣的名字,同樣類型和數量的參數,同樣的傳回值,而且還要拋出同樣的例外。
如下代碼顯示了一個ATM例子的會話bean的remote介面Atm,。裡面聲明了一個應用方法transfer()。黑體部分表示EJB規範中必須要有的內容。Remote介面必須擴充javax.ejb.EJBObject類。從用戶端調用的Enterprise bean的每一個方法都必須在remote介面中聲明。Transfer()方法拋出了兩個意外。其中InSufficientFundsException例外是應用程式定義的意外。
Public interface Atm extends javax.ejb.EJBObject{
Public void transfer(String Source, String Target, float amount)
Throws java.rmi.RemoteException, InSufficientFundsException;
}
對於remote介面的定義規則,會話bean和實體bean是一樣的。
Home介面:
Enterprise bean的Home介面控制著bean的生命週期。提供了Enterprise bean對象(也就是對Enterprise bean的執行個體)的Create(),find(),remove()操作。會話bean和實體bean有不同的生命週期。所以,它們的home介面必須定義不同的方法。
Enterprise bean的提供者必須定義home介面,而由EJB容器來實現home介面。
與Remote介面相似,Home介面中方法中的參數,傳回值也必須是RMI-IIOP有效。所有的方法必須拋出java.rmi.RemoteException例外。
Home介面必須定義一個或多個的Create()方法。每一個這樣的Create()方法都必須命名為Create。並且,它的參數,不管是類型還是數量都必須與bean類裡面的ejbCreate()方法對應。注意,home介面中的Create()方法和bean類中ejbCreate()方法的傳回值類型是不同的。
實體bean的home介面還包含find()方法。
EJBHome的基類:
每一個Home介面都擴充了javax.ejb.EJBHome介面。如下代碼顯示了javax.ejb.EJBHome介面的定義:
package javax.ejb;
public interface EJBHome extends java.rmi.Remote() {
void remove(Handle handle) throws java.rmi.RemoteException,RemoveException;
void remove(Object primarykey) throws java.rmi.RemoteException,RemoveException;
EJBMetaData getEJBMetaData() throws RemoteException;
Homehandle getHomeHandle() throws RemoteException;
}
這裡提供了兩個remove()方法來刪除Enterprise bean的執行個體。第一個remove方法是通過控制代碼來刪除一個Enterprise bean的執行個體。第二個remove方法通過主鍵來刪除一個Enterprise bean的執行個體。
在眾多的Enterprise bean執行個體中,控制代碼唯一的標識一個執行個體。一個控制代碼與它引用的Enterprise bean有相同的生命期。考慮一個實體物件,客戶可以通過一個控制代碼來重新獲得相應的Enterprise bean的執行個體。一個控制代碼能夠對應一個Enterprise bean對象的多個執行個體。例如,即使當Enterprise bean對象所在的主機崩潰了,或者Enterprise bean對象在不同的機器之間移動,控制代碼仍是有效。這裡的控制代碼是Serialized控制代碼,與CORBA中的字串化的CORBA對象的引用是相似的概念。
在EJBHome介面中的第二個remove操作通過其主鍵來決定要刪除的Enterprise bean。主鍵可以是擴充了Java Object類的任何類型,但是,必須要實現Java的Serializable介面。主鍵是標識實體bean的主要的方法。通常,主鍵是資料庫中的一個關鍵字,唯一的定義了由實體bean代表的資料。
方法getEJBMetaData()返回了Enterprise bean對象的metadata介面。這個介面允許客戶獲得Enterprise bean的metadata資訊。當開發工具來編譯連結應用程式的時候,或者組態工具來配置的時候,可能會用到metadata資訊。Javax.ejb.EJBMetadata介面提供了獲得javax.ejb.EJBHome介面,home類,remote介面,還有獲得主鍵的方法。也提供了一個isSesson()的方法來確定在放這個home介面的對象是會話bean還是實體bean。IsStatelessSession()方法指示這個會話bean是有狀態還是無狀態的。如下代碼顯示了javax.ejb.EJBMetadata介面的定義部分的代碼。
Public javax.ejb;
Public interface EJBMetaData{
EJBHome getEJBHome();
Class getHomeInterfaceClass();
Class getRemoteInterfaceClasss();
Class getPrimaryKeyClass();
Boolean isSession();
Boolean isStatelesssSession();
}
會話bean的home介面:
在前面我們說過,一個會話bean只有一個客戶。這就是說,當一個客戶建立一個會話bean的時候,這個會話bean的執行個體只是為了這個建立它的客戶而存在(這裡,我們指的是有狀態的會話bean。無狀態的會話bean因為並不保持會話的狀態,所以可以多個客戶)。
因為home 介面包括了一個或多個的Create()方法的定義,成為會話bean的工廠。對每一個Create()方法,EJB規範定義了如下的命名規範:
它的傳回值是會話bean的remote介面的類型。
方法的名字只能是Create()。
對會話bean類中的每一個ejbCreate()方法都必須有一個Create()與之對應。
對於每一個Create()方法的參數的類型和數量都必須與會話bean類中的ejbCreate()方法相對應。
方法必須拋出java.rmi.RemoteException例外。
方法必須拋出javax.rmi.CreateExeption例外。
Create()方法的參數是用來初始化新的會話bean對象的。
如下代碼顯示了一個會話bean對象的不同的Create()方法,其中必須的部分用粗體顯示:
public interface AtmHome extends javax.ejb.EJBHome{
Atm create() throws java.rmi.RemoteException,javax.ejb.CreateException;
Atm create(Profile preferredProfile)
Throws java.rmi.RemoteExeption,javax.ehrows java.rmi.RemoteException,RemoveException;
EJBMetaData getEJBMetaData() throws RemoteException;
Homehandle getHomeHandle() throws RemoteException;
}
這裡提供了兩個remove()方法來刪除Enterprise bean的執行個體。第一個remove方法是通過控制代碼來刪除一個Enterprise bean的執行個體。第二個remove方法通過主鍵來刪除一個Enterprise bean的執行個體。
在眾多的Enterprise bean執行個體中,控制代碼唯一的標識一個執行個體。一個控制代碼與它引用的Enterprise bean有相同的生命期。考慮一個實體物件,客戶可以通過一個控制代碼來重新獲得相應的Enterprise bean的執行個體。一個控制代碼能夠對應一個Enterprise bean對象的多個執行個體。例如,即使當Enterprise bean對象所在的主機崩潰了,或者Enterprise bean對象在不同的機器之間移動,控制代碼仍是有效。這裡的控制代碼是Serialized控制代碼,與CORBA中的字串化的CORBA對象的引用是相似的概念。
在EJBHome介面中的第二個remove操作通過其主鍵來決定要刪除的Enterprise bean。主鍵可以是擴充了Java Object類的任何類型,但是,必須要實現Java的Serializable介面。主鍵是標識實體bean的主要的方法。通常,主鍵是資料庫中的一個關鍵字,唯一的定義了由實體bean代表的資料。
方法getEJBMetaData()返回了Enterprise bean對象的metadata介面。這個介面允許客戶獲得Enterprise bean的metadata資訊。當開發工具來編譯連結應用程式的時候,或者組態工具來配置的時候,可能會用到metadata資訊。Javax.ejb.EJBMetadata介面提供了獲得javax.ejb.EJBHome介面,home類,remote介面,還有獲得主鍵的方法。也提供了一個isSesson()的方法來確定在放這個home介面的對象是會話bean還是實體bean。IsStatelessSession()方法指示這個會話bean是有狀態還是無狀態的。如下代碼顯示了javax.ejb.EJBMetadata介面的定義部分的代碼。
Public javax.ejb;
Public interface EJBMetaData{
EJBHome getEJBHome();
Class getHomeInterfaceClass();
Class getRemoteInterfaceClasss();
Class getPrimaryKeyClass();
Boolean isSession();
Boolean isStatelesssSession();
}
會話bean的home介面:
在前面我們說過,一個會話bean只有一個客戶。這就是說,當一個客戶建立一個會話bean的時候,這個會話bean的執行個體只是為了這個建立它的客戶而存在(這裡,我們指的是有狀態的會話bean。無狀態的會話bean因為並不保持會話的狀態,所以可以多個客戶)。
因為home 介面包括了一個或多個的Create()方法的定義,成為會話bean的工廠。對每一個Create()方法,EJB規範定義了如下的命名規範:
它的傳回值是會話bean的remote介面的類型。
方法的名字只能是Create()。
對會話bean類中的每一個ejbCreate()方法都必須有一個Create()與之對應。
對於每一個Create()方法的參數的類型和數量都必須與會話bean類中的ejbCreate()方法相對應。
方法必須拋出java.rmi.RemoteException例外。
方法必須拋出javax.rmi.CreateExeption例外。
Create()方法的參數是用來初始化新的會話bean對象的。
如下代碼顯示了一個會話bean對象的不同的Create()方法,其中必須的部分用粗體顯示:
public interface AtmHome extends javax.ejb.EJBHome{
Atm create() throws java.rmi.RemoteException,javax.ejb.CreateException;
Atm create(Profile preferredProfile)
Throws java.rmi.RemoteExeption,javax.ehrows java.rmi.RemoteException,RemoveException;
EJBMetaData getEJBMetaData() throws RemoteException;
Homehandle getHomeHandle() throws RemoteException;
}
這裡提供了兩個remove()方法來刪除Enterprise bean的執行個體。第一個remove方法是通過控制代碼來刪除一個Enterprise bean的執行個體。第二個remove方法通過主鍵來刪除一個Enterprise bean的執行個體。
在眾多的Enterprise bean執行個體中,控制代碼唯一的標識一個執行個體。一個控制代碼與它引用的Enterprise bean有相同的生命期。考慮一個實體物件,客戶可以通過一個控制代碼來重新獲得相應的Enterprise bean的執行個體。一個控制代碼能夠對應一個Enterprise bean對象的多個執行個體。例如,即使當Enterprise bean對象所在的主機崩潰了,或者Enterprise bean對象在不同的機器之間移動,控制代碼仍是有效。這裡的控制代碼是Serialized控制代碼,與CORBA中的字串化的CORBA對象的引用是相似的概念。
在EJBHome介面中的第二個remove操作通過其主鍵來決定要刪除的Enterprise bean。主鍵可以是擴充了Java Object類的任何類型,但是,必須要實現Java的Serializable介面。主鍵是標識實體bean的主要的方法。通常,主鍵是資料庫中的一個關鍵字,唯一的定義了由實體bean代表的資料。
方法getEJBMetaData()返回了Enterprise bean對象的metadata介面。這個介面允許客戶獲得Enterprise bean的metadata資訊。當開發工具來編譯連結應用程式的時候,或者組態工具來配置的時候,可能會用到metadata資訊。Javax.ejb.EJBMetadata介面提供了獲得javax.ejb.EJBHome介面,home類,remote介面,還有獲得主鍵的方法。也提供了一個isSesson()的方法來確定在放這個home介面的對象是會話bean還是實體bean。IsStatelessSession()方法指示這個會話bean是有狀態還是無狀態的。如下代碼顯示了javax.ejb.EJBMetadata介面的定義部分的代碼。
Public javax.ejb;
Public interface EJBMetaData{
EJBHome getEJBHome();
Class getHomeInterfaceClass();
Class getRemoteInterfaceClasss();
Class getPrimaryKeyClass();
Boolean isSession();
Boolean isStatelesssSession();
}
會話bean的home介面:
在前面我們說過,一個會話bean只有一個客戶。這就是說,當一個客戶建立一個會話bean的時候,這個會話bean的執行個體只是為了這個建立它的客戶而存在(這裡,我們指的是有狀態的會話bean。無狀態的會話bean因為並不保持會話的狀態,所以可以多個客戶)。
因為home 介面包括了一個或多個的Create()方法的定義,成為會話bean的工廠。對每一個Create()方法,EJB規範定義了如下的命名規範:
它的傳回值是會話bean的remote介面的類型。
方法的名字只能是Create()。
對會話bean類中的每一個ejbCreate()方法都必須有一個Create()與之對應。
對於每一個Create()方法的參數的類型和數量都必須與會話bean類中的ejbCreate()方法相對應。
方法必須拋出java.rmi.RemoteException例外。
方法必須拋出javax.rmi.CreateExeption例外。
Create()方法的參數是用來初始化新的會話bean對象的。
如下代碼顯示了一個會話bean對象的不同的Create()方法,其中必須的部分用粗體顯示:
public interface AtmHome extends javax.ejb.EJBHome{
Atm create() throws java.rmi.RemoteException,javax.ejb.CreateException;
Atm create(Profile preferredProfile)
Throws java.rmi.RemoteExeption,javax.ejb.CreateException;
}
注意,會話Bean的home 介面並沒有定義finder方法來定位對象。因為一個有狀態的會話bean只是給建立它的客戶使用。如果不是客戶自己建立的會話Bean,沒有必要也不允許去定位這樣的一個會話Bean。
實體bean的home介面:
跟會話bean的home介面一樣,實體bean的home介面提供了Create()的方法。另外,實體
bean的Home介面還提供了finder方法,這樣,客戶就能夠定位並使用實體bean的對象。Finder操作是必要的,因為實體bean是長時間存活的,可以被多個客戶所使用。對於大多數的應用程式而言,實體bean的執行個體是存在的,客戶只需要找到一個用來使用就可以了。
一個Entity bean的home介面必須提供一個預設的finder方法:finderByPrimary(primaryKey)。這個方法允許客戶通過主鍵來定位Entity bean。方法只有一個唯一的參數:主鍵。方法的傳回值類型是實體bean的remote介面類型。主鍵的類型可以是擴充了Java Object類型的任何Java類型。在配置描述器中,你必須告訴容器主鍵的類型。注意,根據定義,findByPrimaryKey()方法總是返回一個單個的Entity 對象。而其它的finder()方法可以返回Entity對象的集合。
下面是findByPrimaryKey()方法的定義:
findByPrimaryKey(key)
throws java.rmi.RemoteException,FinderException;
home介面還可以定義別的finder()方法。每一個finder()方法都必須在Enterprise bean類裡面有一個對應的實現。每一個finder方法都必須符合如下的約定。
傳回值的類型是remote介面類型,或者finder方法能夠返回不止一個的Entity對象,或者一個以remote介面為內容類型的集合類型。有效Java集合類型是java.util.Enumeration介面(JDK1.1規範)或java.util.Collection介面(java 2規範)。
finder方法總是以首碼find開頭。在實體bean 類裡面以首碼ejbFind開頭。
必須拋出java.rmi.RemoteException異常。
必須拋出javax.ejb.FinderException異常。
在home介面中的的throws子句與實體bean類的ejbCreate()方法的throws子句也必須對應。