1. 程式人生 > >基於中介軟體的開發---J2EE

基於中介軟體的開發---J2EE

   J2EE 是針對 Web Service、業務物件、資料訪問和訊息報傳送的一組規範。這組應用程式設計介面確定了 Web 應用與駐留它們的伺服器之間的通訊方式。J2EE 注重兩件事,一是建立標準,使 Web 應用的部署與伺服器無關;二是使伺服器能控制構件的生命週期和其他資源,以便能夠處理擴充套件、併發、事務處理管理和安全性問題。

    J2EE 規範定義了以下幾種構件:應用客戶端構件、EJB構件、Servlets 和 JSP、Applet 構件。J2EE 採用的是多層分散式應用模型,意味著應用邏輯將根據功能分成幾個部分, 使用者可以在相同或不同的伺服器上安裝不同應用構件組成的J2EE 應用。這些層次可以參 見圖 15-2。

1 表示層 

    J2EE 客戶端可以基於 Web,也可以基於 Java。在 HTML、Javascript、XML 等技術的幫助下,Web 瀏覽器可以支援強大、快速的使用者介面。實際上,如果 HTML 足以捕獲和顯示應用所需的資訊,則 HTML 為首選;如果 HTML 不足以達到此目的,則應該由客戶端執行必要的捕獲和操作。無論是 Applet 還是獨立的 Java 程式,都可提供更豐富的圖形使用者介面。Applet 還可以與中層通訊,從而進一步加強程式控制和系統靈活性。

    分散式企業應用可以同時包括多種客戶端,並且這些客戶端都可以訪問相同的業務邏輯。如圖 15-3 所示:當客戶端是 HTML時,JSP/Servlet 組合將成為能實現業務目標的真正客戶端。當客戶端是 Java 程式或基於 COM 程式時,它可以直接訪問業務邏輯

2 應用服務層

    一般情況下,應用服務層包含表示層請求的表示邏輯和業務邏輯。表示層由顯示 HTML 頁面的JSP 頁面和 Servlets 實現。業務邏輯通過 RMI 物件和 EJB 實現。EJB 依靠容器來實現事務處理、生命週期和狀態管理、資源池、安全等問題,容器是 EJB 執行的環境。

    1.Servlet

    Java Servlets 是指可以擴充套件 Web 伺服器功能的程式。Servlet 從客戶端接受請求,動態生成響應,然後將包含 HTML 或 XML 文件的請求傳送給客戶端。Servlet 類似於 CGI(公共閘道器介面),但 Servlet 使用 Java 類和流,更易於編寫;由於 Servlet 可編譯為 Java 位元組碼,在執行時,Servlet 例程駐留在記憶體中,每一個使用者請求都生成一條新執行緒,故而它們的執行速度也更快。

    2.JSP

    JSP 頁面是基於文字的 Servlet開發方式。JSP 頁面具有 Servlet 的所有優點,如果與 JavaBeans 類結合在一起,可以容易地將內容和顯示邏輯分開。這使得無須瞭解 Java 程式碼就能更新頁面的外觀,更新 Java Beans 類的人也無須深入瞭解 Web 頁面的設計。相對 CGI 而言,由於 CGI 依賴於平臺,消耗資源更多,而且程式不能容易地訪問引數資料等缺點,故而 JSP 頁面和 Servlet 都比CGI 應用廣泛。

    使用者可以使用帶 Java Beans 類的 JSP 頁面定義 Web 模板,以便建立由外觀相似的頁面組成的 Web 站點,而 Java Beans 類負責組織資料。使用者還可以藉助標記和指令碼將內容與應用邏輯捆綁在一起,或是嵌入一些 Java 小應用程式來實現一些簡單的 Web 應用。

    3.EJB

    EJB 構件用於封裝業務邏輯,使開發人員無須再擔心資料訪問、事務處理支援、安全性、快取記憶體和迸發等瑣碎任務的程式設計。在 EJB 規範中,它們由 EJB 容器負責。EJB 包含介面和類。客戶端通過 EJB 的本地介面和遠端介面訪問 EJB 方法。本地介面提供的方法可用於生成、刪除和查詢 EJB,遠端介面則提供業務方法。部署時,容器從這些介面生成類,這些類使客戶端可以訪問、生成、刪除、查詢和呼叫 EJB 上的業務方法。EJB 類為業務方法、生成方法和查詢方法提供實施,如果 Bean 管理自己的儲存,還得提供生成生命週期方法的實施。

    EJB 共有三種類型:EntityBean(實體 Bean)、Session Bean(會話 Bean)和 Message Driven Bean(訊息驅動 Bean),下面分別說明。

    (1)實體 Bean。實體 Bean 表示資料庫中的資料及作用於資料的方法。在關係型資料庫中,表中的每一行就是一個 Bean 的例項。實體 Bean 是具有永續性的事務處理型 EJB,只要資料存在於資料庫中,實體 Bean 就存在。

    用容器管理的永續性訪問關係資料庫的 EJB,不需要為資料庫訪問使用任何 JDBC API,因為容器可以負責完成這項任務。但是,如果使用 Bean 管理的永續性或想訪問關係數

