?? ejb內部資參1.txt
字號:
作者:jeru
email: jeru@163.net
日期:2001-1-12 18:09:27
enterpriseJavaBean 入門
一 基本知識
1. 背景
Java由于其良好的跨平臺行而成為服務器端的理想語言,為了利用Java實現服務
器端的計算,SUN推出了一個完整的開發平臺J2EE,其目的是為基于Java的服務器
端配置提供一個獨立于平臺的可攜帶的多用戶企業級的安全平臺,而J2EE的基石
就是Enterprise JavaBeans(EJB),EJB是建立基于JAVA的服務器端組件的標準,它
定義了如何編寫服務器端組件,提供了組件與管理組件的應用服務器之間的標準
約定,EJB是一種組件架構,使得開發人員能夠快速開發出具有伸縮性的企業級應
用。
2. EJB簡介
1)JavaBeans和Enterprise JavaBeans
JavaBeans是Java的組件模型。在JavaBeans規范中定義了事件和屬性等特征。En
terprise JavaBeans也定義了一個Java組件模型,但是Enterprise JavaBeans組
件模型和JavaBeans組件模型是不同的。 JavaBeans重點是允許開發者在開發工具
中可視化的操縱組件。JavaBeans規范詳細地解釋了組件間事件登記、傳遞、識別
和屬性使用、定制和持久化的應用編程接口和語意。 Enterprise JavaBeans的側
重點是詳細地定義了一個可以portably地部署Java組件的服務框架模型。因此,
其中并沒提及事件,因為enterprise bean通常不發送和接受事件。同樣也沒有提
及屬性------屬性定制并不是在開發時進行,而是在運行時(實際上在部署時)
通過一個部署描述符來描述。
不要尋找JavaBeans和Enterprise JavaBeans之間的相似性。他們都是組件模型規
范,但是前者說明了開發工具中應用程序組裝的問題,而后者則側重于部署組件
的服務框架的細節。不要錯誤地認為JavaBeans是用于客戶端的開發,Enterpris
e JavaBeans是用于服務器端的開發。JavaBeans也可作為進行非圖形化服務器端
Java應用開發的組件模型。區別是當你使用JavaBeans創建服務器應用時,你還得
設計整個的服務框架。用Enterprise Javabeans框架是現成的,你只需遵守它的
APIs.對于復雜的服務器端應用程序,顯然使用Enterprise JavaBeans比重新開發
更簡單
2)EJB體系結構
EJB是一種組件架構,它采用分而制之的方法實現服務器端的計算。
EJB規范定義了六種不同的角色來完成其任務, 包括:
? Bean provider: 提供可重用的商業組件
? Container provider: 為ejb 應用提供低層次的運行環境
? Server provider:提供應用程序服務器用以包含,管理和配置ejb組件,目前E
JB規范沒有提供EJB Container和EJB Server之間的接口,故二者的提供商是合一
的,有:BEA的Weblogic server,SUN的NetDynamics,IBM的WebSphere,Oracle的8
i等。
? Application assembler:負責將不同的組件組織起來構成能夠運行的應用程序
? Deployer: 負責將要使用的組件安裝到應用服務器中并加以配置
? System Administrator: 負責配置好的系統的管理等
這六種角色的流程圖如下:
Enterprise JavaBean 駐留在EJB Container中,通過EJB Container對ejb進行管
理。EJB規范定義了二者之間的接口。
Javax.ejb.EJBHome接口列出了所有定位、創建、刪除EJB 類實例的方法。Home對
象是home接口的實現。EJB類開發者必須定義home接口。EJB Container Provide
r應該提供從home接口中產生home對象實現的方法。
遠程接口(remote interface)列出了EJB類中的商業方法。Javax.ejb.EJBObje
ct實現遠程接口,并且客戶端通過它訪問EJB實例的商業方法。EJB開發者定義遠
程接口,EJB Container Provider提供產生相應的EJBObject的方法。客戶端不能
得到EJB實例的引用,只能得到它的EJBObject實例的引用。當客戶端調用一個方
法,EJBObject接受請求并把它傳給EJB實例,同時提供進程中必要的包裝功能。
客戶端應用程序通過home對象來定位、創建、刪除EJB類的實例,通過EJBObject
來調用實例中的商業方法。客戶端可以用Java來編程,通過Java RMI來訪問訪問
home對象和EJBObject,或用其他語言編程并通過CORBA/IIOP訪問,使得部署的服
務器端組件可以通過CORBA接口來訪問。
Enterprise javaBean規范將Enterprise Beans 分為兩種:session bean和enti
ty bean.
I. session bean表示的是調用它的客戶端代碼索要完成的工作,是一種商業處理
過程對象,它實現商業邏輯,商業規則以及工作流程,例如:報價,訂單處理,
視頻壓縮,股票交易等。session bean之所以叫session bean是因為其生命周期
與調用它的客戶端相同。
session bean又分為兩種:stateless和stateful, stateful session bean用于
貫穿多個方法請求和事務的商業過程,例如:網上商店,用戶進入商店后,可以
將商品加入再現的購物車,組件必須跟蹤用戶的狀態(如:購物車);而statel
ess session bean用于客戶調用方法期間不用維護任何狀態信息,例如:解決復
雜數學運算的視頻壓縮/解壓縮。
II. entity bean用來代表商業過程中處理的永久性的數據,例如:銀行出納員組
件完成儲蓄等商業過程,其中涉及的數據時銀行賬戶數據
entity bean用來代表底層的對象。最常用的是用entity bean代表關系庫中的數
據。一個簡單的entity bean 可以定義成代表數據庫表的一個記錄,也就是每一
個實例代表一個特殊的記錄。更復雜的entity bean可以代表數據庫表間關聯視圖
。在entity bean中還可以考慮包含廠商的增強功能,如對象--關系映射的集成。
通常用entity類代表一個數據庫表比代表多個相關聯的表更簡單且更有效。反過
來可以輕易地向entity類的定義中增加關聯,這樣可以最大地復用cache并減小舊
數據的表現。
III. entity bean和session bean的比較
看起來session bean好象沒什么用處,尤其對于數據驅動的應用程序。當然事實
并不是這樣。因為entity bean(譬如說)代表底層數據庫的一行,則entity be
an實例和數據庫記錄間就是一對一的關系。因為多個客戶端必須訪問底層記錄,
這意味著,不同于session bean,客戶端必須共享entity bean。因為是共享的,
所以entity bean不允許保存每個客戶端的信息。session bean允許保存客戶端的
狀態信息,客戶端和session bean實例間是一對一的。entity bean允許保存記錄
的信息,entity bean實例和記錄間是一對一的。一個理想的情況是客戶端通過s
ession bean連接服務器,然后session bean通過entity bean訪問數據庫。這使
得既可以保存客戶端的信息又可以保存數據庫記錄的信息。
同時session bean也不能提供在相同或不同的EJB類調用間進行全局的事務控制。
沒有session bean,應用程序開發者(客戶端開發者)就必須理解EJB類的事務要
求,并使用客戶端的事務劃分來提供事務控制。EJB的主要好處就是應用開發者不
需知道EJB類的事務需求。一個session bean可以代表一個商業操作,進行事務控
制,不需要客戶端進行事務劃分。
以下我們作為EJB provider的角色來討論Enterprise javaBean的開發。
3,EJB 開發
A) Enterprise JavaBean的由如下部分構成
Enterprise Bean 類: 包含ejb 組件的詳細實現,對于session Bean它代表了
與業務處理相關的邏輯的實現,而對于entity Bean 它代表了與數據邏輯相關的
實現
EJB Object :是由EJB Container來實現的遠程接口,它是客戶端和bean 實例之
間的中介,傳遞客戶端調用到bean 實例;
Home 接口:充當EJB Object工廠的java接口,創建EJB Object,Home接口的實現
由EJB Container負責。
Deploy descriptor:描述你的ejb 中間件的相關要求,包括:通知EJB Containe
r如何管理你的bean,事務的需要,安全需要等等。
特定于bean 的屬性: 利用該屬性,bean可以在運行時讀取并調整自己的功能
Ejb-jar 文件:將生成的bean 類,home接口,Ejb object,deployment descrip
tor和bean 的properties 打包進ejb jar 文件,這樣就可以deploy了。
B) Enterprise JavaBean編程的具體步驟
實現javax.ejb.EnterpriseBean接口:
對于session bean 可以直接實現javax.ejb.SessionBean接口,對于entity bea
n 可以直接實現javax.ejb.EntityBean接口,而后實現本bean特有的功能。
擴展javax.ejb.EJBObject接口:
增加在Enterprise Bean實現類中供客戶調用的方法的相應的方法,必須相同
擴展javax.ejb.EJBHome接口:
增加創建上述擴展的javax.ejb.EJBObject接口的相應的create()方法。
編寫deploy descriptor文件:
目前EJB 1.1規范規定了用XML文件來描述它,并提供了相應的DTD.
生成EJB jar 文件:
利用jar命令將上述生成的相應文件進行打包。
在第二部分給出了ejb開發的詳細說明及相關注意事項
二 例子程序
以下的例子程序是以weblogic server(ver5.1)作為EJB Server(EJB Container)
的, 不同的EJB Server 在一些方面有所不同 (不同的地方另加注釋)
例子一. Hello, world (Stateless Session Bean)
包括EJB相應接口的擴展和實現、deploy descriptor文件的生成以及.jar文件生
成;
服務器端EJB開發
EJB相應接口的擴展和實現:(與EJB Server無關)
第一步: 實現javax.ejb.SessionBean 接口,并提供該Bean的特定功能, "Hel
lo, world" Stateless SessionBean 僅僅向客戶端返回“Hello,world!”字符串
注意:除了要實現javax.ejb.SessionBean接口外(ejbActivate(),ejbPassivat
e(), ejbRemove(), setSessionContext()),必須:
1).實現公共方法ejbCreate(),該方法對于stateless SessionBean 無需帶任何
參數而對stateful SessionBean則根據需要自定;
2)提供給客戶調用的方法, 如:本例的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) 調用,用于激活SessionBean的實例
*/
public void ejbActivate() throws EJBException, java.rmi.RemoteExceptio
n
{
System.out.println("ejbActivate()");
}
/**
*由EJB Server(EJB Container) 調用,用于創建本SessionBean的實例
* 創建日期:(2000-8-1 16:00:45)
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -