Java 應用程序可以在服務器上運行,但是不管是在客戶機-服務器環境下,還是在基于 Web 的環境下,JDK 中都沒有提供讓 Java 應用程序專用于服務器機器的接口或包。認識到 Java 在 Web 環境下作為一種服務器語言的潛力,Sun Microsystems 編寫了 Java Servlet 規范。servlet 在許多方面與 applet 相似,它是專門為在 Web 服務器機器上運行而設計的 Java 程序:
“servlet 是由容器管理的 Web 組件,可產生動態內容。servlet 是一種小型的、與平臺無關的 Java 類,被編譯成體系結構中立的字節代碼,這種代碼可以動態地加載到一個 web 服務器上,并由此 web 服務器運行。servlet 通過一種由 servlet 容器實現的請求-響應模型與 Web 客戶機進行交互。這種請求-響應模型建立在超文本傳輸協議 (HTTP) 行為的基礎之上。”(見 JavaSoft 的“Java Servlet API Specification”)
在一臺 Web 服務器控制下,在多臺服務器上運行若干小型用戶程序,這種想法并不新鮮 — 一段時間以來,公共網關接口 (CGI) 程序(常被稱為 CGI 腳本)一直起著這種作用,并推動了 Web 的普及。但 Java servlet 可以以更高的效率和可移植性來實現這一目的,因而可望最終會取代 CGI 程序。為 servlet 提供運行時環境的軟件(通常被稱為 servlet 引擎)可以添加到現有的、本身并不支持 Java 可執行程序的 Web 服務器上。
Java servlet 的出現,為應用程序員使用 Java 來創建 Web 應用程序開辟了新的途徑。但是,僅有 servlet 還不能為真正的企業計算提供完整的模型。CGI 應用程序本身往往不是完整的應用程序,在處理接收自 Web 瀏覽器上用戶的信息請求時,CGI 只是整個處理過程中的一個中間步驟。例如,CGI 應用程序的一種常見用途是訪問數據庫。將它用于這種任務時,CGI 程序提供一種方法,將用戶的數據請求連接到能滿足這種請求的企業數據庫。CGI 程序常常充當一種中間軟件,從 Web 瀏覽器接收請求,決定必須調用哪些計算資源來滿足這些請求,并向瀏覽器發回響應。Java servlet 與 CGI 程序一樣,最適合充當連接前端 Web 請求與后端數據資源的中間層組件。
三層體系結構 Web 編程向服務器端 Java 應用程序的演化,也帶來了體系結構的演化,使它脫離了常規的客戶機-服務器兩層模型,而向一種三層方法發展。兩層模型當時曾經具有創新意義,因為它將一些計算任務從主處理器上卸載到靈巧的客戶機。常規的基于 LAN 的數據庫應用程序就是一個例子,其中數據庫管理器服務器軟件駐留在一個專用的服務器機器上,而用戶則通過他們的工作站上的客戶機代碼來訪問數據庫。隨著客戶機-服務器模型成長到能付諸使用,就出現了對服務器可伸縮性和對客戶機代碼大小和復雜性的關注。于是提出了一種三層的體系結構,以避免在兩層模型中已察覺到的弱點,使 Web 能成為一個計算平臺:
“許多人...斷言,傳統的客戶機/服務器兩層體系結構不會有好的可伸縮性,因為用戶連接和數據訪問的數量無法預測,而且在一些系統管理上也存在問題。為處理兩層體系結構的限制,許多開發集體都在轉向三層體系結構。這種體系結構大致可以定義為:客戶機層上的表示層、中間的服務器和后端的某種數據庫。這種設想的目的就是緩和客戶機或數據庫服務器上的代碼膨脹,集中管理業務邏輯,更靈活地使用數據庫,而不僅是使用所存儲的過程和觸發器。”(見 Kim 的“Looking for a 3-Tier App Builder?”)
一個三層結構模型通常被想像成有一個 Web 瀏覽器作為客戶層。Web 瀏覽器由于有可能成為一種真正的通用客戶機,使它從觀念上取代了兩層結構的“胖客戶機”。如果瀏覽器作為 Web 應用程序體系結構的標準瘦客戶機獲得認可,那么以前駐留在兩層模型的胖客戶機中的功能會怎么樣呢?現在,應用程序專用的功能并不移植回服務器(例如數據庫管理器),而是有意將它駐留在一個新的中間層上。中間層支持應用程序服務器軟件,這種軟件是中間件的一種形式,它處于第一層上瘦客戶機的最小功能和第三層上服務器端業務系統的豐富功能之間。由于三層體系結構與 Web 處理模型有密切關系,所以中間層應用程序服務器常被視為 Web 服務器的一種功能擴展。現有的 Web 應用程序利用 CGI 程序,將來自 Web 瀏覽器的用戶請求傳送到不基于 Web 的業務系統,并向瀏覽器返回響應,就是三層模型的一種實現。這些應用程序逐漸向 servlet 技術的轉移說明三層模型正在增強。
“事務的概念是一個重要的編程范例,其目的在于簡化既要求可靠性又要求可用性的應用程序結構,特別是那些需要同時訪問共享數據的應用程序。事務的概念最早是用在商務運作的應用程序中,其中它被用于保護集中式數據庫中的數據。后來,事務的概念已擴展到分布式計算的更廣泛的環境中。今天,事務是構建可靠的分布式應用程序的關鍵,這一點已得到廣泛承認。”(見對象管理組的“Transaction Service Specification”)
OMG 的對象事務服務 (OTS) Sun Microsystems 的 Transaction Service (JTS) Sun Microsystems 的 Java Transaction API (JTA) 開放組 (X/Open) 的 XA 接口 這種與語言無關的對象事務服務,為一個強健的分布式事務服務提供了基本概念、定義和功能。
Java Transaction Service 是 OTS 的 Java 映射,在 org.omg.CosTransactions 和 org.omg.CosTSPortability 這兩個包中定義。JTS 對事務分界和事務環境的傳播之類的服務提供支持。JTS 功能由應用程序通過 Java Transaction API 訪問。
Java Transaction API 指定事務管理器與分布式事務中涉及的其他系統組件之間的各種高級接口,這些系統組件有應用程序、應用程序服務器和資源管理器等。JTA 功能允許事務由應用程序本身、由應用程序服務器或由一個外部事務管理器來管理。JTA 接口包含在 javax.transaction 和 javax.transaction.xa 這兩個包中。
XA 接口定義了資源管理器和分布式事務環境中外部事務管理器之間的約定。外部事務管理器可以跨多個資源協調事務。XA 的 Java 映射包含在 Java Transaction API 中。
要了解更多有關 Java 技術和 EJB 體系結構的內容,請訪問 Sun 的網站。 關于從 applet 和應用程序的角度看 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”中可以發現一些補充的指導原則,它們使您能開發出性能優良的 Bean,這些 Bean 能夠在大多數環境中表現良好,包括流行的各種 IDE 和各種瀏覽器。 閱讀 Patricia Seybold Group 的 Anne Thomas 所寫的“Java 2 Platform, Enterprise Edition: Ensuring Consistency, Portability, and Interoperability” 中對 J2EE 的詳細說明。 查閱“JNDI: Java Naming and Directory Interface” 中的 JNDI 體系結構和接口的概述,以及各種情況和示例。 了解Java 2 Platform, Enterprise Edition 中包含的以下 Java 技術: 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) 技術 JDBC 數據訪問 API 要了解常見問題、與 LDAP 相關的 RFC 以及更多信息,請訪問 Mark Wahl 的 LDAP 網站。 要了解如何將 linux 配置為 NIS(YP) 或 NIS+ 客戶機及如何安裝成 NIS 服務器,請查閱 Linux NIS(YP)/NYS/NIS+ HOWTO。 下載 Java IDL 的命名服務 COS naming。 詳細了解 Java Remote Method Invocation (RMI),包括規范、示例和常見問題。 了解 Novell 提供的大量的產品和解決方案。 訪問 Object Management Group (OMG) 的網站。 查閱開放組的 XA interface 規范。
作者簡介 Ken Nordby 是位于 Research Triangle Park,North Carolina 的 IBM 軟件開發實驗室的軟件工程師。作為 SWG ProdUCt Affinity Services 工作組的成員,Ken 和他的 IBM 同事從事 IBM WebSphere Application Server(Enterprise JavaBeans 的 IBM 實現)的開發及咨詢工作。可以通過 nordby@us.ibm.com 與 Ken 聯系。進入討論組討論。