J2EE 探險(xiǎn)者: 用于無(wú)狀態(tài)網(wǎng)絡(luò)的 J2EE 技術(shù)
servlet,無(wú)狀態(tài)會(huì)話 bean,亦是兩者都用?
|
|
|
|
|
?
|
|
|
級(jí)別: 初級(jí)
Kyle Gabhart
, 高級(jí)顧問(wèn), LearningPatterns
2003 年 5 月 27 日
用 J2EE 開(kāi)發(fā)企業(yè)應(yīng)用程序時(shí),它向人們提供了眾多選項(xiàng) ― 使得為基礎(chǔ)結(jié)構(gòu)選擇合適的解決方案不是一件簡(jiǎn)單的任務(wù)。 J2EE探險(xiǎn)者是專(zhuān)門(mén)針對(duì) Java 技術(shù)經(jīng)理、架構(gòu)設(shè)計(jì)師和開(kāi)發(fā)人員的系列文章。該系列中的每一篇文章都會(huì)向您展示一種或幾種J2EE 技術(shù),并經(jīng)常對(duì)它們加以權(quán)衡,從而幫助您做出富有見(jiàn)識(shí)的決策。在本文,也就是該系列的第 1 部分中,LearningPatterns 的高級(jí)顧問(wèn) KyleGabhart 比較了兩種用于無(wú)狀態(tài)網(wǎng)絡(luò)的 J2EE 技術(shù):servlet 和 EJB 技術(shù)。
在最近幾年里,Java 行業(yè)的發(fā)展呈指數(shù)級(jí)增長(zhǎng)。作為一名企業(yè)應(yīng)用程序開(kāi)發(fā)人員、架構(gòu)設(shè)計(jì)師或者技術(shù)經(jīng)理,您可以從許多供應(yīng)商、最佳實(shí)踐、規(guī)范和組件類(lèi)型中為您的 Java 技術(shù)實(shí)現(xiàn)進(jìn)行選擇。 J2EE 探險(xiǎn)者系列的目的是幫助您從這些選擇中找到一條途徑,對(duì)于任何一種給定的情形,協(xié)助您挑選合適的技術(shù)。
在本文,也就是第 1 部分中,我們將探討無(wú)狀態(tài) J2EE 組件,并評(píng)估出最合適的組件來(lái)用于您的企業(yè)體系結(jié)構(gòu)。說(shuō)到無(wú)狀態(tài)、請(qǐng)求處理組件,可供選擇的 J2EE 技術(shù)主要有兩種:servlet 或 Enterprise JavaBeans 技術(shù) ― 或更具體一點(diǎn),無(wú)狀態(tài)會(huì)話 bean。
一般而言,servlet 和 EJB 組件是設(shè)計(jì)用于作為企業(yè)體系結(jié)構(gòu)的事務(wù)管理組件。每一種技術(shù)都有其長(zhǎng)處。servlet 體系結(jié)構(gòu)的長(zhǎng)處在于它的整體效率和相對(duì)簡(jiǎn)單性。而 EJB 組件則更健壯,因此開(kāi)發(fā)、維護(hù)和調(diào)試要更復(fù)雜。
我們首先簡(jiǎn)要討論一下無(wú)狀態(tài)(相對(duì)于有狀態(tài))網(wǎng)絡(luò)的質(zhì)量,然后從正反兩方面詳細(xì)探討這兩種無(wú)狀態(tài)技術(shù)。在文章最后,我們泛泛地探討一下 J2EE 企業(yè)編程中最常見(jiàn)的一些應(yīng)用程序設(shè)置,以及對(duì)應(yīng)我們所討論的這兩種選擇的最佳技術(shù)解決方案。
|
EJB 入門(mén)
EJB 技術(shù)的初學(xué)者確實(shí)應(yīng)該先閱讀“ EJB 入門(mén)”一文,這是一篇針對(duì)初學(xué)者的關(guān)于 Enterprise JavaBeans 技術(shù)的文章。
|
|
請(qǐng)注意,從本文的目的出發(fā),JSP(Java ServerPages)技術(shù)被認(rèn)為是特殊類(lèi)型的 servlet。考慮到在執(zhí)行每個(gè) JSP 頁(yè)面之前先將其轉(zhuǎn)換成 servlet,因此這種說(shuō)法不難理解。因?yàn)?servlet 固有的無(wú)狀態(tài)性,所以我們只考慮無(wú)狀態(tài)會(huì)話 bean 以及它們?yōu)樘幚頍o(wú)狀態(tài)客戶(hù)機(jī)請(qǐng)求所提供的特性。本系列的下一篇文章將對(duì)有狀態(tài)會(huì)話 bean 與 servlet 和 HTTP 會(huì)話 API 進(jìn)行比較。
無(wú)狀態(tài)網(wǎng)絡(luò)
可以將 Web 應(yīng)用程序協(xié)議分為兩大類(lèi):無(wú)狀態(tài)和有狀態(tài)。協(xié)議的 狀態(tài)是指下一次傳輸可以“記住”這次傳輸信息的能力。 有狀態(tài)協(xié)議能夠根據(jù)客戶(hù)機(jī)以前的請(qǐng)求創(chuàng)建上下文。 無(wú)狀態(tài)協(xié)議沒(méi)有上下文;每個(gè)請(qǐng)求都是與服務(wù)器的獨(dú)立連接。
HTTP 就是一個(gè)很好的無(wú)狀態(tài)協(xié)議的示例,它建立在客戶(hù)機(jī)-服務(wù)器請(qǐng)求和響應(yīng)的基礎(chǔ)之上。在 HTTP 中,不會(huì)為下一次請(qǐng)求維護(hù)這次請(qǐng)求中客戶(hù)機(jī)-服務(wù)器間交互的信息。
當(dāng)然,由于無(wú)法維護(hù)狀態(tài),因特網(wǎng)將只能成為漂亮的百科全書(shū)、電子黃頁(yè)以及 Shockwave.com 上很酷的動(dòng)畫(huà)游戲。因此,出現(xiàn)了一些技巧在 HTTP 上模擬有狀態(tài)會(huì)話。有狀態(tài)信息可以存儲(chǔ)在 HTML 表單域或用戶(hù)機(jī)器的 cookie 中,也可以附到超級(jí)鏈接中。然后,應(yīng)用程序開(kāi)發(fā)人員負(fù)責(zé)管理、跟蹤和維護(hù)客戶(hù)機(jī)的狀態(tài)以確保會(huì)話過(guò)程順暢、安全以及讓人著迷。
servlet 的適用情況
servlet 體系結(jié)構(gòu)被設(shè)計(jì)成靈活的、與平臺(tái)無(wú)關(guān)的組件模型,它在服務(wù)器上執(zhí)行,并處理客戶(hù)機(jī)的請(qǐng)求。Servlet 很 靈活,因?yàn)樗鼈兪怯煞?wù)器的部署描述符(它是特定于服務(wù)器的)和 Web 應(yīng)用程序部署描述符(它是由 J2EE 規(guī)范定義的,與服務(wù)器無(wú)關(guān),例如 web.xml)兩者的組合唯一地配置的。Servlet 之所以 與平臺(tái)無(wú)關(guān)是因?yàn)樗鼈兛梢赃\(yùn)行在任何 OS 上(這得益于 JVM),可以在任何 J2EE Web 服務(wù)器中運(yùn)行(這得益于 J2EE 標(biāo)準(zhǔn))。最后,servlet 體系結(jié)構(gòu)是一個(gè) 組件模型,因?yàn)樗归_(kāi)發(fā)人員可以編寫(xiě)周全的、可實(shí)現(xiàn)特定接口的組件。然后在運(yùn)行時(shí)將這些組件組裝起來(lái),以處理客戶(hù)機(jī)請(qǐng)求。
雖然 servlet 通常處理 HTTP 請(qǐng)求,但 servlet 體系結(jié)構(gòu)與協(xié)議無(wú)關(guān)。servlet 接口定義了與 servlet 通信所需的基本方法,而不用考慮網(wǎng)絡(luò)協(xié)議。為了簡(jiǎn)單起見(jiàn)以及由于 HTTP servlet 是最常用的類(lèi)型,因此我們將只討論 HTTP servlet。事實(shí)上,如果從 HTTPServlet
擴(kuò)展定制的 servlet 類(lèi),則無(wú)需擔(dān)心解析 HTTP 請(qǐng)求流、抽取參數(shù)或其它任何典型的 HTTP 處理活動(dòng)中所涉及到的細(xì)節(jié), 就能夠方便地使用和處理 HTTP 通信。
servlet 體系結(jié)構(gòu)
人們通常將模型-視圖-控制器(MVC)設(shè)計(jì)模式應(yīng)用于需要某類(lèi)人機(jī)界面的情形。該模式源自 Smalltalk 社區(qū),在那里用它來(lái)構(gòu)建靈活的且可重用的用戶(hù)界面。Servlet 天生就適合于 MVC 設(shè)計(jì)方法。在這種體系結(jié)構(gòu)中, 模型是指正在被訪問(wèn)數(shù)據(jù)的結(jié)構(gòu)和類(lèi)型。模型組件通常包含業(yè)務(wù)邏輯,業(yè)務(wù)邏輯控制數(shù)據(jù)訪問(wèn)并為一個(gè)或多個(gè)視圖服務(wù)。 視圖提供了用戶(hù)界面,用戶(hù)或應(yīng)用程序組件可以通過(guò)用戶(hù)界面來(lái)訪問(wèn)模型。可以用多個(gè)視圖來(lái)提供模型的各個(gè)界面。最后, 控制器組件協(xié)調(diào)整個(gè)通信。控制器處理客戶(hù)機(jī)輸入、操作模型以及決定將哪個(gè)視圖發(fā)送給給定的客戶(hù)機(jī)。
從體系結(jié)構(gòu)角度來(lái)講,servlet 可充當(dāng)控制器和視圖。通常,將 JSP 頁(yè)面用作視圖組件,將 JSP 頁(yè)面或純 servlet 用作控制器組件。Servlet 在處理如內(nèi)容格式化和顯示、基本請(qǐng)求處理、安全請(qǐng)求等等之類(lèi)的用戶(hù)交互工作時(shí)很有效。通常,servlet 會(huì)使用助手類(lèi)(通常為 JavaBean 樣式的類(lèi))來(lái)處理繁重的工作,或使用這些類(lèi)與后端組件進(jìn)行相互操作。這就允許 servlet 層專(zhuān)注于客戶(hù)機(jī)交互,而不是業(yè)務(wù)處理。
Servlet 是非常輕量級(jí)的,因?yàn)橹恍枰邢薜馁Y源來(lái)初始化以及維護(hù) servlet 實(shí)例。servlet 的可伸縮性非常平滑和有效。在 servlet 體系結(jié)構(gòu)下,給定的 servlet 實(shí)例通過(guò)為每個(gè)請(qǐng)求產(chǎn)生新的線程并在每個(gè)線程內(nèi)執(zhí)行 service()
方法來(lái)同時(shí)處理多個(gè)請(qǐng)求。圖 1 顯示了 servlet 實(shí)例的生命周期,展示了它的輕量級(jí)可伸縮性。
圖 1. servlet 線程模型
無(wú)論是否需要管理 servlet 容器、設(shè)置服務(wù)器負(fù)載均衡、處理簡(jiǎn)單的 HTML 表單或甚至對(duì) HTTP 數(shù)據(jù)流執(zhí)行復(fù)雜的處理,servlet 體系結(jié)構(gòu)和 API 都能使 Web 應(yīng)用程序開(kāi)發(fā)和部署變得非常容易。用 servlet 容器設(shè)置和管理 Web 服務(wù)器非常簡(jiǎn)單,只需要很少的配置。對(duì)于服務(wù)器部署,通常一個(gè)或兩個(gè) XML 文件就包含所有所需的配置設(shè)置。對(duì) servlet 進(jìn)行編程也很簡(jiǎn)單。servlet API 對(duì)以下過(guò)程中所涉及到的細(xì)節(jié)進(jìn)行了抽象:截取客戶(hù)機(jī)請(qǐng)求、將請(qǐng)求路由至相應(yīng)的 servlet 實(shí)例、從線程池檢索線程、調(diào)用正確的方法來(lái)處理請(qǐng)求( doGet()
、 doPost()
或其它任何從 service()
方法調(diào)用的方法)以及甚至為抽取和處理編碼的 HTTP 數(shù)據(jù)提供方便的 API。
會(huì)話 bean 的適用情況
EJB 體系結(jié)構(gòu)還被設(shè)計(jì)用來(lái)提供靈活的、與平臺(tái)無(wú)關(guān)的、服務(wù)器端的組件模型。在這些特性和實(shí)現(xiàn)方面,EJB 規(guī)范是 Servlet 規(guī)范的翻版。通過(guò)使用用于部署階段綁定的部署描述符,兩種技術(shù)都具有靈活性;得益于 JVM 和 J2EE 規(guī)范,兩種技術(shù)都與平臺(tái)無(wú)關(guān);兩種技術(shù)都提供了服務(wù)器端組件模型,這兩種模型使用接口和抽象類(lèi)以減少開(kāi)發(fā)時(shí)間和麻煩,并確保了最優(yōu)的組件重用性。另外,無(wú)狀態(tài)會(huì)話 bean 從 EJB 容器獲得了一些好處,包括聲明的安全性、聲明的事務(wù)上下文、與其它企業(yè) bean 的可配置關(guān)系,以及可以方便地通過(guò)資源管理器連接工廠與其它 J2EE API(譬如 JMS、JavaMail 和 JDBC)集成。
最初,與企業(yè) bean 通信是通過(guò)人機(jī)接口進(jìn)行的,最終是通過(guò) bean 的 home 接口或本地接口進(jìn)行。由于外部客戶(hù)機(jī)不能使用本地接口,因此我們只探討遠(yuǎn)程接口。通過(guò)使用 Java 遠(yuǎn)程方法調(diào)用(RMI)與遠(yuǎn)程接口進(jìn)行通信。RMI 是特定于 Java 平臺(tái)的網(wǎng)絡(luò)協(xié)議,它使 Java 對(duì)象可以與遠(yuǎn)程 Java 對(duì)象進(jìn)行交互,就好象該遠(yuǎn)程對(duì)象在本地一樣。因此,只有 Java 組件(applet、servlet、AWT、Swing 和非 GUI Java 應(yīng)用程序等)可直接用作 EJB 客戶(hù)機(jī)。其它任何客戶(hù)機(jī)類(lèi)型(譬如手機(jī)、瀏覽器或非 Java 應(yīng)用程序)都必須通過(guò) Java 應(yīng)用程序進(jìn)行通信。
EJB 體系結(jié)構(gòu)
從體系結(jié)構(gòu)的角度,會(huì)話 bean 可以用作視圖、控制器或甚至模型本身。通常,它們還實(shí)現(xiàn)虛包(Facade)模式或業(yè)務(wù)委派(Business Delegate)模式(請(qǐng)參閱 參考資料)。servlet(或 JSP 頁(yè)面)、幫助 servlet 的 JavaBean(或 JSP 頁(yè)面)、另一個(gè)企業(yè) bean 可以訪問(wèn)會(huì)話 bean,也可以直接通過(guò) applet、Swing 應(yīng)用程序或其它 Java 應(yīng)用程序訪問(wèn)會(huì)話 bean。
雖然到目前為止會(huì)話 bean 是最輕量級(jí)的 EJB 類(lèi)型,但使用 EJB 容器和 EJB 體系結(jié)構(gòu)是有代價(jià)的。EJB 容器需要占用服務(wù)器大量的處理能力和內(nèi)存。不象 Java servlet 所采用的輕量級(jí)線程機(jī)制,EJB 組件需要?jiǎng)?chuàng)建和管理多個(gè)對(duì)象實(shí)例和相關(guān)資源(請(qǐng)參閱圖 2)。然而,較高的開(kāi)銷(xiāo)所換來(lái)的好處是,在不犧牲很多響應(yīng)時(shí)間和整體可伸縮性的情形下,EJB 組件向企業(yè)資源、事務(wù)和安全性檢查提供了有效的管理。因?yàn)闊o(wú)狀態(tài)會(huì)話 bean 不一定需要維護(hù)任何客戶(hù)機(jī)狀態(tài),所以可以有效地合用無(wú)狀態(tài)會(huì)話 bean,使用它們來(lái)完成任何客戶(hù)機(jī)的請(qǐng)求。
圖 2. 企業(yè) bean 管理
無(wú)論您需要管理 EJB 容器、設(shè)置服務(wù)器群集、為企業(yè) bean 聲明配置設(shè)置還是需要利用容器眾多服務(wù)(包括安全性、事務(wù)管理和資源管理等)中的某項(xiàng)服務(wù),EJB 體系結(jié)構(gòu)和 API 都能使開(kāi)發(fā)和部署健壯且功能齊全的 J2EE 應(yīng)用程序變得出奇的簡(jiǎn)單。部署描述符定義了容器和 bean 配置,EJB API 使用接口、bean 生命周期回調(diào)方法和工廠模式清晰地分隔開(kāi)容器和企業(yè) bean,同時(shí)仍使 bean 開(kāi)發(fā)人員能方便地訪問(wèn)容器服務(wù)。
選擇正確的技術(shù)
在某些情況下,確定使用 servlet(或 JSP 技術(shù))、無(wú)狀態(tài)會(huì)話 bean 還是同時(shí)使用這兩者是一件非常簡(jiǎn)單的事情,而在另外一些情況下,這種選擇卻需要不少技巧。通常的配置是使用 servlet 層來(lái)處理與 HTTP 客戶(hù)機(jī)的交互,然后將業(yè)務(wù)處理交給 EJB 層(主要由無(wú)狀態(tài)會(huì)話 bean 組成,偶爾也有實(shí)體 bean 組成)。在這一節(jié),我們將研究幾個(gè)典型的應(yīng)用程序情況,并討論解決這些情況的組件或最佳組件。
當(dāng)您研究這些情況時(shí),請(qǐng)牢記就每種技術(shù)您所了解的內(nèi)容。尤其要記住,servlet 體系結(jié)構(gòu)的輕量級(jí)線程模型使 servlet 的可伸縮性特別有效,而無(wú)狀態(tài)會(huì)話 bean 極好地平衡了健壯企業(yè)資源的訪問(wèn)、恰當(dāng)?shù)捻憫?yīng)時(shí)間和整體可伸縮性,有時(shí)無(wú)狀態(tài)會(huì)話 bean 能較好地適合比較重量級(jí)的應(yīng)用程序。
應(yīng)用程序客戶(hù)機(jī)
標(biāo)準(zhǔn)的應(yīng)用程序客戶(hù)機(jī)是與另一系統(tǒng)或組件進(jìn)行相互操作的用戶(hù),而不是與應(yīng)用程序進(jìn)行相互操作的用戶(hù)。我們將研究三種典型的應(yīng)用程序客戶(hù)機(jī)情況,以及它們最可能的解決方案:
- 如果客戶(hù)機(jī)是基于 Java 的,并且和服務(wù)器位于同一個(gè)防火墻之后,則最好的解決方案是使用 RMI,直接與應(yīng)用程序服務(wù)器上的無(wú)狀態(tài)會(huì)話 bean 通信。
- 如果正在使用非 Java 客戶(hù)機(jī),或者客戶(hù)機(jī)沒(méi)有位于服務(wù)器的防火墻之后,則您會(huì)希望使用 HTTP 協(xié)議來(lái)與 servlet 進(jìn)行相互操作。(應(yīng)該根據(jù)是否需要訪問(wèn)由 EJB 組件所提供的廣泛的企業(yè)支持來(lái)決定是只使用 servlet 還是通過(guò) servlet 訪問(wèn)會(huì)話 bean)。
- 第三種情形較少見(jiàn),但確實(shí)會(huì)出現(xiàn)。一些應(yīng)用程序服務(wù)器供應(yīng)商采用接受本機(jī) IIOP 調(diào)用這樣的方式將其 EJB 容器公開(kāi),使 CORBA 客戶(hù)機(jī)將 EJB 組件看作本機(jī) CORBA 應(yīng)用程序。這允許非 Java 客戶(hù)機(jī)使用 IIOP 協(xié)議來(lái)與無(wú)狀態(tài)會(huì)話 bean 進(jìn)行通信。在這種設(shè)置中,客戶(hù)機(jī)繞過(guò)了整個(gè) Web 層,使用 IIOP 協(xié)議直接與業(yè)務(wù)層(無(wú)狀態(tài)會(huì)話 EJB 組件)通信。
企業(yè)應(yīng)用程序集成(EAI)
EAI 通常使用一個(gè)或多個(gè)事務(wù)將兩個(gè)或多個(gè)企業(yè)應(yīng)用程序集成到無(wú)縫值鏈中。由于 J2EE 對(duì)原有應(yīng)用程序、消息傳遞系統(tǒng)、各種數(shù)據(jù)源和其它企業(yè)應(yīng)用程序提供了廣泛的支持,所以它常常被用來(lái)將各種應(yīng)用程序“粘合”成相連的集成系統(tǒng)。
在 EAI 這種情形中,servlet 和 EJB 組件作用差不多,因?yàn)樵诩森h(huán)境中使用 servlet 已經(jīng)受到了限制。在這種罕見(jiàn)的情形中:應(yīng)用程序需要調(diào)用 J2EE 方法,而除 HTTP 之外沒(méi)有其它機(jī)制可用,對(duì)于 EAI,servlet 是很有用的。否則,它只能帶來(lái)額外的開(kāi)銷(xiāo),以及造成體系結(jié)構(gòu)不必要的復(fù)雜性。
不象 servlet,無(wú)狀態(tài)會(huì)話 bean 很好地被設(shè)計(jì)用于 EAI。無(wú)狀態(tài)會(huì)話 bean 是非常輕量級(jí)的(相對(duì)于有狀態(tài)會(huì)話 bean),可以方便地合用它們以確保極佳的可伸縮性。在 EAI 中常常需要狀態(tài)管理,但可以通過(guò)專(zhuān)門(mén)機(jī)制或通過(guò) J2EE 事務(wù)來(lái)解決此問(wèn)題。因此,從應(yīng)用程序服務(wù)器中除去了狀態(tài)管理的負(fù)擔(dān)。
另一種可能性是調(diào)用 EJB 組件,就好象它是 CORBA(公共對(duì)象請(qǐng)求代理)組件。在被集成的一個(gè)或多個(gè)應(yīng)用程序?yàn)?CORBA 組件的 EAI 情形中,這是特別有用的選項(xiàng)。
豐富的 GUI 客戶(hù)機(jī)
當(dāng)構(gòu)建豐富的用戶(hù)界面來(lái)訪問(wèn) J2EE 服務(wù)器端的功能時(shí),您有幾種選擇:applet、獨(dú)立應(yīng)用程序、Java Web Start 和本機(jī) GUI。
applet 是作為 HTML 頁(yè)面的一部分裝入的,從而提供了豐富的動(dòng)態(tài)用戶(hù)界面,人們一直都期望可以從 Web 上看到這種用戶(hù)界面。(在顯示文本方面,HTML 表現(xiàn)極佳,而在制作用戶(hù)界面方面,它卻不行)。applet 是一項(xiàng)功能強(qiáng)大的技術(shù),因?yàn)樗鼈兣c瀏覽器無(wú)關(guān),而且提供了豐富的 GUI 界面,同時(shí),由 applet 沙箱來(lái)防止在未經(jīng)許可的情況下訪問(wèn)本地資源。對(duì)于更新客戶(hù)機(jī)接口問(wèn)題,applet 還提供了引人注目的解決方案:只需在服務(wù)器上安裝最新的 applet 類(lèi)和支持庫(kù),在每次訪問(wèn) applet 時(shí),客戶(hù)機(jī)會(huì)自動(dòng)下載新文件。這種靈活性的代價(jià)是,每次訪問(wèn) applet 時(shí),必須將 applet 類(lèi)和所支持的庫(kù)下載到客戶(hù)機(jī)。
獨(dú)立應(yīng)用程序被直接安裝在最終用戶(hù)的機(jī)器上。這些應(yīng)用程序與瀏覽器無(wú)關(guān),它們被存儲(chǔ)在本地,而不需要從遠(yuǎn)程站點(diǎn)下載。結(jié)果,啟動(dòng)時(shí)間和響應(yīng)時(shí)間大大縮短。獨(dú)立應(yīng)用程序沒(méi)有 applet 的安全限制,所以可以較方便地訪問(wèn)本地客戶(hù)機(jī)機(jī)器以及任何可以訪問(wèn)的遠(yuǎn)程服務(wù)器。不利的一面是,獨(dú)立應(yīng)用程序極難維護(hù)和更新。每臺(tái)機(jī)器在本地都有一個(gè)副本,所以不可能自動(dòng)更新網(wǎng)絡(luò)上所有的應(yīng)用程序。
Java Web Start實(shí)際上是 applet 和獨(dú)立應(yīng)用程序的混合物,它是一項(xiàng)較新的技術(shù),它有許多較突出的優(yōu)點(diǎn)(關(guān)于更多這方面的信息,請(qǐng)參閱 參考資料)。象 applet 一樣,可以從 Web 瀏覽器調(diào)用 Java Web Start,它也可以與 servlet 交互。與 applet 不同的是,Java Web Start 應(yīng)用程序?qū)⑽募彺嬖诒镜赜脖P(pán),只有當(dāng)需要時(shí)才下載額外的文件。可以從本地資源安裝或通過(guò) Web 遠(yuǎn)程安裝 Java Web Start 應(yīng)用程序。此外,啟動(dòng)的 GUI 是功能齊全的 Swing 客戶(hù)機(jī)。可以在不妨礙應(yīng)用程序的情況下關(guān)閉瀏覽器。其結(jié)果是結(jié)合了 applet 和非 applet 兩者的優(yōu)點(diǎn)。然而,Java Web Start 并不是十全十美。它需要將所有資源都包含在本地 JAR 文件中(而不是松散的文件中);它不允許直接訪問(wèn)資源(資源是通過(guò)抽象的資源管理機(jī)制來(lái)訪問(wèn)的);它不支持本機(jī)應(yīng)用程序的部署。
以下解決方案可應(yīng)用于這三個(gè)豐富 GUI 組件類(lèi)型中的任何一個(gè):
- 如果客戶(hù)機(jī)和服務(wù)器分別位于防火墻的兩側(cè),則您會(huì)希望客戶(hù)機(jī)通過(guò) HTTP 與 servlet 通信。使用助手類(lèi),servlet 層可以進(jìn)行簡(jiǎn)單的業(yè)務(wù)處理(解析 XML 文檔、通過(guò) JDBC 訪問(wèn)數(shù)據(jù)源、用 JavaMail 或 JMS 來(lái)處理簡(jiǎn)單的消息或者甚至用 JTS/JTA 協(xié)調(diào)簡(jiǎn)單的事務(wù))。對(duì)于較復(fù)雜的需求或者需要較頻繁地請(qǐng)求企業(yè)資源,業(yè)務(wù)處理應(yīng)該用會(huì)話 bean。
- 如果客戶(hù)機(jī)和服務(wù)器都位于同一防火墻之后,則純粹使用 RMI 調(diào)用來(lái)直接與應(yīng)用程序服務(wù)器通信,這樣可以提高性能和方便編程。在這種情形,使用 servlet 只能帶來(lái)額外的開(kāi)銷(xiāo),以及造成體系結(jié)構(gòu)不必要的復(fù)雜性。在使用 applet 或 Java Web Start 的情況下,帶有 applet 或 Java Web Start 應(yīng)用程序鏈接的 HTML 文檔可能最初使用 servlet,但在后來(lái),為了處理客戶(hù)機(jī)請(qǐng)求,客戶(hù)機(jī)將與一個(gè)或多個(gè)無(wú)狀態(tài)會(huì)話 bean 建立直接的 RMI 連接。
最后,如果客戶(hù)機(jī)使用 非 Java GUI(即本機(jī) GUI),并且客戶(hù)機(jī)需要管理復(fù)雜的事務(wù)或一系列的事務(wù),則您會(huì)希望考慮選擇使用這種方法:調(diào)用 EJB 組件,就好象它是 CORBA 組件。
Web 應(yīng)用程序
在標(biāo)準(zhǔn)的基于 Web 的應(yīng)用程序(譬如 Web 瀏覽器)情形下,您會(huì)采用支持 HTTP 的客戶(hù)機(jī),它需要訪問(wèn)一個(gè)或多個(gè)后端業(yè)務(wù)服務(wù)。在這種情形下,不需要考慮客戶(hù)機(jī)位于防火墻的哪一側(cè),因?yàn)楸仨氁褂?servlet。顯而易見(jiàn),HTTP 的需求會(huì)利用 Web 層。實(shí)質(zhì)上將根據(jù)對(duì) EJB 容器服務(wù)的相對(duì)需求來(lái)決定是否使用 EJB 組件。
多種客戶(hù)機(jī)類(lèi)型
最后一種情形是需要多種客戶(hù)機(jī)類(lèi)型。也許外部客戶(hù)需要使用基于 Web 瀏覽器的客戶(hù)機(jī),而內(nèi)部員工需要使用標(biāo)準(zhǔn)的桌面、豐富的 GUI。在提供高性能和可靠性的需求與重用需求之間,如何平衡?
- 如果不需要管理復(fù)雜的事務(wù),或者不需要訪問(wèn)多個(gè)企業(yè)資源,則可以簡(jiǎn)單地使用與一系列助手類(lèi)進(jìn)行相互操作的 servlet 層來(lái)進(jìn)行業(yè)務(wù)處理。外部瀏覽器客戶(hù)機(jī)將通過(guò)這個(gè) Web 層與系統(tǒng)進(jìn)行相互操作。然后,重用助手 bean 來(lái)直接為內(nèi)部應(yīng)用程序的請(qǐng)求提供服務(wù),或者內(nèi)部應(yīng)用程序通過(guò) servlet 層進(jìn)行通信。雖然這樣能解決問(wèn)題,但它不是最干凈、最有效或可伸縮性最好的解決方案。
- 較常用的解決方案是將業(yè)務(wù)邏輯放入無(wú)狀態(tài)會(huì)話 bean 中,讓外部應(yīng)用程序通過(guò) servlet 層與應(yīng)用程序服務(wù)器通信,讓內(nèi)部應(yīng)用程序直接與 bean 通信。這種做法使表示與業(yè)務(wù)邏輯分離得最徹底,使內(nèi)部應(yīng)用程序直接地、自由地訪問(wèn)業(yè)務(wù)邏輯,從而在達(dá)到同一目的的情況下,這種做法采用的抽象最少。
結(jié)束語(yǔ)
在 J2EE 探險(xiǎn)者系列的第 1 部分中,我們研究了使用 Java servlet 和無(wú)狀態(tài)會(huì)話 bean 來(lái)完成客戶(hù)機(jī)的請(qǐng)求時(shí),它們之間相對(duì)的長(zhǎng)處和短處。這里所討論的各種情形并沒(méi)有涵蓋所有情況,但這些情形代表了無(wú)狀態(tài)通信環(huán)境中 servlet 和會(huì)話 EJB 最常用的一些情況。
下個(gè)月,我們將從正反兩面權(quán)衡在 Web 層(使用 servlet 和 HTTPSessionAPI
)和業(yè)務(wù)層(使用有狀態(tài)會(huì)話 bean)中管理狀態(tài)。到那時(shí),祝您“探路”愉快!
參考資料
關(guān)于作者
|
|
|
Kyle Gabhart 是 LearningPatterns 的高級(jí)顧問(wèn),LearningPatterns 是一家為全世界各地客戶(hù)提供世界級(jí)咨詢(xún)和培訓(xùn)的動(dòng)態(tài)知識(shí)公司。由于他的激情和對(duì)前沿技術(shù)的動(dòng)態(tài)分析和演示,使得 Kyle 成為一位深受大家歡迎的演講者。有關(guān)他最近以及即將舉行的演講或關(guān)于該行業(yè)的出版物,請(qǐng)?jiān)L問(wèn) Gabhart.com。可以通過(guò) kyle@gabhart.com與他聯(lián)系。
|