EJB內(nèi)部資參1
發(fā)表時(shí)間:2023-08-15 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]enterpriseJavaBean 入門(mén) 一 基本知識(shí) 1. 背景 Java由于其良好的跨平臺(tái)行而成為服務(wù)器端的理想語(yǔ)言,為了利用Java實(shí)現(xiàn)服務(wù) 器端的計(jì)算,SUN推出了一個(gè)完整的開(kāi)發(fā)平臺(tái)J2E...
enterpriseJavaBean 入門(mén)
一 基本知識(shí)
1. 背景
Java由于其良好的跨平臺(tái)行而成為服務(wù)器端的理想語(yǔ)言,為了利用Java實(shí)現(xiàn)服務(wù)
器端的計(jì)算,SUN推出了一個(gè)完整的開(kāi)發(fā)平臺(tái)J2EE,其目的是為基于Java的服務(wù)器
端配置提供一個(gè)獨(dú)立于平臺(tái)的可攜帶的多用戶(hù)企業(yè)級(jí)的安全平臺(tái),而J2EE的基石
就是Enterprise JavaBeans(EJB),EJB是建立基于JAVA的服務(wù)器端組件的標(biāo)準(zhǔn),它
定義了如何編寫(xiě)服務(wù)器端組件,提供了組件與管理組件的應(yīng)用服務(wù)器之間的標(biāo)準(zhǔn)
約定,EJB是一種組件架構(gòu),使得開(kāi)發(fā)人員能夠快速開(kāi)發(fā)出具有伸縮性的企業(yè)級(jí)應(yīng)
用。
2. EJB簡(jiǎn)介
1)JavaBeans和Enterprise JavaBeans
JavaBeans是Java的組件模型。在JavaBeans規(guī)范中定義了事件和屬性等特征。En
terprise JavaBeans也定義了一個(gè)Java組件模型,但是Enterprise JavaBeans組
件模型和JavaBeans組件模型是不同的。 JavaBeans重點(diǎn)是允許開(kāi)發(fā)者在開(kāi)發(fā)工具
中可視化的操縱組件。JavaBeans規(guī)范詳細(xì)地解釋了組件間事件登記、傳遞、識(shí)別
和屬性使用、定制和持久化的應(yīng)用編程接口和語(yǔ)意。 Enterprise JavaBeans的側(cè)
重點(diǎn)是詳細(xì)地定義了一個(gè)可以portably地部署Java組件的服務(wù)框架模型。因此,
其中并沒(méi)提及事件,因?yàn)閑nterprise bean通常不發(fā)送和接受事件。同樣也沒(méi)有提
及屬性------屬性定制并不是在開(kāi)發(fā)時(shí)進(jìn)行,而是在運(yùn)行時(shí)(實(shí)際上在部署時(shí))
通過(guò)一個(gè)部署描述符來(lái)描述。
不要尋找JavaBeans和Enterprise JavaBeans之間的相似性。他們都是組件模型規(guī)
范,但是前者說(shuō)明了開(kāi)發(fā)工具中應(yīng)用程序組裝的問(wèn)題,而后者則側(cè)重于部署組件
的服務(wù)框架的細(xì)節(jié)。不要錯(cuò)誤地認(rèn)為JavaBeans是用于客戶(hù)端的開(kāi)發(fā),Enterpris
e JavaBeans是用于服務(wù)器端的開(kāi)發(fā)。JavaBeans也可作為進(jìn)行非圖形化服務(wù)器端
Java應(yīng)用開(kāi)發(fā)的組件模型。區(qū)別是當(dāng)你使用JavaBeans創(chuàng)建服務(wù)器應(yīng)用時(shí),你還得
設(shè)計(jì)整個(gè)的服務(wù)框架。用Enterprise Javabeans框架是現(xiàn)成的,你只需遵守它的
APIs.對(duì)于復(fù)雜的服務(wù)器端應(yīng)用程序,顯然使用Enterprise JavaBeans比重新開(kāi)發(fā)
更簡(jiǎn)單
2)EJB體系結(jié)構(gòu)
EJB是一種組件架構(gòu),它采用分而制之的方法實(shí)現(xiàn)服務(wù)器端的計(jì)算。
EJB規(guī)范定義了六種不同的角色來(lái)完成其任務(wù), 包括:
? Bean provider: 提供可重用的商業(yè)組件
? Container provider: 為ejb 應(yīng)用提供低層次的運(yùn)行環(huán)境
? Server provider:提供應(yīng)用程序服務(wù)器用以包含,管理和配置ejb組件,目前E
JB規(guī)范沒(méi)有提供EJB Container和EJB Server之間的接口,故二者的提供商是合一
的,有:BEA的Weblogic server,SUN的NetDynamics,IBM的WebSphere,Oracle的8
i等。
? Application assembler:負(fù)責(zé)將不同的組件組織起來(lái)構(gòu)成能夠運(yùn)行的應(yīng)用程序
? Deployer: 負(fù)責(zé)將要使用的組件安裝到應(yīng)用服務(wù)器中并加以配置
? System Administrator: 負(fù)責(zé)配置好的系統(tǒng)的管理等
這六種角色的流程圖如下:
Enterprise JavaBean 駐留在EJB Container中,通過(guò)EJB Container對(duì)ejb進(jìn)行管
理。EJB規(guī)范定義了二者之間的接口。
Javax.ejb.EJBHome接口列出了所有定位、創(chuàng)建、刪除EJB 類(lèi)實(shí)例的方法。Home對(duì)
象是home接口的實(shí)現(xiàn)。EJB類(lèi)開(kāi)發(fā)者必須定義home接口。EJB Container Provide
r應(yīng)該提供從home接口中產(chǎn)生home對(duì)象實(shí)現(xiàn)的方法。
遠(yuǎn)程接口(remote interface)列出了EJB類(lèi)中的商業(yè)方法。Javax.ejb.EJBObje
ct實(shí)現(xiàn)遠(yuǎn)程接口,并且客戶(hù)端通過(guò)它訪(fǎng)問(wèn)EJB實(shí)例的商業(yè)方法。EJB開(kāi)發(fā)者定義遠(yuǎn)
程接口,EJB Container Provider提供產(chǎn)生相應(yīng)的EJBObject的方法?蛻(hù)端不能
得到EJB實(shí)例的引用,只能得到它的EJBObject實(shí)例的引用。當(dāng)客戶(hù)端調(diào)用一個(gè)方
法,EJBObject接受請(qǐng)求并把它傳給EJB實(shí)例,同時(shí)提供進(jìn)程中必要的包裝功能。
客戶(hù)端應(yīng)用程序通過(guò)home對(duì)象來(lái)定位、創(chuàng)建、刪除EJB類(lèi)的實(shí)例,通過(guò)EJBObject
來(lái)調(diào)用實(shí)例中的商業(yè)方法?蛻(hù)端可以用Java來(lái)編程,通過(guò)Java RMI來(lái)訪(fǎng)問(wèn)訪(fǎng)問(wèn)
home對(duì)象和EJBObject,或用其他語(yǔ)言編程并通過(guò)CORBA/IIOP訪(fǎng)問(wèn),使得部署的服
務(wù)器端組件可以通過(guò)CORBA接口來(lái)訪(fǎng)問(wèn)。
Enterprise javaBean規(guī)范將Enterprise Beans 分為兩種:session bean和enti
ty bean.
I. session bean表示的是調(diào)用它的客戶(hù)端代碼索要完成的工作,是一種商業(yè)處理
過(guò)程對(duì)象,它實(shí)現(xiàn)商業(yè)邏輯,商業(yè)規(guī)則以及工作流程,例如:報(bào)價(jià),訂單處理,
視頻壓縮,股票交易等。session bean之所以叫session bean是因?yàn)槠渖芷?
與調(diào)用它的客戶(hù)端相同。
session bean又分為兩種:stateless和stateful, stateful session bean用于
貫穿多個(gè)方法請(qǐng)求和事務(wù)的商業(yè)過(guò)程,例如:網(wǎng)上商店,用戶(hù)進(jìn)入商店后,可以
將商品加入再現(xiàn)的購(gòu)物車(chē),組件必須跟蹤用戶(hù)的狀態(tài)(如:購(gòu)物車(chē));而statel
ess session bean用于客戶(hù)調(diào)用方法期間不用維護(hù)任何狀態(tài)信息,例如:解決復(fù)
雜數(shù)學(xué)運(yùn)算的視頻壓縮/解壓縮。
II. entity bean用來(lái)代表商業(yè)過(guò)程中處理的永久性的數(shù)據(jù),例如:銀行出納員組
件完成儲(chǔ)蓄等商業(yè)過(guò)程,其中涉及的數(shù)據(jù)時(shí)銀行賬戶(hù)數(shù)據(jù)
entity bean用來(lái)代表底層的對(duì)象。最常用的是用entity bean代表關(guān)系庫(kù)中的數(shù)
據(jù)。一個(gè)簡(jiǎn)單的entity bean 可以定義成代表數(shù)據(jù)庫(kù)表的一個(gè)記錄,也就是每一
個(gè)實(shí)例代表一個(gè)特殊的記錄。更復(fù)雜的entity bean可以代表數(shù)據(jù)庫(kù)表間關(guān)聯(lián)視圖
。在entity bean中還可以考慮包含廠商的增強(qiáng)功能,如對(duì)象--關(guān)系映射的集成。
通常用entity類(lèi)代表一個(gè)數(shù)據(jù)庫(kù)表比代表多個(gè)相關(guān)聯(lián)的表更簡(jiǎn)單且更有效。反過(guò)
來(lái)可以輕易地向entity類(lèi)的定義中增加關(guān)聯(lián),這樣可以最大地復(fù)用cache并減小舊
數(shù)據(jù)的表現(xiàn)。
III. entity bean和session bean的比較
看起來(lái)session bean好象沒(méi)什么用處,尤其對(duì)于數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用程序。當(dāng)然事實(shí)
并不是這樣。因?yàn)閑ntity bean(譬如說(shuō))代表底層數(shù)據(jù)庫(kù)的一行,則entity be
an實(shí)例和數(shù)據(jù)庫(kù)記錄間就是一對(duì)一的關(guān)系。因?yàn)槎鄠(gè)客戶(hù)端必須訪(fǎng)問(wèn)底層記錄,
這意味著,不同于session bean,客戶(hù)端必須共享entity bean。因?yàn)槭枪蚕淼模?
所以entity bean不允許保存每個(gè)客戶(hù)端的信息。session bean允許保存客戶(hù)端的
狀態(tài)信息,客戶(hù)端和session bean實(shí)例間是一對(duì)一的。entity bean允許保存記錄
的信息,entity bean實(shí)例和記錄間是一對(duì)一的。一個(gè)理想的情況是客戶(hù)端通過(guò)s
ession bean連接服務(wù)器,然后session bean通過(guò)entity bean訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。這使
得既可以保存客戶(hù)端的信息又可以保存數(shù)據(jù)庫(kù)記錄的信息!
同時(shí)session bean也不能提供在相同或不同的EJB類(lèi)調(diào)用間進(jìn)行全局的事務(wù)控制。
沒(méi)有session bean,應(yīng)用程序開(kāi)發(fā)者(客戶(hù)端開(kāi)發(fā)者)就必須理解EJB類(lèi)的事務(wù)要
求,并使用客戶(hù)端的事務(wù)劃分來(lái)提供事務(wù)控制。EJB的主要好處就是應(yīng)用開(kāi)發(fā)者不
需知道EJB類(lèi)的事務(wù)需求。一個(gè)session bean可以代表一個(gè)商業(yè)操作,進(jìn)行事務(wù)控
制,不需要客戶(hù)端進(jìn)行事務(wù)劃分。
以下我們作為EJB provider的角色來(lái)討論Enterprise javaBean的開(kāi)發(fā)。
3,EJB 開(kāi)發(fā)
A) Enterprise JavaBean的由如下部分構(gòu)成
Enterprise Bean 類(lèi): 包含ejb 組件的詳細(xì)實(shí)現(xiàn),對(duì)于session Bean它代表了
與業(yè)務(wù)處理相關(guān)的邏輯的實(shí)現(xiàn),而對(duì)于entity Bean 它代表了與數(shù)據(jù)邏輯相關(guān)的
實(shí)現(xiàn)
EJB Object :是由EJB Container來(lái)實(shí)現(xiàn)的遠(yuǎn)程接口,它是客戶(hù)端和bean 實(shí)例之
間的中介,傳遞客戶(hù)端調(diào)用到bean 實(shí)例;
Home 接口:充當(dāng)EJB Object工廠的java接口,創(chuàng)建EJB Object,Home接口的實(shí)現(xiàn)
由EJB Container負(fù)責(zé)。
Deploy descriptor:描述你的ejb 中間件的相關(guān)要求,包括:通知EJB Containe
r如何管理你的bean,事務(wù)的需要,安全需要等等。
特定于bean 的屬性: 利用該屬性,bean可以在運(yùn)行時(shí)讀取并調(diào)整自己的功能
Ejb-jar 文件:將生成的bean 類(lèi),home接口,Ejb object,deployment descrip
tor和bean 的properties 打包進(jìn)ejb jar 文件,這樣就可以deploy了。
B) Enterprise JavaBean編程的具體步驟
實(shí)現(xiàn)javax.ejb.EnterpriseBean接口:
對(duì)于session bean 可以直接實(shí)現(xiàn)javax.ejb.SessionBean接口,對(duì)于entity bea
n 可以直接實(shí)現(xiàn)javax.ejb.EntityBean接口,而后實(shí)現(xiàn)本bean特有的功能。
擴(kuò)展javax.ejb.EJBObject接口:
增加在Enterprise Bean實(shí)現(xiàn)類(lèi)中供客戶(hù)調(diào)用的方法的相應(yīng)的方法,必須相同
擴(kuò)展javax.ejb.EJBHome接口:
增加創(chuàng)建上述擴(kuò)展的javax.ejb.EJBObject接口的相應(yīng)的create()方法。
編寫(xiě)deploy descriptor文件:
目前EJB 1.1規(guī)范規(guī)定了用XML文件來(lái)描述它,并提供了相應(yīng)的DTD.
生成EJB jar 文件:
利用jar命令將上述生成的相應(yīng)文件進(jìn)行打包。
在第二部分給出了ejb開(kāi)發(fā)的詳細(xì)說(shuō)明及相關(guān)注意事項(xiàng)
二 例子程序
以下的例子程序是以weblogic server(ver5.1)作為EJB Server(EJB Container)
的, 不同的EJB Server 在一些方面有所不同 (不同的地方另加注釋?zhuān)?
例子一. Hello, world (Stateless Session Bean)
包括EJB相應(yīng)接口的擴(kuò)展和實(shí)現(xiàn)、deploy descriptor文件的生成以及.jar文件生
成;
服務(wù)器端EJB開(kāi)發(fā)
EJB相應(yīng)接口的擴(kuò)展和實(shí)現(xiàn):(與EJB Server無(wú)關(guān))
第一步: 實(shí)現(xiàn)javax.ejb.SessionBean 接口,并提供該Bean的特定功能, "Hel
lo, world" Stateless SessionBean 僅僅向客戶(hù)端返回“Hello,world!”字符串
注意:除了要實(shí)現(xiàn)javax.ejb.SessionBean接口外(ejbActivate(),ejbPassivat
e(), ejbRemove(), setSessionContext()),必須:
1).實(shí)現(xiàn)公共方法ejbCreate(),該方法對(duì)于stateless SessionBean 無(wú)需帶任何
參數(shù)而對(duì)stateful SessionBean則根據(jù)需要自定;
2)提供給客戶(hù)調(diào)用的方法, 如:本例的hello()方法
package com.jsper.ejbexample.session.helloworld;
import javax.ejb.*;
import java.rmi.RemoteException;
public class HelloBean implements SessionBean {
public HelloBean() {
super();
}
/**
*由EJB Server(EJB Container) 調(diào)用,用于激活SessionBean的實(shí)例
*/
public void ejbActivate() throws EJBException, java.rmi.RemoteExceptio
n
{
System.out.println("ejbActivate()");
}
/**
*由EJB Server(EJB Container) 調(diào)用,用于創(chuàng)建本SessionBean的實(shí)例
* 創(chuàng)建日期:(2000-8-1 16:00:45)
*/
public void ejbCreate() throws javax.ejb.CreateException
{
System.out.println("ejbCreate()");
}
/**
* 由EJB Server(EJB Container) 調(diào)用,用于惰化SessionBean的實(shí)例
*/
public void ejbPassivate() throws EJBException, java.rmi.RemoteExcepti
on
{
System.out.println("ejbPassivate()");
}
/**
* 由EJB Server(EJB Container) 調(diào)用,用于刪除SessionBean的實(shí)例
*/
public void ejbRemove() throws EJBException, java.rmi.RemoteException
{
System.out.println("ejbRemove()");
}
/**
* 本SessionBean提供給客戶(hù)調(diào)用的方法,但不能由客戶(hù)直接調(diào)用,而是通過(guò)Ejb
Object遠(yuǎn)程接口調(diào)用
* 創(chuàng)建日期:(2000-8-1 16:04:58)
* @return java.lang.String
*/
public String hello() {
return "Hello, World!";
}
/**
* 由EJB Server(EJB Container) 調(diào)用,用于設(shè)置SessionBean的上下文
*/
public void setSessionContext(SessionContext arg1) throws EJBException
, java.rmi.RemoteException
{
System.out.println("setSessionContext()");
}
}
第二步:擴(kuò)展javax.ejb.EJBObject接口,增加在第一步SessionBean 接口實(shí)現(xiàn)中
提供給客戶(hù)調(diào)用 的方法, 如本例的hello()方法
注意:1)增加的方法名稱(chēng)必須與相應(yīng)的SessionBean實(shí)現(xiàn)中方法相同(case-sen
sitive);
2) 增加的方法必須拋出java.rmi.RemoteException異常
package com.jsper.ejbexample.session.helloworld;
import java.rmi.*;
import javax.ejb.*;
public interface Hello extends EJBObject {
/**
* 由客戶(hù)端直接調(diào)用,返回“hello,world!”,實(shí)現(xiàn)由相應(yīng)的SessionBean完成
* 創(chuàng)建日期:(2000-8-1 15:56:25)
* @return java.lang.String
* @exception java.rmi.RemoteException 異常說(shuō)明。
*/
String hello() throws java.rmi.RemoteException;
}
第三步:擴(kuò)展javax.ejb.EJBHome接口,增加創(chuàng)建EJBHome接口對(duì)象的create()方法
注意: 1)create()方法中參數(shù)的有無(wú)無(wú)關(guān)緊要,但必須與SessionBean接口實(shí)現(xiàn)
類(lèi)中ejbCreate()方法相對(duì)應(yīng),包括從方法的個(gè)數(shù)上和參數(shù)上;例如:若SessionB
ean接口實(shí)現(xiàn)類(lèi)中有ejbCreate(),ejbCreate(int nVal)方法,則該接口擴(kuò)展中必
須增加create(),create(int nVal)方法
2)create()方法必須拋出javax.ejb.CreateException 和java.rmi.RemoteExce
ption 異常
package com.jsper.ejbexample.session.helloworld;
import java.rmi.*;
import javax.ejb.*;
public interface HelloHome extends EJBHome {
/**
* 創(chuàng)建EJBObject擴(kuò)展對(duì)象Hello
* 創(chuàng)建日期:(2000-8-1 16:13:53)
* @return com.jsper.ejbexample.session.helloworld.Hello
* @exception javax.ejb.CreateException 異常說(shuō)明。
* @exception java.rmi.RemoteException 異常說(shuō)明。
*/
Hello create() throws javax.ejb.CreateException, java.rmi.RemoteExcept
ion;
}
? deploy descriptor文件的生成
EJB1.1規(guī)范規(guī)定了必須利用xml文件構(gòu)造deploy descriptor文件,并給出了相應(yīng)
的DTD。本例的ejb-jar.xml文件如下:
images/green-cube.gif
images/orange-cube.gif
helloworld
com.jsper.ejbexample.session.helloworld.HelloHome
com.jsper.ejbexample.session.helloworld.Hello
com.jsper.ejbexample.session.helloworld.HelloBean
Stateless
Container
BEAS
java.lang.Double
100.0
MSFT
java.lang.Double
150.0
helloworld
Remote
*
Required
對(duì)于weblogic Server還必須構(gòu)造一個(gè)名為weblogic-ejb-jar.xml的文件,BEA公
司給出了相應(yīng)的DTD.它描述了相應(yīng)的EJB的名稱(chēng)以及JNDI的名稱(chēng)(**該部分與EJB
Server有關(guān),ejb開(kāi)發(fā)人員可省去,而由DEPLOYER來(lái)完成**)
helloworld
100
hello.HelloHome
? 提供用于標(biāo)示本EJB的大小圖標(biāo)(icon),注意:圖像的格式必須是JPEG 或 GI
F。
本例提供了圖像文件:orange-cube.gif和green-cube.gif(見(jiàn)附件)
? 構(gòu)造.jar文件
第一步:編譯相應(yīng)的.java文件
本例中包括:Hello.java,HelloBean.java,HelloHome.java ,位于包c(diǎn)om.jsper
.ejbexample.session.helloworld中。編譯后相應(yīng)的.class文件放在相對(duì)目錄co
m\jsper\ejbexample\session\helloworld 中。
第二步:創(chuàng)建與com的同級(jí)目錄META-INF,將相應(yīng)的.xml文件拷貝到該目錄下;將相
應(yīng)的圖標(biāo)文件拷貝到相對(duì)目錄(相對(duì)于該.xml文件父目錄)中(本例為與com的同
級(jí)目錄images)
第三步:利用JAR命令將目錄com,images,META-INF中的內(nèi)容做成.jar文件
本例JAR文件名成為std_hello.jar
jar cv0f std_hello.jar META-INF com images
至此, 對(duì)于EJB Provider的工作已經(jīng)完成。
但是由于我們的開(kāi)發(fā)人員在開(kāi)發(fā)ejb的時(shí)候需要進(jìn)行本地調(diào)試等工作,因此其既充
當(dāng)ejb provider的角色,又充當(dāng)其他的腳色, 因此,其可能需要作如下工作(僅
供參考,接上述工作):
? 生成可deployable的jar文件
前邊生成的jar文件(若不含weblogic-ejb-jar.xml文件)是不依賴(lài)于ejb serve
r(ejb container)的,而如前所述,不同的ejb server對(duì)于ejb的配置是不同的
,因此需要加上特定的信息
對(duì)于weblogic server則是通過(guò)相應(yīng)的ejbc命令或deploy utility在原.jar文件的
基礎(chǔ)上生成新的可deployable的.jar文件。(關(guān)于ejbc的詳細(xì)使用請(qǐng)參見(jiàn)有關(guān)資料
):
java –classpath e:\weblogic\classes;e:\weblogic\lib\weblogicaux.jar
-Dweblogic.home=e:\weblogic weblogic.ejbc -compiler javac std_hello.ja
r ejb_helloworld.jar
? 設(shè)定weblogic的環(huán)境
將最終的jar文件(本例ejb_helloworld.jar)放在weblogic的某一子目錄下(例如
:myserver),而后將.jar文件所在的路徑( e:/weblogic/myserver/ ejb_hel
loworld.jar)添加到weblogic.properties文件的入口weblogic.ejb.deploy中(
weblogic.ejb.deploy=e:/weblogic/myserver/ejb_helloworld.jar)
? 啟動(dòng)weblogic server, 在其啟動(dòng)的控制臺(tái)中可以見(jiàn)到相應(yīng)的ejb的裝載成功的
信息。
? 客戶(hù)端調(diào)用