據庫以外的企業資訊系統,就需要提供相應的程式程式碼才能完成。但是如果 EJB 使用 Bean 管理的永續性訪問資料庫,使用者必須藉助於 JDBC API 實施 Bean 生命週期方法,這樣才能載入和儲存資料,並保持執行和持久資料庫儲存之間的一致性。

    (2)會話 Bean。會話 Bean 代表與客戶間的短暫對話。在執行資料庫讀寫時,會話 Bean 可以請求 JDBC 呼叫,也可以使用實體 Bean 執行呼叫,這時會話 Bean 是實體 Bean 的客戶端。會話 Bean 的欄位中包含對話的狀態,如果伺服器或客戶端出現故障,會話 Bean 將消失。

    會話 Bean 可以有狀態,也可以無狀態。有狀態會話 Bean 包含客戶端方的對話狀態,對話狀態是會話 Bean 例項的欄位值加上可以從會話 Bean 欄位閱讀的所有物件。有狀態的會話 Bean 不表示持久資料庫中的資料,但能夠以客戶端的名義訪問和更新資料。

    無狀態會話 Bean 沒有客戶端的任何狀態資訊。它們一般不提供保留任何狀態的伺服器行為。無狀態會話 Bean 需要的系統資源較少。提供通用服務或表示共享資料檢視的業務物件適合作為無狀態的會話 Bean。

    (3)訊息驅動 Bean。EJB2.0 規範中的訊息驅動 Bean 能處理從 JMS 訊息佇列接收到的非同步訊息。JMS 將訊息路由到訊息驅動 Bean,由訊息驅動 Bean 從池中選擇某個例項處理訊息。

    訊息驅動 Bean 在 EJB 容器中管理。由於它們不是由使用者的應用直接呼叫的,因此不能借助EJB 本地介面從應用進行訪問。但是,使用者的應用可以將訊息傳送到 Bean 所監聽的 JMS 佇列中,以此來例項化訊息驅動 Bean。

    4.JMS

    JMS 是支援 Java 程式之間資訊交換的 J2EE 機制。這也是 Java 支援非同步通訊的方法—— 傳送者和接收者無須相互瞭解,因此可以獨立操作。JMS 支援兩種訊息傳播模式:

  • 點到點(point to point)。基於訊息佇列,訊息產生者將訊息傳送到佇列中。訊息消費者可以將自身與佇列連線,以傾聽訊息。當訊息到達佇列時,客戶可以從佇列中取走,並給出響應。訊息只能傳送到一個佇列,只能由一個消費者使用。消費者可以過濾訊息,以便獲得希望獲得的訊息。

  • 出版和訂閱(publish/subscribe)。訊息生產者將訊息傳送到一個話題(topic),註冊到此話題的消費者都能接收到這些訊息。這種情況下,許多消費者都能接收到同樣的訊息。

    5.JNDI

   由於 J2EE 應用的構件可以獨立執行,而且是在不同的裝置上執行,因此客戶端和應用伺服器層程式碼必須以某種方式查詢和參考其他程式碼和資源。客戶端和應用程式碼使用 JNDI(Java Naming and Directory Interface,Java 命名和目錄介面)查詢使用者定義物件(如 EJB)和環境實體(Environment Entities)。在 JDBC2.0 中,資料來源可以繫結到 JNDI 上,並允許應用程式訪問。

    6.事務處理

    J2EE 事務處理模型可以在部署過程中定義組成一個事務處理的方法之間的聯絡,以便事務處理中的所有方法可以作為一個整體存在。如果使用者希望完成這一任務,因為事務處理是一系列步驟,要麼全部執行成功,要麼全部回滾。例如,EJB 中可能有一系列方法,其作用是將資金從一個賬戶轉到另一個賬戶,方法是借記第一個賬戶和貸記第二個賬戶。使用者可能希望將全部操作作為一個整體,這樣,如果借記之後,貸記之前出現故障,借記將滾回。

    事務處理的屬性在應用構件的整合過程中確定。它可以將各種方法組合成應用構件間的事務處理,即使用者可以在 J2EE 應用中方便地重新分配應用構件的事務處理屬性,無須修改程式碼和重新編譯。J2EE 事務處理 API(JTA)和 Java 事務處理服務(JTS)形成 J2EE 中事務處理支援的基礎,而且更適合 EJB 和 JDBC2.0。JTS 是低階事務處理管理 API,主要作用是將 Java 對映到物件管理組(OMG)的物件事務處理服務。JTA 是高階 API,包括兩個部分:

  • 事務處理介面。該介面允許事務處理定界,通過分散式構件由進行全域性事務處理登記來完成工作。這種方法可以令多組操作組成一個事務處理。

  • XA 資源介面。基於能處理分散式事務處理的 X/Open/XA 介面,有時也稱為兩步提交事務處理,需要多種資源之間的協調,如資料庫或序列。分散式事務處理由兩步提交協議協調,可跨越用 XA 相容的 JDBC 驅動程式訪問的多個數據庫,如針對 Oracle/XA 的 BEA WebLogicDriver 等。

    EJB 規範定義了 Bean 管理的事務處理和 Container 管理的事務處理。當 EJB 用 Container 管理的事務處理部署時,應用伺服器將自動協調事務處理。如果 EJB 由 Bean 管理事務處理部署,EJB 引數必須提供事務處理程式碼。

    基於 JMS 或 JDBC API 的應用程式碼可以啟動事務處理,或參與先前啟動的事務處理。一個事務處理聯絡與執行應用的應用伺服器執行緒相關,所有事務處理操作都在參與當前事務處理的執行緒上執行。

    多數情況下,使用者無須擔心用 JTA 編寫明確事務處理的問題,因為此項工作由 JDBC 完成,EJB API 由 Container 處理,並由應用部署說明符配置。這樣,使用者就可以將精力集中在事務處理設計而非實施上。