EJB技術(shù)的歷史
本文概述 Enterprise JavaBeans (EJB)技術(shù),旨在讓讀者快速理解基本 概念。本文講述 EJB技術(shù)的歷史。為了簡潔明了有選擇地講述EJB技術(shù)的一些關(guān)鍵要素。請注意,雖然 EJB 組件依賴于一些基礎(chǔ) 的 Java服務(wù)(如 Java Transaction Service),但使用EJB組件及認(rèn)識這些組件的好處并不需要掌握這些相關(guān)技術(shù)的知識。
Enterprise JavaBeans 這一名稱利用了 Java bean ― 這種可移植、可重用 的 Java 軟件組件的聲望。Enterprise JavaBeans 技術(shù)把 Java 組件的概念從客戶機域擴展到了 服務(wù)器域:這是 Java 技術(shù)成長過程中有重大意義的一步,它使 Java 技術(shù)發(fā)展成為一種強健的、可伸縮的環(huán)境,能夠支持以任務(wù)為關(guān)鍵的企業(yè)信息系統(tǒng)。
服務(wù)器上的 Java 應(yīng)用程序
Java 編程語言最初在 Web 開發(fā)人員中獲得好評的一個原因是,它支持稱 為 applet 的可下載 Java 程序。對 Applet 的支持以 Applet 類的形式內(nèi)置到 了 1.0 版的 Java Development Kit (JDK) 中。按照 1.0 版的時間框架,Java 開發(fā)是以 applet 和 應(yīng)用程序作為中心的。基于 JDK 1.0 版的 Java 讀物都是從 applet 和應(yīng)用程序的角度來描述 Java 編程的:
“Java 程序由更多的類定義中的某一個組成,每個類定義均已編譯成它自已 的 Java 虛擬機對象代碼的 .class 文件。這些類之一必須定義一個 叫做 main() 的方法,程序就是從這個方法開始運行的。想調(diào)用一個 Java 程序,需要運行 Java 解釋器 java,并指定包含 main() 方法的類的名稱。請注 意 Java applet 并不是一個應(yīng)用程序 ― 它是一個由已在運行的 Java 應(yīng)用 程序(如 Web 瀏覽器或 applet 查看器)裝入并運行的 Java 類。”(見 Flanagan 所著 的 Java in a Nutshell)
Java 應(yīng)用程序可以在服務(wù)器上運行,但是不管是在客戶機-服務(wù)器環(huán)境下,還是在基于 Web 的環(huán)境 下,JDK 中都沒有提供讓 Java 應(yīng)用程序?qū)S糜诜?wù)器機器的接口或包。認(rèn)識到 Java 在 Web 環(huán)境下作為一種服務(wù)器語言的潛力,Sun Microsystems 編寫了 Java Servlet 規(guī)范。servlet 在許多方面 與 applet 相似,它是專門為在 Web 服務(wù)器機器上運行而設(shè)計的 Java 程序:
“servlet 是由容器管理的 Web 組件,可產(chǎn)生動態(tài)內(nèi)容。servlet 是 一種小型的、與平臺無關(guān)的 Java 類,被編譯成體系結(jié)構(gòu)中立的字節(jié)代碼,這種代碼可以動態(tài)地加載到 一個 web 服務(wù)器上,并由此 web 服務(wù)器運行。servlet 通過一種 由 servlet 容器實現(xiàn)的請求-響應(yīng)模型與 Web 客戶機進行交互。這種請求-響應(yīng)模型建立在超文本傳輸協(xié)議 (HTTP) 行為的基礎(chǔ)之上。”(見 JavaSoft 的“Java Servlet API Specification”)
在一臺 Web 服務(wù)器控制下,在多臺服務(wù)器上運行若干小型用戶程序,這種想法并不新鮮 ― 一段時間 以來,公共網(wǎng)關(guān)接口 (CGI) 程序(常被稱為 CGI 腳本)一直起著這種作用,并推動了 Web 的普 及。但 Java servlet 可以以更高的效率和可移植性來實現(xiàn)這一目的,因而 可望最終會取代 CGI 程序。為 servlet 提供運行時環(huán)境的 軟件(通常被稱為 servlet 引擎)可以添加到現(xiàn)有的、本身并不支持 Java 可執(zhí)行程序 的 Web 服務(wù)器上。
Java servlet 的出現(xiàn),為應(yīng)用程序員使用 Java 來創(chuàng)建 Web 應(yīng)用程序開辟了新的途徑。但是,僅有 servlet 還不能為真正的企業(yè)計算提供完整的模型。CGI 應(yīng)用程序本身往往不是完整的應(yīng)用程序,在處理接收自 Web 瀏覽器上用戶的信息請求時,CGI 只是整個處理過程中的一個中間步驟。例如,CGI 應(yīng)用程序的一種常見用途是訪問數(shù)據(jù)庫。將它用于這種任務(wù)時,CGI 程序提供一種方法,將用戶的數(shù)據(jù)請求連接到能滿足這種請求的企業(yè)數(shù)據(jù)庫。CGI 程序常常充當(dāng)一種中間軟件,從 Web 瀏覽器接收請求,決定必須調(diào)用哪些計算資源來滿足這些請求,并向瀏覽器發(fā)回響應(yīng)。Java servlet 與 CGI 程序一樣,最適合充當(dāng)連接前端 Web 請求與后端 數(shù)據(jù)資源的中間層組件。
三層體系結(jié)構(gòu)
Web 編程向服務(wù)器端 Java 應(yīng)用程序的演化,也帶來了體系結(jié)構(gòu)的演化,使它脫離了常規(guī)的客戶機-服務(wù)器兩層模型,而向一種三層方法發(fā)展。兩層模型當(dāng)時曾經(jīng)具有創(chuàng)新意義,因為它將一些計算任務(wù)從主處理器上卸載到靈巧的客戶機。常規(guī)的基于 LAN 的數(shù)據(jù)庫應(yīng)用程序就是一個例子,其中數(shù)據(jù)庫管理器服務(wù)器軟件駐留在一個專用的服務(wù)器機器上,而用戶則通過他們的工作站上的客戶機代碼來訪問數(shù)據(jù)庫。隨著客戶機-服務(wù)器模型成長到能付諸使用,就出現(xiàn)了對服務(wù)器可伸縮性和對客戶機代碼大小和復(fù)雜性的關(guān)注。于是提出了一種三層的體系結(jié)構(gòu),以避免在兩層模型中已察覺到的弱點,使 Web 能成為一個計算平臺:
“許多人...斷言,傳統(tǒng)的客戶機/服務(wù)器兩層體系結(jié)構(gòu)不會有好的可伸縮性,因為用戶連接和數(shù)據(jù)訪問的數(shù)量無法預(yù)測,而且在一些系統(tǒng)管理上也存在問題。為處理兩層體系結(jié)構(gòu)的限制,許多開發(fā)集體都在轉(zhuǎn)向三層體系結(jié)構(gòu)。這種體系結(jié)構(gòu)大致可以定義為:客戶機層上的表示層、中間的服務(wù)器和后端的某種數(shù)據(jù)庫。這種設(shè)想的目的就是緩和客戶機或數(shù)據(jù)庫服務(wù)器上的代碼膨脹,集中管理業(yè)務(wù)邏輯,更靈活地使用數(shù)據(jù)庫,而不僅是使用所存儲的過程和觸發(fā)器。”(見 Kim 的“Looking for a 3-Tier App Builder?”)
一個三層結(jié)構(gòu)模型通常被想像成有一個 Web 瀏覽器作為客戶層。Web 瀏覽器由于有可能成為一種真正的通用客戶機,使它從觀念上取代了兩層結(jié)構(gòu)的“胖客戶機”。如果瀏覽器作為 Web 應(yīng)用程序體系結(jié)構(gòu)的標(biāo)準(zhǔn)瘦客戶機獲得認(rèn)可,那么以前駐留在兩層模型的胖客戶機中的功能會怎么樣呢?現(xiàn)在,應(yīng)用程序?qū)S玫墓δ懿⒉灰浦不胤?wù)器(例如數(shù)據(jù)庫管理器),而是有意將它駐留在一個新的中間層上。中間層支持應(yīng)用程序服務(wù)器軟件,這種軟件是中間件的一種形式,它處于第一層上瘦客戶機的最小功能和第三層上服務(wù)器端業(yè)務(wù)系統(tǒng)的豐富功能之間。由于三層體系結(jié)構(gòu)與 Web 處理模型有密切關(guān)系,所以中間層應(yīng)用程序服務(wù)器常被視 為 Web 服務(wù)器的一種功能擴展。現(xiàn)有的 Web 應(yīng)用程序利用 CGI 程序,將來自 Web 瀏覽器的用戶請求傳送 到不基于 Web 的業(yè)務(wù)系統(tǒng),并向瀏覽器返回響應(yīng),就是三層模型的一種實現(xiàn)。這些應(yīng)用程序逐漸向 servlet 技術(shù)的轉(zhuǎn)移說明三層模型正在增強。
JavaBeans 組件
JavaBeans 規(guī)范將“組件軟件”的概念引入到 Java 編程的領(lǐng)域。組件是自含的、可重用 的軟件單元;而 JavaBeans 組件,則可以使用可視的應(yīng)用程序開發(fā)工具,可視地將它們 編寫到 Java 程序中。JavaBeans 規(guī)范為 Java 開發(fā)人員提供了一種“組件化”其 Java 類的方法:
Bean 是一些 Java 類,可在一個可視的構(gòu)建器工具中操作它們,并且可以將它們一起編寫到應(yīng)用程序中。任何具有某種特性和事件接口約定的 Java 類都可以是一個 Bean。(見 JavaSoft,“Using the Beans Development Kit 1.0”)
如果軟件重用是一個好主意,那么是否應(yīng)該讓每一個 Java 類都成為 Java bean 呢?如 果 Java 類滿足某些準(zhǔn)則,它們就適于充當(dāng) bean 的角色:
在開發(fā)任何新軟件之前,都值得考慮是否用 JavaBean 的形式來開發(fā)它。如果軟件模塊要既能夠可視地操作,又能夠定制以達到某些效果,則這種軟件模塊就可能適于做成一個 JavaBean。為幫助您確定要開發(fā)的軟件是否應(yīng)該是一個 JavaBean,假定它應(yīng)該是 用 Java 編寫的,請向您自已提出以下問題,并相應(yīng)地作出決定:
是否打算讓它可重用?或者,它會是可重用的嗎?
是否希望將它與其他可重用的 Java 組件一起使用?
是否預(yù)計會在 IDE 工具中使用它?
如果上述問題的答案都是肯定的,則它應(yīng)該作為 JavaBean 來開 發(fā)。(見 developerWorks 的“JavaBeans Guidelines”)
JavaBean 概念是為了在 Java 編程環(huán)境中支持可重用的組件,它是一種一般性的設(shè)計方法,適用于客戶機或服務(wù)器機器上運行的 Java 程序。由于對可視的構(gòu)建器工具的強調(diào),也由于許多 Java bean 都是圖形用戶界面 (GUI) 組件,所以 JavaBean 組件可能被視為一種客戶端技術(shù)。但是,并不要求 Java bean 都是可視的,并且它們也可以用于服務(wù)器環(huán)境中。
編碼為 Java bean 的 Java 類通常具有以下特征:
使用設(shè)計模式。這些模式就是方法和接口的編碼約定。
支持可視的軟件開發(fā)工具。類必須將變量(稱為屬性)、方法和事件展示出來。
可以定制。定制包括能支持缺省的屬性編輯器,或者提供單一的定制規(guī)則。定制使開發(fā)人員得以在不更改源代碼的情況下更改 bean 的行為。
支持自省 (introspection)。這指的是將屬性、方法和事件公開給其他類,可以通過設(shè)計模式或通過創(chuàng)建 BeanInfo 類 來完成這種自省。
是持久的。這就允許在一個可視構(gòu)建器中定制一個 bean,然后以其定制后的狀態(tài)加以保存。
Java 2 Platform, Enterprise Edition
Sun Microsystems 發(fā)起了一項稱為 Java 2 Platform, Enterprise Edition (J2EE) 的技術(shù) 創(chuàng)新,旨在將 Java 平臺的范圍擴展到大規(guī)模服務(wù)器環(huán)境:
“1997 年 4 月 12 日,Sun 宣布了一項為企業(yè)環(huán)境 開發(fā) Java 平臺的創(chuàng)新成果。使 用開放式的 Java Community Process,Sun 促進了一組標(biāo)準(zhǔn)的 Java 擴展的開發(fā),稱 為 Enterprise Java API。這些應(yīng)用程序編程接口 (API) 為各種各樣的中間件的實現(xiàn)提供了不依賴 供應(yīng)商的編程 接口。Enterprise Java API 的要點是 Enterprise JavaBeans API,后者為 Java 應(yīng)用程序服務(wù)器定義了一個服務(wù)器端組件模型,以及一個不依賴供應(yīng)商的編程接口。”(見 Thomas 的“Java 2 Platform, Enterprise Edition: Ensuring Consistency, Portability, and Interoperability”)
J2EE 為 Enterprise JavaBeans 技術(shù)提供了工作環(huán)境。事實上,Sun 把若干項軟件技術(shù)都設(shè)想為這樣的構(gòu)件塊,它們將使大型企業(yè)能夠把以任務(wù)為關(guān)鍵的業(yè)務(wù)系統(tǒng)移植到 Java 環(huán)境 中,而 Enterprise JavaBeans 技術(shù)不過是這些技術(shù)之一。EJB 組件是按它們自己的規(guī)范定義 的,但 EJB技術(shù)并不是一項獨立的技術(shù)。它建立在 其他 Java 技術(shù)之上,這些技術(shù)由 Sun 和其他 IT 公司聯(lián)合規(guī)定,它們一起提供了這個框架的內(nèi)容,該框架就稱為 Java 2 Platform, Enterprise Edition。
J2EE 中包括以下技術(shù):
◆Enterprise JavaBeans (EJB) 技術(shù)
◆Java Interface Definition Language (IDL)
◆Java Message Service (JMS) API
◆Java Naming and Directory Interface (JNDI)
◆Java Remote Method Invocation (RMI) 和 Object Serialization
◆Java Servlet API
◆Java Transaction API (JTA)
◆Java Transaction Service (JTS)
◆JavaServer Pages (JSP) 技術(shù)
◆JDBC 數(shù)據(jù)庫訪問 API
參與到這個企業(yè) Java 框架中,并不意味著每項技術(shù)都依賴于所有其他技術(shù)。單獨的規(guī)范文檔指出每項技術(shù)的相關(guān)性。例如,Enterprise JavaBeans 規(guī)范 1.0 發(fā)行版就指明了在定位各個組件時與 JNDI 的相關(guān)性,以及在編程中啟動和停止事務(wù)處理時與 JTA 的相關(guān)性。
【編輯推薦】