国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

精通ejb【二】

2019-11-18 14:56:33
字體:
供稿:網(wǎng)友

  開發(fā)Beans
一、會話Beans介紹
按功能可把EJB分為兩類:session Beans 與 Entity Beans。
企業(yè)級Bean類
為了使bean可以在任一容器中工作,bean必須被附在接口中。在EJB中,在enterPRise bean class中提供了企業(yè)級bean組件的實(shí)現(xiàn)。這是個簡單的遵循接口的java類。
一個enterprise bean class 包含對組件的實(shí)現(xiàn)細(xì)節(jié)。會話bean的實(shí)現(xiàn)不同于實(shí)體bean的實(shí)現(xiàn),
一個Session Beans針對單一的客戶完成一次連接或會話,其生存直到客戶完成連接與會話,或系統(tǒng)意外中止。當(dāng)一個新的客戶從EJB Server訪到一個Session Beans時,那么EJB Container創(chuàng)建一個新的Session Beans實(shí)例,其運(yùn)行直到會話結(jié)束,Session Beans必須實(shí)現(xiàn)接口javax.ejb.SessionBean。
Entity Beans實(shí)現(xiàn)接口javax.ejb.EntityBean,其描述了特定數(shù)據(jù)源中的數(shù)據(jù),能長時間存在于EJB Container中,不會隨系統(tǒng)的意外中止而消失,并且可以讓多個客戶同時訪問。
EJB規(guī)范定義了許多bean類能夠?qū)崿F(xiàn)的標(biāo)準(zhǔn)接口。定義了所有的bean類必須有的方法。容器調(diào)用這些方法用來治理bean。
所有bean類(無論是會話bean還是實(shí)體bean)必須實(shí)現(xiàn)的最基本的接口是javax.ejb.EnterpriseBean接口。
public interface javax.ejb.EnterpriseBean extends java.io.Serializable
{
}
值得注重的是:它繼續(xù)了java.io.Serializable。
所有的會話bean必須實(shí)現(xiàn)javax.ejb.SessionBean,
所有的實(shí)體bean必須實(shí)現(xiàn)javax.ejb.EntityBean.
EJB對象
當(dāng)客戶想使用enterprise bean class的一個實(shí)例時,客戶不必直接在實(shí)際的實(shí)例上調(diào)用方法,調(diào)用過程被EJB容器截取,bean實(shí)例被容器中對象所代表。
1、Enterprise bean class不能通過網(wǎng)絡(luò)直接被調(diào)用,我們知道EJB容器可以操縱網(wǎng)絡(luò),因此它通過容器將bean包裝成可在網(wǎng)絡(luò)上使用的對象。
2、通過截取請求,容器可以自動執(zhí)行許多必要的治理工作。
3、EJB容器可以跟蹤哪個方法被調(diào)用,在系統(tǒng)治理者的用戶接口上顯示其用法等等。
因此,EJB容器可以看作間接的存在于客戶代碼和bean之間的層。這個間接的層使用單獨(dú)的網(wǎng)絡(luò)對象來表示自己,這個對象稱為EJB對象。
EJB對象作為容器物理的部分;所有的EJB對象都有針對容器非凡要求的代碼。因此,容器提供商提供專門工具,用來自動為EJB對象產(chǎn)生類文件。
遠(yuǎn)程接口
我們前面了解到,bean客戶調(diào)用EJB對象上的方法來代替調(diào)用bean,為了執(zhí)行它,EJB對象必須復(fù)制bean類中的每個業(yè)務(wù)方法。但是,怎樣才能使自動產(chǎn)生的EJB對象知道復(fù)制了哪個方法呢?這就用到了bean提供者寫的一個非凡的接口,這個接口復(fù)制所有的與bean類相關(guān)聯(lián)的業(yè)務(wù)邏輯方法。這個接口被稱為遠(yuǎn)程接口。
這個接口必須遵循EJB規(guī)范的定義,所有的遠(yuǎn)程接口必須從sun公司提供的通用接口繼續(xù)而來,即javax.ejb.EJBObject。

EJB對象
public interface javax.ejb.EJBObject
extends java.rmi.Remote
{
public abstract javax.ejb.EJBHome getEJBHome()
throws java.rmi.RemoteException;

public abstract java.lang.Object getPrimaryKey()
throws java.rmi.RemoteException;

public abstract void remove()
throws java.rmi.RemoteException,
javax.ejb.RemoveException;

public abstract javax.ejb.Handle getHandle()
throws java.rmi.RemoteException;

public abstract boolean isIdentical(javax.ejb.EJBObject)
throws java.rmi.RemoteException;
}
以上是對于所有EJB對象必須擁有的方法,你不需實(shí)現(xiàn)這些方法,這些方法的實(shí)現(xiàn),生成EJB對象時由容器自動生成。

客戶端代碼通過調(diào)用javax.ejb.EJBObject的方法來和bean協(xié)同工作。

Java RMI和EJB對象
你應(yīng)當(dāng)注重到:java.ejb.EJBObject繼續(xù)了Java.rmi.Remote。Java.rmi.Remote接口是java遠(yuǎn)程方法調(diào)用(RMI)的一部分,任一個實(shí)現(xiàn)java.rmi.Remote的對象都是rmote對象,它可以被另外的java虛擬機(jī)所調(diào)用。
被容器提供的EJB對象實(shí)現(xiàn)了遠(yuǎn)程接口,同時也間接實(shí)現(xiàn)了java.rmi.Remote,這樣也就意味著你的EJB對象是完全符合網(wǎng)絡(luò)需要的,可以被網(wǎng)絡(luò)上的其他java虛擬機(jī)調(diào)用。當(dāng)然,EJB接口也必須遵守EJB規(guī)范。
EJB遠(yuǎn)程接口必須遵守java的RMI遠(yuǎn)程接口規(guī)范。例如:錯誤處理,二者相同。
遠(yuǎn)程接口同樣也必須遵守java RMI參數(shù)傳遞規(guī)范。不是什么都可以通過VM方法調(diào)用來在網(wǎng)絡(luò)上傳遞,傳遞的參數(shù)必須符合RMI類型。
EJB也繼續(xù)了RMI的優(yōu)點(diǎn),對于RMI,你正在調(diào)用的遠(yuǎn)程對象的物理地址是不可見的。這個特點(diǎn)同樣也適用于EJB。客戶代碼不必關(guān)心正使用的EJB對象是在鄰近的計算機(jī)上還是從internat傳遞來的。這樣,EJB對象可以和客戶端處在同一個java VM中。
EJB保證了本地分布式組件的透明度。這種透明對于多層配置來說是非常必要的。客戶端代碼是非常輕易移植的,不受限于非凡的多層配置。EJB容器可以以最佳化方式在本地執(zhí)行。

Home對象
我們看到,客戶端代碼處理EJB對象,而從不直接操作beans。那么,客戶端如何得到EJB對象的參考呢?
客戶端不直接將EJB對象實(shí)例化。因?yàn)镋JB對象可以存在于不同的機(jī)器中。同樣的,EJB使本地透明化,因此客戶端不知道它的確切所在。
客戶端代碼通過EJB對象工廠得到EJB對象的參考。EJB規(guī)范里稱這種工廠為home對象。它主要起一下作用:
建立EJB對象。
找到已經(jīng)存在的EJB對象。
刪除EJB對象。
在一些細(xì)節(jié)方面,EJB對象工廠同EJB對象的特征相同。

Home接口
Home接口簡單的定義了建立、刪除和尋找EJB對象的方法。容器的home對象實(shí)現(xiàn)了home接口。
通常,EJB定義了所有home接口必須支持的許多方法,這些必須的方法被定義在javax.ejb.EJBHome接口上,home接口必須繼續(xù)Java.ejb.EJBHome接口。
public interface javax.ejb.EJBHome
extends java.rmi.Remote
{
public abstract EJBMetaData getEJBMetaData()
throws java.rmi.RemoteException;
public abstract void remove(Handle handle)
throws java.rmi.RemoteException
javax.ejb.RemoveException;
public abstract void remove(Object primaryKey)
throws java.rmi.RemoteException,
javax.ejb.RemoveException;
}
javax.ejb.EJBHome接口
注重javax.ejb.EJBHome繼續(xù)了java.rmi.Remote,這意味著home接口同樣也支持RMI遠(yuǎn)程對象,傳遞的參數(shù)和RMI也相同。


Home對象

所有home對象所需的方法
配置描述符
配置描述符答應(yīng)EJB容器向企業(yè)級的bean組件提供隱含的中間件服務(wù)。隱含的中間件服務(wù)是bean可以獲得不必將任何中間件API解碼,可以自動獲得服務(wù)的一種服務(wù)。

Bean的非凡屬性
最后,你還需要有一個基于java的bean的屬性文件。Bean在運(yùn)行時讀這些屬性,這些屬性在使用bean函數(shù)時會被用到。

Ejb-jar文件
一旦生成bean的類、home接口、遠(yuǎn)程接口、配置描述符和bean的屬性,我們就可以把它們打包成一個實(shí)體。這個實(shí)體稱作Ejb-jar文件。這是個壓縮文件。

建立Ejb-jar文件

什么是會話bean
一個Session Beans針對單一的客戶完成一次連接或會話,其生存直到客戶完成連接與會話,或系統(tǒng)意外中止。Session Beans必須實(shí)現(xiàn)接口javax.ejb.SessionBean。

