JAVAEE 的四層模型
JAVAEE使用多層的分布式應用程式模型,應用邏輯按功能劃分為組件,各個應用組件根據他們所在的層分布在不同的機器上。事實上,sun設計 JAVAEE的初衷正是為瞭解決兩層模式(client/server)的弊端,在傳統模式中,用戶端擔當了過多的角色而顯得臃腫,在這種模式中,第一次部署的時候比較容易,但難於升級或改進,可伸展性也不理想,而且經常基於某種專有的協議――通常是某種資料庫協議。它使得重用商務邏輯和介面邏輯非常困難。現在J2EE 的多層企業級應用程式模型將兩層化模型中的不同層面切分成許多層。一個多層化應用能夠為不同的每種服務提供一個獨立的層,以下是 JAVAEE典型的四層結構:
運行在用戶端機器上的客戶層組件
運行在 JAVAEE伺服器上的Web層組件
運行在 JAVAEE伺服器上的商務邏輯層組件
運行在EIS伺服器上的公司資訊系統(Enterprise information system)層軟體
JAVAEE應用程式組件
JAVAEE應用程式是由組件構成的. JAVAEE組件是具有獨立功能的軟體單元,它們通過相關的J2EE 的四層模型
JAVAEE使用多層的分布式應用程式模型,應用邏輯按功能劃分為組件,各個應用組件根據他們所在的層分布在不同的機器上。事實上,sun設計J2EE的初衷正是為瞭解決兩層模式(client/server)的弊端,在傳統模式中,用戶端擔當了過多的角色而顯得臃腫,在這種模式中,第一次部署的時候比較容易,但難於升級或改進,可伸展性也不理想,而且經常基於某種專有的協議――通常是某種資料庫協議。它使得重用商務邏輯和介面邏輯非常困難。現在J2EE 的多層企業級應用程式模型將兩層化模型中的不同層面切分成許多層。一個多層化應用能夠為不同的每種服務提供一個獨立的層,以下是 JAVAEE典型的四層結構:
運行在用戶端機器上的客戶層組件
運行在 JAVAEE伺服器上的Web層組件
運行在 JAVAEE伺服器上的商務邏輯層組件
運行在EIS伺服器上的公司資訊系統(Enterprise information system)層軟體
JAVAEE應用程式組件
JAVAEE應用程式是由組件構成的.JAVAEE組件是具有獨立功能的軟體單元,它們通過相關的類和檔案組裝成J2EE應用程式,並與其他組件互動。JAVAEE說明書中定義了以下的 JAVAEE組件:
應用用戶端程式和applets是客戶層組件.
Java Servlet和JavaServer Pages(JSP)是web層組件.
Enterprise JavaBeans(EJB)是業務層組件.
客戶層組件
JAVAEE應用程式可以是基於web方式的,也可以是基於傳統方式的.
web 層組件 JAVAEE web層組件可以是JSP 頁面或Servlets.按照J2EE規範,靜態HTML頁面和Applets不算是web層組件。
正如下圖所示的客戶層那樣,web層可能包含某些 JavaBean 對象來處理使用者輸入,並把輸入發送給運行在業務層上的enterprise bean 來進行處理。
業務層組件
業務層代碼的邏輯用來滿足銀行,零售,金融等特殊商務領域的需要,由運行在業務層上的enterprise bean 進行處理. 下圖表明了一個enterprise bean 是如何從用戶端程式接收資料,進行處理(如果必要的話), 並發送到EIS 層儲存的,這個過程也可以逆向進行。
有三種企業級的bean: 會話(session) beans, 實體(entity) beans, 和 訊息驅動(message-driven) beans. 會話bean 表示與用戶端程式的臨時互動. 當用戶端程式執行完後, 會話bean 和相關資料就會消失. 相反, 實體bean 表示資料庫的表中一行永久的記錄. 當用戶端程式中止或伺服器關閉時, 就會有潛在的服務保證實體bean 的資料得以儲存.訊息驅動 bean 結合了會話bean 和 JMS的訊息監聽器的特性, 允許一個業務層組件非同步接收JMS 訊息.
公司資訊系統層
公司資訊系統層處理公司資訊系統軟體包括企業基礎建設系統例如企業資源計劃 (ERP), 大型主機交易處理, 資料庫系統,和其它的遺留資訊系統. 例如, JAVAEE 應用組件可能為了資料庫連接需要訪問公司資訊系統
我們就 JAVAEE的各種組件、服務和API,進行更加詳細的闡述,看看在開發不同類型的企業級應用時,根據各自需求和目標的不同,應當如何靈活使用並組合不同的組件和服務。
· Servlet
Servlet是Java平台上的CGI技術。Servlet在伺服器端運行,動態地產生Web頁面。與傳統的CGI和許多其它類似CGI的技術相比,Java Servlet具有更高的效率並更容易使用。對於Servlet,重複的請求不會導致同一程式的多次轉載,它是依靠線程的方式來支援並發訪問的。
· JSP
JSP(Java Server Page)是一種實現普通靜態HTML和動態網頁面輸出混合編碼的技術。從這一點來看,非常類似Microsoft ASP、PHP等技術。藉助形式上的內容和外觀表現的分離,Web頁面製作的任務可以比較方便地劃分給頁面設計人員和程式員,並方便地通過JSP來合成。在運行時態,JSP將會被首先轉換成Servlet,並以Servlet的形態編譯運行,因此它的效率和功能與Servlet相比沒有差別,一樣具有很高的效率。
· EJB
EJB定義了一組可重用的組件:Enterprise Beans。開發人員可以利用這些組件,像搭積木一樣建立分布式應用。在裝配組件時,所有的Enterprise Beans都需要配置到EJB伺服器(一般的Weblogic、WebSphere等J2EE應用伺服器都是EJB伺服器)中。EJB伺服器作為容器和低層平台的橋樑管理著EJB容器,並向該容器提供訪問系統服務的能力。所有的EJB執行個體都運行在EJB容器中。EJB容器提供了系統級的服務,控制了EJB的生命週期。EJB容器為它的開發人員代管了諸如安全性、遠端連線、生命週期管理及交易管理等技術環節,簡化了商業邏輯的開發。EJB中定義了三種Enterprise Beans:
◆ Session Beans
◆ Entity Beans
◆ Message-driven Beans
· JDBC
JDBC(Java Database Connectivity,Java資料庫連接)API是一個標準SQL(Structured Query Language,結構化查詢語言 (SQL))資料庫提供者,它使資料庫開發人員能夠用標準Java API編寫資料庫應用程式。JDBC API主要用來串連資料庫和直接調用SQL命令執行各種SQL語句。利用JDBC API可以執行一般的SQL語句、動態SQL語句及帶IN和OUT參數的預存程序。Java中的JDBC相當與Microsoft平台中的ODBC(Open Database Connectivity)。
· JMS
JMS(Java Message Service,JavaMessage Service)是一組Java應用介面,它提供建立、發送、接收、讀取訊息的服務。JMS API定義了一組公用的應用程式介面和相應文法,使得Java應用能夠和各種訊息中介軟體進行通訊,這些訊息中介軟體包括IBM MQ-Series、Microsoft MSMQ及純Java的SonicMQ。通過使用JMS API,開發人員無需掌握不同訊息產品的使用方法,也可以使用統一的JMS API來操縱各種訊息中介軟體。通過使用JMS,能夠最大限度地提升訊息應用的可移植性。 JMS既支援點對點的訊息通訊,也支援發布/訂閱式的訊息通訊。
· JNDI
由於 JAVAEE應用程式組件一般分布在不同的機器上,所以需要一種機制以便於組件客戶使用者尋找和引用組件及資源。在 JAVAEE體系中,使用JNDI(Java Naming and Directory Interface)定位各種對象,這些對象包括EJB、資料庫驅動、JDBC資料來源及訊息串連等。JNDI API為應用程式提供了一個統一的介面來完成標準的目錄操作,如通過對象屬性來尋找和定位該對象。由於JNDI是獨立於目錄協議的,應用還可以使用JNDI訪問各種特定的目錄服務,如LDAP、NDS和DNS等。
· JTA
JTA(Java Transaction API)提供了JAVAEE中處理事務的標準介面,它支援事務的開始、復原和提交。同時在一般的JAVAEE平台上,總提供一個JTS(Java Transaction Service)作為標準的交易處理服務,開發人員可以使用JTA來使用JTS。
· JCA
JCA( JAVAEE Connector Architecture)是JAVAEE體系架構的一部分,為開發人員提供了一套串連各種公司資訊系統(EIS,包括ERP、SCM、CRM等)的體系架構,對於EIS開發商而言,它們只需要開發一套基於JCA的EIS串連適配器,開發人員就能夠在任何的JAVAEE應用伺服器中串連並使用它。基於JCA的串連適配器的實現,需要涉及J2EE中的交易管理、安全管理及串連管理等服務元件。
· JMX
JMX(Java Management Extensions)的前身是JMAPI。JMX致力於解決分布式系統管理的問題。JMX是一種應用編程介面、可擴充項物件和方法的集合體,可以跨越各種異構作業系統平台、系統體繫結構和網路傳輸協議,開發無縫整合的面向系統、網路和服務的管理應用。JMX是一個完整的網路管理應用程式開發環境,它同時提供了廠商需要收集的完整的特性清單、可產生資源清單表格、圖形化的使用者介面;訪問SNMP的網路API;主機間遠端程序呼叫;資料庫存取方法等。
· JAAS
JAAS(Java Authentication and Authorization Service)實現了一個Java版本的標準Pluggable Authentication Module(PAM)的架構。JAAS可用來進行使用者身份的評鑑,從而能夠可靠並安全地確定誰在執行Java代碼。同時JAAS還能通過對使用者進行授權,實現基於使用者的存取控制。
· JACC
JACC(Java Authorization Service Provider Contract for Containers)在JAVAEE應用伺服器和特定的授權證明伺服器之間定義了一個串連的協約,以便將各種授權證明伺服器插入到JAVAEE產品中去。
· JAX-RPC
通過使用JAX-RPC(Java API for XML-based RPC),已有的Java類或Java應用都能夠被重新封裝,並以Web Services的形式發布。JAX-RPC提供了將RPC參數(in/out)編碼和解碼的API,使開發人員可以方便地使用SOAP訊息來完成RPC調用。同樣,對於那些使用EJB(Enterprise JavaBeans)的商業應用而言,同樣可以使用JAX-RPC來封裝成Web服務,而這個Web Servoce的WSDL介面是與原先的EJB的方法是對應一致的。JAX-RPC為使用者封裝了Web服務的部署和實現,對Web服務的開發人員而言,SOAP/WSDL變得透明,這有利於加速Web服務的開發週期。
· JAXR
JAXR(Java API for XML Registries)提供了與多種類型註冊服務進行互動的API。JAXR運行用戶端訪問與JAXR規範相相容的Web Servcices,這裡的Web Services即為註冊服務。一般來說,註冊服務總是以Web Services的形式啟動並執行。JAXR支援三種註冊服務類型:JAXR Pluggable Provider、Registry-specific JAXR Provider、JAXR Bridge Provider(支援UDDI Registry和ebXML Registry/Repository等)。
· SAAJ
SAAJ(SOAP with Attachemnts API for Java)是JAX-RPC的一個增強,為進行低層次的SOAP訊息操縱提供了支援。
J2EE 的結構
這種基於組件,具有平台無關性的 JAVAEE 結構使得 JAVAEE 程式的編寫十分簡單,因為商務邏輯被封裝成可複用的組件,並且 JAVAEE 伺服器以容器的形式為所有的組件類型提供後台服務. 因為你不用自己開發這種服務, 所以你可以集中精力解決手頭的業務問題.
容器和服務
容器設定定製了 JAVAEE伺服器所提供得內在支援,包括安全,交易管理,JNDI(Java Naming and Directory Interface)定址,遠端連線等服務,以下列出最重要的幾種服務:
JAVAEE安全(Security)模型可以讓你配置 web 組件或enterprise bean ,這樣只有被授權的使用者才能訪問系統資源. 每一客戶屬於一個特別的角色,而每個角色只允許啟用特定的方法。你應在enterprise bean的布置描述中聲明角色和可被啟用的方法。由於這種聲明性的方法,你不必編寫加強安全性的規則。
JAVAEE 交易管理(Transaction Management)模型讓你指定組成一個事務中所有方法間的關係,這樣一個事務中的所有方法被當成一個單一的單元. 當用戶端啟用一個enterprise bean中的方法,容器介入一管理事務。因有容器管理事務,在enterprise bean中不必對事務的邊界進行編碼。要求控制分散式交易的代碼會非常複雜。你只需在布置描述檔案中聲明enterprise bean的事務屬性,而不用編寫並調試複雜的代碼。容器將讀此檔案並為你處理此enterprise bean的事務。
JNDI 定址(JNDI Lookup)服務向企業內的多重名字和目錄服務提供了一個統一的介面,這樣應用程式組件可以訪問名字和目錄服務.
JAVAEE遠端連線(Remote Client Connectivity)模型管理用戶端和enterprise bean間的低層互動. 當一個enterprise bean建立後, 一個用戶端可以調用它的方法就象它和用戶端位於同一虛擬機器上一樣.
生存周期管理(Life Cycle Management)模型管理enterprise bean的建立和移除,一個enterprise bean在其生存周期中將會曆經幾種狀態。容器建立enterprise bean,並在可用執行個體池與活動狀態中移動他,而最終將其從容器中移除。即使可以調用enterprisebean的create及remove方法,容器也將會在後台執行這些任務。
企業級應用樣本
下面我們通過假設一個公司專屬應用程式的 JAVAEE實現,來瞭解各種組件和服務的應用。假設應用對象是電腦產品的生產商/零售商的銷售系統,這個銷售系統能夠通過自己的網站發布產品資訊,同時也能將產品目錄傳送給電腦產品交易市場。銷售系統能夠線上接受訂單(來自自己的Web網站或者來自電腦產品交易市場),並隨後轉入內部企業管理系統進行相關的後續處理。
參見圖1,這個公司專屬應用程式可以這種方式架構。該公司專屬應用程式的核心是產品目錄管理和產品定購管理這兩個商務邏輯,使用EJB加以實現,並部署在EJB容器中。由於產品目錄和定購資訊都需要持久化,因此使用JDBC串連資料庫,並使用JTA來完成資料庫存取事務。
圖1 JAVAEE應用樣本
然後使用JSP/Servlet來實現應用的Web表現:線上產品目錄瀏覽和線上定購。為了將產品目錄發送給特定的交易市場,使用JMS實現非同步基於訊息的產品目錄傳輸。為了使得更多的其它外部交易市場能夠整合產品目錄和定購業務,需要使用Web Services技術封裝商業邏輯的實現。由於產品定購管理需要由公司內部僱員進行處理,因此需要整合公司內部的使用者系統和存取控制服務以方便僱員的使用,使用JACC整合內部的存取控制服務,使用JNDI整合內部的使用者目錄,並使用JAAS進行存取控制。由於產品訂購事務會觸發後續的企業ERP系統的相關操作(包括倉儲、財務、生產等),需要使用JCA串連企業ERP。
最後為了將這個應用納入到企業整體的系統管理體系中去,使用Application Client架構了一個管理用戶端(與其它公司專屬應用程式管理應用部署在一台機器上),並通過JMX管理這個公司專屬應用程式。
(這些jca,jdbc,jta,jni,jacc,jaas等等api都是用在業務層中的,就是ejb組件的那層,在編寫ejb時,依據這些api所要求的規範編寫即可,在執行時由ejb容器進行宏觀的管理,調控。)