EJB核心技術(shù)及其應(yīng)用(續(xù))
發(fā)表時(shí)間:2023-07-17 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]四、開發(fā)EJB1、類介紹: 開發(fā)EJB的主要步驟一般來(lái)說(shuō),整個(gè)的開發(fā)步驟(開發(fā),配置,組裝)包括如下幾個(gè)方面。開發(fā):首先要定義三個(gè)類:Bean類本身,Bean的本地和遠(yuǎn)程接口類。 配置:配置包括產(chǎn)...
四、開發(fā)EJB
1、類介紹:
開發(fā)EJB的主要步驟一般來(lái)說(shuō),整個(gè)的開發(fā)步驟(開發(fā),配置,組裝)包括如下幾個(gè)方面。開發(fā):首先要定義三個(gè)類:Bean類本身,Bean的本地和遠(yuǎn)程接口類。 配置:配置包括產(chǎn)生配置描述器--這是一個(gè)XML文件、聲明了Enterprise Bean的屬性、綁定了bean的class文件(包括stub文件和skeleton文件)。最后將這些配置都放到一個(gè)jar文件中。還需要在配置器中定義環(huán)境屬性。組裝應(yīng)用程序:包括將Enterprise beans安裝到Server服務(wù)器中,測(cè)試各層的連接情況。程序組裝器將若干個(gè)Enterprise Beans與其它的組件結(jié)合起來(lái)。組合成一個(gè)完整的應(yīng)用程序。或者將若干個(gè)Enterprise beans組合成一個(gè)復(fù)雜的Enterprise Bean。管理Enterprise Bean。
我們必須定義和編寫一些EJB中的基本類。如Enterprise bean類:這是Enterprise bean內(nèi)部應(yīng)用邏輯的實(shí)現(xiàn)。編寫Enterprise bean的遠(yuǎn)程接口類。編寫Enterprise bean的本地接口類。說(shuō)明主鍵類,主鍵類只是對(duì)于Entity bean才需要的。在Enterprise bean的配置描述器中指定主鍵的名字。Enterprise beans提供者定義了遠(yuǎn)程接口和本地接口,實(shí)現(xiàn)了EJB類本身。Remote接口中提供了客戶調(diào)用EJB實(shí)現(xiàn)的應(yīng)用邏輯函數(shù)的接口。而home接口提供了產(chǎn)生和定位remote接口實(shí)例的方法。
在Enterprise bean本身類的實(shí)現(xiàn),本地home接口,遠(yuǎn)程remote接口之間并沒有正式的聯(lián)系(例如繼承關(guān)系)。但是,在三個(gè)類里聲明的方法卻必須遵守EJB里面定義的規(guī)范。例如: 你在Enterprise bean里面聲明了一個(gè)應(yīng)用程序的方法或者說(shuō)應(yīng)用邏輯。也在beans的remote接口中聲明了這個(gè)方法,那么,這兩個(gè)地方必須要同樣的名字。Bean的實(shí)現(xiàn)里面必須至少有一個(gè)Create()方法:ejbCreate()。但是可以有多個(gè)帶有不同參數(shù)的create()方法。 在home接口中,也必須有相同的方法定義(參數(shù)的個(gè)數(shù)相同)。EjbCreate()方法返回的一個(gè)容器管理的持久對(duì)象。它們都返回一個(gè)容器管理持久性的主鍵值。但是,在home的相應(yīng)的Create()方法中返回值的類型是remote接口。
注意:實(shí)體bean的實(shí)現(xiàn)的ejbCreate方法有點(diǎn)不同。實(shí)體bean可以不定義ejbCreate方法。如果實(shí)體只是通過(guò)應(yīng)用程序或通過(guò)數(shù)據(jù)庫(kù)管理程序的途徑被加到數(shù)據(jù)庫(kù)中,實(shí)體bean就省略了ejbCreate方法。EjbCreate返回的值是主鍵類型。如果ejbCreate方法是容器管理持久性的實(shí)體bean的方法,它的返回值就是NULL類型。如果實(shí)體bean實(shí)現(xiàn)了Bean管理的持久性,ejbCreate方法就返回值類型就是主鍵類型。容器的任務(wù)是把各接口和Enterprise bean的實(shí)現(xiàn)類結(jié)合起來(lái)。保證在編譯時(shí)和運(yùn)行時(shí),各接口和實(shí)現(xiàn)類是相對(duì)應(yīng)的。
EJB的實(shí)現(xiàn)類,各接口要從不同的基類中繼承下來(lái)。一個(gè)會(huì)話bean必須實(shí)現(xiàn)基類javax.ejb.SessionBean。而實(shí)體bean必須實(shí)現(xiàn)基類javax.ejb.EntiyBean。這些EJB的基類都是從javax.ejb.EnterpriseBean繼承而來(lái)。而javax.ejb.EnterpriseBean又是從java.io.Serializable繼承而來(lái)。每一個(gè)Enterprise Bean都必須有一個(gè)remote接口。Remote接口定義了應(yīng)用程序規(guī)定客戶可以調(diào)用的邏輯操作。這些是一些可以由客戶調(diào)用的公共的方法,通常由Enterprise beans類來(lái)實(shí)現(xiàn)。注意,Enterprise bean的客戶并不直接訪問(wèn)Bean。而是通過(guò)remote接口來(lái)訪問(wèn)。Enterprise bean類的remote接口擴(kuò)展了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()方法允許你取得一個(gè)相關(guān)的Home接口。對(duì)于 實(shí)體Bean,用getPrimaryKey()方法獲得實(shí)體Bean的主鍵值。Remove()可以刪除一個(gè)Enterprise bean。具體的語(yǔ)義在各種不同類型的enterprise beans的生命周期中,由上下文中解釋的。方法getHandle()返回了一個(gè)Enterprise bean實(shí)例的持久的句柄。IsIndentical()方法允許你去比較Enterprise beans是否相同。
2、方法:
所有的remote接口中的方法必須聲明為公共(public)的,并必須拋出java.rmi.RemotException異常。另外,所有的remote接口中的方法定義的參數(shù)和都必須是在RMI-IIOP中有效的。對(duì)每一個(gè)在remote接口中定義的方法,在Enterprise bean 類里面都要有相應(yīng)的方法。相應(yīng)的方法必須要有同樣的名字,同樣類型和數(shù)量的參數(shù),同樣的返回值,而且還要拋出同樣的例外。 如下代碼顯示了一個(gè)ATM例子的會(huì)話bean的remote接口Atm,。里面聲明了一個(gè)應(yīng)用方法transfer()。黑體部分表示EJB規(guī)范中必須要有的內(nèi)容。Remote接口必須擴(kuò)展javax.ejb.EJBObject類。從客戶端調(diào)用的Enterprise bean的每一個(gè)方法都必須在remote接口中聲明。Transfer()方法拋出了兩個(gè)意外。其中InSufficientFundsException例外是應(yīng)用程序定義的意外。
Public interface Atm extends javax.ejb.EJBObject{
Public void transfer(String Source, String Target, float amount)
Throws java.rmi.RemoteException, InSufficientFundsException;
}
Home接口必須定義一個(gè)或多個(gè)的Create()方法。每一個(gè)這樣的Create()方法都必須命名為Create。并且,它的參數(shù),不管是類型還是數(shù)量都必須與bean類里面的ejbCreate()方法對(duì)應(yīng)。注意,home接口中的Create()方法和bean類中ejbCreate()方法的返回值類型是不同的。實(shí)體bean的home接口還包含find()方法。 每一個(gè)Home接口都擴(kuò)展了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;
}
這里提供了兩個(gè)remove()方法來(lái)刪除Enterprise bean的實(shí)例。第一個(gè)remove方法是通過(guò)句柄來(lái)刪除一個(gè)Enterprise bean的實(shí)例。第二個(gè)remove方法通過(guò)主鍵來(lái)刪除一個(gè)Enterprise bean的實(shí)例。 在眾多的Enterprise bean實(shí)例中,句柄唯一的標(biāo)識(shí)一個(gè)實(shí)例。一個(gè)句柄與它引用的Enterprise bean有相同的生命期。考慮一個(gè)實(shí)體對(duì)象,客戶可以通過(guò)一個(gè)句柄來(lái)重新獲得相應(yīng)的Enterprise bean的實(shí)例。一個(gè)句柄能夠?qū)?yīng)一個(gè)Enterprise bean對(duì)象的多個(gè)實(shí)例。例如,即使當(dāng)Enterprise bean對(duì)象所在的主機(jī)崩潰了,或者Enterprise bean對(duì)象在不同的機(jī)器之間移動(dòng),句柄仍是有效的。這里的句柄是Serialized句柄,與CORBA中的字符串化的CORBA對(duì)象的引用是相似的概念。在EJBHome接口中的第二個(gè)remove操作通過(guò)其主鍵來(lái)決定要?jiǎng)h除的Enterprise bean。主鍵可以是擴(kuò)展了Java Object類的任何類型,但是,必須要實(shí)現(xiàn)Java的Serializable接口。主鍵是標(biāo)識(shí)實(shí)體bean的主要的方法。通常,主鍵是數(shù)據(jù)庫(kù)中的一個(gè)關(guān)鍵字,唯一的定義了由實(shí)體bean代表的數(shù)據(jù)。
方法getEJBMetaData()返回了Enterprise bean對(duì)象的metadata接口。這個(gè)接口允許客戶獲得Enterprise bean的metadata信息。當(dāng)開發(fā)工具來(lái)編譯鏈接應(yīng)用程序的時(shí)候,或者配置工具來(lái)配置的時(shí)候,可能會(huì)用到metadata信息。Javax.ejb.EJBMetadata接口提供了獲得javax.ejb.EJBHome接口,home類,remote接口,還有獲得主鍵的方法。也提供了一個(gè)isSesson()的方法來(lái)確定在放這個(gè)home接口的對(duì)象是會(huì)話bean還是實(shí)體bean。 IsStatelessSession()方法指示這個(gè)會(huì)話bean是有狀態(tài)還是無(wú)狀態(tài)的。如下代碼顯示了javax.ejb.EJBMetadata接口的定義部分的代碼。
Public javax.ejb; Public interface EJBMetaData{
EJBHome getEJBHome();
Class getHomeInterfaceClass();
Class getRemoteInterfaceClasss();
Class getPrimaryKeyClass();
Boolean isSession();
Boolean isStatelesssSession();
}
對(duì)每一個(gè)Create()方法,EJB規(guī)范定義了如下的命名約定。它的返回值是會(huì)話bean的remote接口的類型。方法的名字只能是Create()。對(duì)會(huì)話bean類中的每一個(gè)ejbCreate()方法都必須有一個(gè)Create()與之對(duì)應(yīng)。 對(duì)于每一個(gè)Create()方法的參數(shù)的類型和數(shù)量都必須與會(huì)話bean類中的ejbCreate()方法相對(duì)應(yīng)。方法必須拋出java.rmi.RemoteException例外。 方法必須拋出javax.rmi.CreateExeption例外。 Create()方法的參數(shù)是用來(lái)初始化新的會(huì)話bean對(duì)象的。 如下代碼顯示了一個(gè)會(huì)話bean對(duì)象的不同的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;
}
這里提供了兩個(gè)remove()方法來(lái)刪除Enterprise bean的實(shí)例。第一個(gè)remove方法是通過(guò)句柄來(lái)刪除一個(gè)Enterprise bean的實(shí)例。第二個(gè)remove方法通過(guò)主鍵來(lái)刪除一個(gè)Enterprise bean的實(shí)例。在眾多的Enterprise bean實(shí)例中,句柄唯一的標(biāo)識(shí)一個(gè)實(shí)例。一個(gè)句柄與它引用的Enterprise bean有相同的生命期。考慮一個(gè)實(shí)體對(duì)象,客戶可以通過(guò)一個(gè)句柄來(lái)重新獲得相應(yīng)的Enterprise bean的實(shí)例。一個(gè)句柄能夠?qū)?yīng)一個(gè)Enterprise bean對(duì)象的多個(gè)實(shí)例。例如,即使當(dāng)Enterprise bean對(duì)象所在的主機(jī)崩潰了,或者Enterprise bean對(duì)象在不同的機(jī)器之間移動(dòng),句柄仍是有效的。這里的句柄是Serialized句柄,與CORBA中的字符串化的CORBA對(duì)象的引用是相似的概念。
在EJBHome接口中的第二個(gè)remove操作通過(guò)其主鍵來(lái)決定要?jiǎng)h除的Enterprise bean。主鍵可以是擴(kuò)展了Java Object類的任何類型,但是,必須要實(shí)現(xiàn)Java的Serializable接口。主鍵是標(biāo)識(shí)實(shí)體bean的主要的方法。通常,主鍵是數(shù)據(jù)庫(kù)中的一個(gè)關(guān)鍵字,唯一的定義了由實(shí)體bean代表的數(shù)據(jù)。方法getEJBMetaData()返回了Enterprise bean對(duì)象的metadata接口。這個(gè)接口允許客戶獲得Enterprise bean的metadata信息。當(dāng)開發(fā)工具來(lái)編譯鏈接應(yīng)用程序的時(shí)候,或者配置工具來(lái)配置的時(shí)候,可能會(huì)用到metadata信息。Javax.ejb.EJBMetadata接口提供了獲得javax.ejb.EJBHome接口,home類,remote接口,還有獲得主鍵的方法。也提供了一個(gè)isSesson()的方法來(lái)確定在放這個(gè)home接口的對(duì)象是會(huì)話bean還是實(shí)體bean。IsStatelessSession()方法指示這個(gè)會(huì)話bean是有狀態(tài)還是無(wú)狀態(tài)的。如下代碼顯示了javax.ejb.EJBMetadata接口的定義部分的代碼。
Public javax.ejb;
Public interface EJBMetaData{
EJBHome getEJBHome();
Class getHomeInterfaceClass();
Class getRemoteInterfaceClasss();
Class getPrimaryKeyClass();
Boolean isSession();
Boolean isStatelesssSession();
}