會話bean的生存期
會話bean和實(shí)體bean的主要不同是它們的生存期的長短。會話bean的生存期短。與客戶的會話時間相當(dāng)。在與客戶連接端開時,EJB容器會破壞會話bean。
相反,實(shí)體bean可以存活相當(dāng)長的時間,實(shí)體bean是永久存取的一部分,例如:數(shù)據(jù)庫
會話bean不能保存永久的存儲數(shù)據(jù),但是,它可以進(jìn)行數(shù)據(jù)庫操作。
所有的會話bean都需要治理callback方法,容器定時的調(diào)用它,用來對bean的重要事件發(fā)出警告。這個方法僅能被容器調(diào)用。

Conversational versus Nonconversational Session Beans

如何寫會話Bean
寫會話bean的類,必須實(shí)現(xiàn)javax.ejb.SessionBean接口
public interface javax.ejb.SessionBean
extends javax.ejb.EnterpriseBean
{
public abstract void setSessionContext(SessionContext ctx)
throws java.rmi.RemoteException;

public abstract void ejbPassivate()
throws java.rmi.RemoteException;

public abstract void ejbActivate()
throws java.rmi.RemoteException;

public abstract void ejbRemove()
throws java.rmi.RemoteException;
}
會話bean和實(shí)體bean都繼續(xù)了javax.ejb.EnterpriseBean接口
讓我們具體看看接口中的各種方法:
setSessionContext(SessionContext ctx)
容器調(diào)用這個方法來通過會話上下文與bean連接。Bean可以通過會話上下文向容器查詢當(dāng)前事物的狀態(tài)和當(dāng)前的安全狀態(tài)等。
import javax.ejb.*;
public class MyBean implements SessionBean {
private SessionContext ctx;
public void setSessionContext(SessionContext ctx) {
this.ctx = ctx;
}
...
}

ejbCreate(…)
用來初始化你的會話bean,可以定義多個不同參數(shù)的ejbCreate()方法來用不同的方法初始化bean。
import javax.ejb.*;
public class MyBean implements SessionBean {
private int memberVariable;
public void ejbCreate(int initialValue) {
this.memberVariable = initialValue;
}
...
}
ejbCreate()方法是容器可以調(diào)用的callback方法,客戶端代碼不能調(diào)用它,因?yàn)榭蛻舳瞬荒苤苯犹幚韇eans??他們必須通過容器,但是客戶端必須采用某種方法向ejbCreate方法傳遞參數(shù),客戶端提供初始化參數(shù)。Home接口是客戶端用來初始化調(diào)用的接口工廠。你必須在home接口中復(fù)制每一個ejbCreate()方法,例如:假如在bean類中你有下面的ejbCreate方法
public void ejbCreate(int i) throws ...
那么你必須在你的home接口里有下面的create()方法
public void create(int i) throws ...
客戶端調(diào)用home接口中的create()方法,將參數(shù)傳遞給ejbCreate()。
EjbPassivate()
假如出現(xiàn)太多的實(shí)例bean,EJB容器可以將它們中的一些鈍化,將它們寫到臨時的存出空間例如數(shù)據(jù)庫或文件系統(tǒng)。容器釋放它們所申請的空間。
import javax.ejb.*;
public class MyBean implements SessionBean {
public void ejbPassivate() {
<close socket connections, etc...>
}
...
}
ejbActivate()
當(dāng)客戶需要使用被鈍化的bean時,容器將被鈍化的bean重新導(dǎo)入內(nèi)存,激活它們。
Bean又被導(dǎo)致內(nèi)存,這時需要重新得到bean所需要的資源。
import javax.ejb.*;
public class MyBean implements SessionBean {
public void ejbActivate() {
<open socket connections, etc...>
}
...
}
ejbRemove()
當(dāng)容器將會話bean實(shí)例remove掉時,調(diào)用此方法。所有的bean都有這種方法,它沒有參數(shù),它將釋放所有以分配的資源。
import javax.ejb.*;
public class MyBean implements SessionBean {
public void ejbRemove() {
<prepare for destrUCtion>
}
...
}
容器可以在任何時候調(diào)用ejbRemove()方法,但假如碰到異常,則有可能禁止容器調(diào)用此方法。

