Java 應(yīng)用程序可以在服務(wù)器上運行,但是不管是在客戶機(jī)-服務(wù)器環(huán)境下,還是在基于 Web 的環(huán)境下,JDK 中都沒有提供讓 Java 應(yīng)用程序?qū)S糜诜?wù)器機(jī)器的接口或包。熟悉到 Java 在 Web 環(huán)境下作為一種服務(wù)器語言的潛力,Sun Microsystems 編寫了 Java Servlet 規(guī)范。servlet 在許多方面與 applet 相似,它是專門為在 Web 服務(wù)器機(jī)器上運行而設(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 客戶機(jī)進(jìn)行交互。這種請求-響應(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 程序經(jīng)常充當(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ī)的客戶機(jī)-服務(wù)器兩層模型,而向一種三層方法發(fā)展。兩層模型當(dāng)時曾經(jīng)具有創(chuàng)新意義,因為它將一些計算任務(wù)從主處理器上卸載到靈巧的客戶機(jī)。常規(guī)的基于 LAN 的數(shù)據(jù)庫應(yīng)用程序就是一個例子,其中數(shù)據(jù)庫治理器服務(wù)器軟件駐留在一個專用的服務(wù)器機(jī)器上,而用戶則通過他們的工作站上的客戶機(jī)代碼來訪問數(shù)據(jù)庫。隨著客戶機(jī)-服務(wù)器模型成長到能付諸使用,就出現(xiàn)了對服務(wù)器可伸縮性和對客戶機(jī)代碼大小和復(fù)雜性的關(guān)注。于是提出了一種三層的體系結(jié)構(gòu),以避免在兩層模型中已察覺到的弱點,使 Web 能成為一個計算平臺:
“許多人...斷言,傳統(tǒng)的客戶機(jī)/服務(wù)器兩層體系結(jié)構(gòu)不會有好的可伸縮性,因為用戶連接和數(shù)據(jù)訪問的數(shù)量無法猜測,而且在一些系統(tǒng)治理上也存在問題。為處理兩層體系結(jié)構(gòu)的限制,許多開發(fā)集體都在轉(zhuǎn)向三層體系結(jié)構(gòu)。這種體系結(jié)構(gòu)大致可以定義為:客戶機(jī)層上的表示層、中間的服務(wù)器和后端的某種數(shù)據(jù)庫。這種設(shè)想的目的就是緩和客戶機(jī)或數(shù)據(jù)庫服務(wù)器上的代碼膨脹,集中治理業(yè)務(wù)邏輯,更靈活地使用數(shù)據(jù)庫,而不僅是使用所存儲的過程和觸發(fā)器。”(見 Kim 的“Looking for a 3-Tier App Builder?”)
一個三層結(jié)構(gòu)模型通常被想像成有一個 Web 瀏覽器作為客戶層。Web 瀏覽器由于有可能成為一種真正的通用客戶機(jī),使它從觀念上取代了兩層結(jié)構(gòu)的“胖客戶機(jī)”。假如瀏覽器作為 Web 應(yīng)用程序體系結(jié)構(gòu)的標(biāo)準(zhǔn)瘦客戶機(jī)獲得認(rèn)可,那么以前駐留在兩層模型的胖客戶機(jī)中的功能會怎么樣呢?現(xiàn)在,應(yīng)用程序?qū)S玫墓δ懿⒉灰浦不胤?wù)器(例如數(shù)據(jù)庫治理器),而是有意將它駐留在一個新的中間層上。中間層支持應(yīng)用程序服務(wù)器軟件,這種軟件是中間件的一種形式,它處于第一層上瘦客戶機(jī)的最小功能和第三層上服務(wù)器端業(yè)務(wù)系統(tǒng)的豐富功能之間。由于三層體系結(jié)構(gòu)與 Web 處理模型有密切關(guān)系,所以中間層應(yīng)用程序服務(wù)器常被視為 Web 服務(wù)器的一種功能擴(kuò)展。現(xiàn)有的 Web 應(yīng)用程序利用 CGI 程序,將來自 Web 瀏覽器的用戶請求傳送到不基于 Web 的業(yè)務(wù)系統(tǒng),并向瀏覽器返回響應(yīng),就是三層模型的一種實現(xiàn)。這些應(yīng)用程序逐漸向 servlet 技術(shù)的轉(zhuǎn)移說明三層模型正在增強(qiáng)。
“事務(wù)的概念是一個重要的編程范例,其目的在于簡化既要求可靠性又要求可用性的應(yīng)用程序結(jié)構(gòu),非凡是那些需要同時訪問共享數(shù)據(jù)的應(yīng)用程序。事務(wù)的概念最早是用在商務(wù)運作的應(yīng)用程序中,其中它被用于保護(hù)集中式數(shù)據(jù)庫中的數(shù)據(jù)。后來,事務(wù)的概念已擴(kuò)展到分布式計算的更廣泛的環(huán)境中。今天,事務(wù)是構(gòu)建可靠的分布式應(yīng)用程序的要害,這一點已得到廣泛承認(rèn)。”(見對象治理組的“Transaction Service Specification”)
OMG 的對象事務(wù)服務(wù) (OTS) Sun Microsystems 的 Transaction Service (JTS) Sun Microsystems 的 Java Transaction API (JTA) 開放組 (X/Open) 的 XA 接口 這種與語言無關(guān)的對象事務(wù)服務(wù),為一個強(qiáng)健的分布式事務(wù)服務(wù)提供了基本概念、定義和功能。
Java Transaction Service 是 OTS 的 Java 映射,在 org.omg.CosTransactions 和 org.omg.CosTSPortability 這兩個包中定義。JTS 對事務(wù)分界和事務(wù)環(huán)境的傳播之類的服務(wù)提供支持。JTS 功能由應(yīng)用程序通過 Java Transaction API 訪問。
Java Transaction API 指定事務(wù)治理器與分布式事務(wù)中涉及的其他系統(tǒng)組件之間的各種高級接口,這些系統(tǒng)組件有應(yīng)用程序、應(yīng)用程序服務(wù)器和資源治理器等。JTA 功能答應(yīng)事務(wù)由應(yīng)用程序本身、由應(yīng)用程序服務(wù)器或由一個外部事務(wù)治理器來治理。JTA 接口包含在 javax.transaction 和 javax.transaction.xa 這兩個包中。
XA 接口定義了資源治理器和分布式事務(wù)環(huán)境中外部事務(wù)治理器之間的約定。外部事務(wù)治理器可以跨多個資源協(xié)調(diào)事務(wù)。XA 的 Java 映射包含在 Java Transaction API 中。
要了解更多有關(guān) Java 技術(shù)和 EJB 體系結(jié)構(gòu)的內(nèi)容,請訪問 Sun 的網(wǎng)站。 關(guān)于從 applet 和應(yīng)用程序的角度看 Java 編程,請閱讀 David Flanagan 所著的 Java in a Nutshell。 下載一份 Java Servlet API Specification 的副本。 下載 Java Developer´s Journal第 3 卷第 1 期中 Tom Kim 所寫的“Looking for a 3-Tier App Builder?”(PDF)。 參加 JavaSoft 的“Using the Beans Development Kit 1.0”課程。 從“JavaBeans Guidelines”中可以發(fā)現(xiàn)一些補(bǔ)充的指導(dǎo)原則,它們使您能開發(fā)出性能優(yōu)良的 Bean,這些 Bean 能夠在大多數(shù)環(huán)境中表現(xiàn)良好,包括流行的各種 IDE 和各種瀏覽器。 閱讀 Patricia Seybold Group 的 Anne Thomas 所寫的“Java 2 Platform, Enterprise Edition: Ensuring Consistency, Portability, and Interoperability” 中對 J2EE 的具體說明。 查閱“JNDI: Java Naming and Directory Interface” 中的 JNDI 體系結(jié)構(gòu)和接口的概述,以及各種情況和示例。 了解Java 2 Platform, Enterprise Edition 中包含的以下 Java 技術(shù): Java IDL Java Message Service (JMS) API Java Naming and Directory Interface (JNDI) Java Remote Method Invocation (RMI) Java Transaction API (JTA) Java Transaction Service (JTS) JavaServer Pages (JSP) 技術(shù) JDBC 數(shù)據(jù)訪問 API 要了解常見問題、與 LDAP 相關(guān)的 RFC 以及更多信息,請訪問 Mark Wahl 的 LDAP 網(wǎng)站。 要了解如何將 linux 配置為 NIS(YP) 或 NIS+ 客戶機(jī)及如何安裝成 NIS 服務(wù)器,請查閱 Linux NIS(YP)/NYS/NIS+ HOWTO。 下載 Java IDL 的命名服務(wù) COS naming。 具體了解 Java Remote Method Invocation (RMI),包括規(guī)范、示例和常見問題。 了解 Novell 提供的大量的產(chǎn)品和解決方案。 訪問 Object Management Group (OMG) 的網(wǎng)站。 查閱開放組的 XA interface 規(guī)范。
作者簡介 Ken Nordby 是位于 Research Triangle Park,North Carolina 的 IBM 軟件開發(fā)實驗室的軟件工程師。作為 SWG ProdUCt Affinity Services 工作組的成員,Ken 和他的 IBM 同事從事 IBM WebSphere Application Server(Enterprise JavaBeans 的 IBM 實現(xiàn))的開發(fā)及咨詢工作。可以通過 nordby@us.ibm.com 與 Ken 聯(lián)系。