業(yè)務(wù)方法
應(yīng)該定義一些解決業(yè)務(wù)問題的方法:例如:
import javax.ejb.*;
public class MyBean implements SessionBean {
public int add(int i, int j) {
return (i + j);
}
...
}
因?yàn)榭蛻舳艘{(diào)用這些方法,因此,你必須在bean的遠(yuǎn)程接口中列出這些方法。

如何調(diào)用會話beans
我們現(xiàn)在來看客戶方,客戶方要通過使用一個或多個bean解決一些現(xiàn)實(shí)的問題。
有兩種不同的客戶方:
Java RMI-based clients:這種客戶方通過使用JNDI定位對象,使用JTA控制事務(wù)。
CORBA客戶方:客戶方也可以使用CORBA標(biāo)準(zhǔn)來寫。CORBA客戶方使用CORBA名字服務(wù)(COS Naming)在網(wǎng)絡(luò)上定位對象,使用CORBA的OTS控制事務(wù)。
無論是用CORBA還是RMI,典型的客戶端代碼都必須實(shí)現(xiàn):
1、 定位Home接口
2、 使用Home接口建立EJB對象
3、在EJB對象上調(diào)用業(yè)務(wù)方法
4、清除EJB對象
定位Home接口
客戶端使用JNDL定位Home對象。
J2EE中JNDL的作用
J2EE的目標(biāo)之一是使應(yīng)用程序?qū)崿F(xiàn)“write once,run anywhere”。任何的運(yùn)行在企業(yè)級配置的java代碼在多層結(jié)構(gòu)中應(yīng)該是不受約束的。因此必須實(shí)現(xiàn)定位的透明化。
J2EE通過使用JNDL來實(shí)現(xiàn)定位的透明化。已有目錄服務(wù)的產(chǎn)品如Netscape的Directory Server,微軟的Active Directory,IBM的Lotus Notes。
通常我們使用目錄服務(wù)存儲用戶名、密碼、機(jī)器位置、打印機(jī)位置等等。J2EE擴(kuò)展目錄服務(wù)存儲資源的本地信息,這些資源也可以是Home對象、企業(yè)級bean的環(huán)境屬性、數(shù)據(jù)庫驅(qū)動、信息服務(wù)驅(qū)動和其他資源。使用目錄服務(wù),在些應(yīng)用程序代碼時可以不必關(guān)心確切的機(jī)器名字和機(jī)器地址,這樣保證了代碼的可移植性。無論資源在何處,都不需要重新編譯代碼。
JNDL通過為本地用戶、機(jī)器、網(wǎng)絡(luò)、對象和服務(wù)提供一個標(biāo)準(zhǔn)接口向企業(yè)級配置中增加值。
為了在J2EE中定位資源,必須實(shí)現(xiàn)以下兩步:
1、 用配置描述符中的“綽號”關(guān)聯(lián)資源,J2EE將向資源綁定綽號。
2、 資源的客戶端使用JNDL中的綽號定位資源。

怎樣使用JNDL定位Home對象
客戶端不必關(guān)心Home對象在網(wǎng)絡(luò)的什么地方。JNDL為Home對象提供綽號來定位Home對象。通過綽號可以得到Home對象的參考。
具體點(diǎn),客戶端代碼必須執(zhí)行以下幾步來通過JNDL得到參考。
1、 建立環(huán)境。必須配置將要使用目錄服務(wù),包括為驗(yàn)證身份所需的用戶名、密碼。
2、 建立初始的上下文。初始上下文是連接目錄結(jié)構(gòu)的本地出發(fā)點(diǎn)。通過初始上下文得到設(shè)定的環(huán)境屬性。
3、 得到Home對象。執(zhí)行l(wèi)ookup()操作,返回一個RMI遠(yuǎn)程對象。

得到Home對象的參考
/*
* Get System properties for JNDI initialization
*/
Properties props = System.getProperties();
/*
* Form an initial context
*/
Context ctx = new InitialContext(props);
/*
* Get a reference to the home object - the
* factory for EJB objects
*/
MyHome home = (MyHome) ctx.lookup("MyHome");
建立EJB對象
得到Home對象以后,可以將Home對象作為建立EJB對象的工廠。調(diào)用create()方法建立EJB對象。
MyRemoteInterface ejbObject = home.create();
無參數(shù)是因?yàn)闊o狀態(tài)beans不需要初始參數(shù)。
調(diào)用方法
客戶端有了EJB對象以后就可以通過它來調(diào)用方法。當(dāng)客戶端在EJB對象上調(diào)用方法時,EJB對象必須選擇一個bean實(shí)例來應(yīng)答。EJB對象可以建立一個新的實(shí)例或是重用已經(jīng)存在的實(shí)例。
ejbObject.add();
破壞EJB對象
調(diào)用EJB或Home對象上的remove()方法來破壞EJB對象。
ejbObject.remove();

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 石泉县| 吴旗县| 双峰县| 广安市| 东阿县| 遵化市| 盐山县| 隆安县| 宝丰县| 临潭县| 崇礼县| 山西省| 汉川市| 拉孜县| 大石桥市| 双鸭山市| 通许县| 扎鲁特旗| 赤城县| 蒙城县| 冀州市| 启东市| 揭阳市| 神木县| 台中县| 新昌县| 即墨市| 措美县| 新乐市| 临汾市| 古交市| 四川省| 日照市| 双鸭山市| 五家渠市| 昆明市| 东丽区| 长丰县| 葫芦岛市| 开化县| 读书|