以下陳述均摘自網路的文章,自己總結歸併
J2EE的階層
早期的網路系統設計常常採用三層結構。最常見的結構,就是表示( presentation )層 , 領域( domain )層 , 以及基礎架構( infrastructure )層。
n層結構的提出是為了適應當前B/S模式開發WEB Application的需要而提出的。傳統的Brown模型是指:展示層( Presentation ),控制 / 中介層( Controller/Mediator ),領域層( Domain ) , 資料對應層( Data Mapping ) , 和資料來源層( Data Source )。它其實就是在三層架構中增加了兩個中介層。控制 / 中介層位於展示層和領域層之間,資料對應層位於領域層和基礎架構層之間。
J2EE規範提出了自己的階層。
J2EE的基本原則之一,是使得各個層的實現解除耦合或耦合最小化。最終實現可以任意的切換某個層的實現。
例如,在資料對應層,可以採用EJB的BMP,CMP,也可以採用Hibernate等
ORMapping,或者採用JDO。這由部署的環境來決定。
圖1. J2EE應用程式模型
J2EE 使用多層的分布式應用程式模型,應用邏輯按功能劃分為組件,各個應用組件根據他們所在的層分布在不同的機器上。事實上,sun設計J2EE的初衷正是為瞭解決兩層模式(client/server)的弊端,在傳統模式中,用戶端擔當了過多的角色而顯得臃腫,在這種模式中,第一次部署的時候比較容易,但難於升級或改進,可伸展性也不理想,而且經常基於某種專有的協議??通常是某種資料庫協議。它使得重用商務邏輯和介面邏輯非常困難。現在J2EE 的多層企業級應用程式模型將兩層化模型中的不同層面切分成許多層。一個多層化應用能夠為不同的每種服務提供一個獨立的層,這四層分別是運行在用戶端機器上的用戶端層(Client Tier)、 運行在Web伺服器上的Web層(Web Tier)、運行在EJB伺服器上的業務層(Business Tier)和 運行在EIS伺服器上公司資訊系統層(Enterprise Information System Tier)其中Web層和業務層共同組成了三層J2EE應用的中介層,其他兩層是用戶端層和儲存層或公司資訊系統層。一般情況下,許多開放商把Web伺服器和EJB伺服器產品結合在一起發布,稱為應用伺服器或J2EE伺服器。J2EE平台規範也定義了相應層的組件:
I. 用戶端層組件
應用用戶端程式和瀏覽器是用戶端層組件。用戶端層組件可以是基於Web方式的即作為Web伺服器的瀏覽器,也可以是基於傳統方式的(非基於Web方式)即獨立的應用程式,可以完成瘦客戶機無法完成的任務。
II. Web層組件
Java Servlet和JavaServer Pages(JSP)是Web層組件。2所示的客戶層那樣,Web層可能包含某些 JavaBean 對象來處理使用者輸入,並把輸入發送給運行在業務層上的Enterprise Bean 來進行處理。按照J2EE規範,靜態HTML頁面和Applets不算是Web層組件。這裡的JavaBean和EJB(Enterprise JavaBean)除了共用“JavaBean”這個名字外,這兩種組件模式完全沒有關係。許多文章把EJB作為原始的“JavaBean”的擴充,這是錯誤的。EJB並沒有擴充或使用JavaBean組件模式。最初的JavaBean(java.beans包)在進程內部(intraprocess)使用,而EJB(javax.ejb包)是在進程間(interprocess)使用的組件。即最初的JavaBean不是為分布式組件而設的。它是最好的組件模式,可能是至今發現的最好的過程內部開發的組件模式,但它不是一個伺服器端的組件模式。EJB則能解決在三層結構中由管理分布式商務對象多帶來的問題。
III. 業務層組件
Enterprise JavaBeans(EJB)是業務層組件。業務層代碼的邏輯用來滿足銀行,零售,金融等特殊商務領域的需要,由運行在業務層上的EJB 進行處理。圖3表明了一個EJB是如何從用戶端程式接收資料,進行處理(如果必要的話), 並發送到公司資訊系統層(EIS) 層儲存的,這個過程也可以逆向進行。
有三種企業級的Bean: 會話(Session)Beans, 實體(Entity) Beans, 和 訊息驅動(Message-driven) Beans。 會話Bean 表示與用戶端程式的臨時互動。 當用戶端程式執行完後, 會話Bean 和相關資料就會消失。相反, 實體Bean 表示資料庫的表中一行永久的記錄。 當用戶端程式中止或伺服器關閉時, 就會有潛在的服務保證實體Bean 的資料得以儲存。訊息驅動Bean 結合了會話Bean 和 JMS的訊息監聽器的特性, 允許一個業務層組件非同步接收JMS 訊息。
IV. 公司資訊系統層組件
處理公司資訊系統軟體包括企業基礎建設系統例如企業資源計劃 (ERP), 大型主機交易處理, 資料庫系統,和其它的遺留資訊系統組成了公司資訊系統層。 例如,J2EE應用組件可能為了資料庫連接需要訪問公司資訊系統。
J2ee模型與組件
Web容器和EJB容器具有明顯的區分——這意味著他們彼此相對獨立,一個企業的Web容器和EJB容器可以是來自不同廠商的產品。
兩個容器都可以享受企業服務。換句話說,Web容器內的組件和EJB容器內的組件一樣可以進行資料庫訪問,使用電子郵件和目錄服務,發送訊息等。
組件只有通過以驅動程式和適配程式形式存在的企業服務才能訪問EIS資源
所有的應用伺服器環境都有Java虛擬機器——即所有的應用伺服器上都有Java運行時環境。
在項目實施過程中,一般說來,把應用組件經常需要用到的自訂服務和庫單獨列開來是非常有必要的。在上述模型中,這些服務被稱為“自訂群組件庫”。
“自訂群組件庫”根據具體項目的需求而開發,並非是J2EE應用伺服器標準的組成部分。通常這些庫會隨著項目的進展而趨向于越來越大。
另外一個現象也很典型,那就是開發人員在訪問企業服務時,會發現總有一些核心服務是最常用到的。把這些服務列開,固化為單獨的一層在實踐中值得一試,這一層對應於圖1中的“服務訪問庫”。
簡而言之,“服務訪問庫”應該是J2EE API的一個子集,因企業專案的不同而不同。需要指出的是這裡的“自訂群組件庫”和“服務訪問庫”並未見於Sun公司正式發布的J2EE應用編程模型中,但在實際開發中,這兩個庫的存在是必要的。
J2EE應用組件
在看過了組件和服務的關係之後,接下去我們再來對它們進行逐一考察,理解在一個複雜的企業計算方案中它們各自扮演的角色。
Web容器組件
·Java Servlet
servlet是在伺服器一端,運行於Web容器內的表示邏輯組件。正如applet擴充了Web瀏覽器的準系統一樣,servlet擴充了Web伺服器的功能——提供編程能力以及動態產生Web頁的能力。
servlet的主要功能是接收來自用戶端Web瀏覽器的HTTP請求,處理輸入參數,再把結果以瀏覽器可以顯示的HTTP方式進行回傳。
例如,我們可以用servlet開發一個簡單的基於Web的認證系統。該servlet接收來自用戶端瀏覽器的使用者名稱和口令字;處理認證請求;再將認證結果發送回去。
除了接收來自用戶端瀏覽器的請求外,servlet之間也可以相互調用。
·Java Server Page(JSP)
雖然servlet可以產生HTTP輸出,但顯示處理結果的更好的辦法還是使用JSP組件(Java server page,Java伺服器頁面)。JSP和servlet一樣,也是運行在Web容器內的表示邏輯層組件,兩者在功能上略有不同。
JSP結合了HTML和Java,也就是說,JSP既可以包含HTML代碼也可以包含Java代碼。其中HTML代碼直接發送給瀏覽器,而Java代碼則在剝離之後,留由伺服器解釋執行。因此JSP對於提高HTML標籤的智能化非常有用。
在JSP內添加可重用的Java代碼塊的最好辦法就是使用JSP標籤庫。JSP標籤庫開發簡單,它既方便了在HTML標籤內增加Java代碼,又可以使得HTML代碼和Java代碼能很好地隔離開,易於維護。
在Web容器內,JSP常常作為servlet的補充,用於顯示servlet的處理結果。此外,JSP和Javabean的結合使用也非常典型。
·Javabean
Javabean是基本的資料模型組件,早在J2EE技術出現之前就出現了。在J2EE體繫結構中,Javabean常見於客戶層和表示邏輯層,和applet或JSP結合使用。
bean組件構造容易, 只要為一段Java代碼定義些適當的屬性即可。例如,一個帶有少量變數的簡單Java類,再添加些為變數定義的get_attribute()和set_attribute()等方法,就是一個標準bean組件了。
除了命名上的相似外,Javabean和企業Javabean(即EJB)沒有什麼大的關聯。EJB完全是另一種類型的企業Java應用組件。
EJB容器組件
·Enterprise Javabean(EJB)
企業Javabean或EJB是J2EE中介軟體中的分布式、可伸縮商務邏輯組件。在企業Java項目中,EJB組件用於封裝核心商務邏輯和資料模型元素。
EJB組件的運行環境就是EJB容器,J2EE在規範中定義了應用EBJ代碼和容器環境兩者的關係(contract)。
在公司專屬應用程式開發過程中,開發人員編寫EJB時需要符合一定的介面規範。介面中定義的方法,部分由開發人員自主實現,部分由EJB容器供應商(或應用伺服器開發商)提供。通過這種機制,EJB實現了商務邏輯實施(開發人員編寫的方法)和基礎設施供應(容器提供的方法)之間的隔離。
一個EJB組件可以和另一個EJB組件進行會話,後者既可能與前者在同一容器中,也可能位於遠程伺服器的另一個容器中。如1所示,EJB組件可以使用所有的企業服務,以及自訂群組件庫和服務訪問庫。
EJB規範定義了以下四種類別的EJB,以滿足不同應用場合的需要:
· 無狀態會話Bean
· 狀態會話Bean
· 實體Bean
· 訊息驅動Bean
綜上所述,J2EE各組件——EJB、servlet、JSP等等的結合,最終構成了基於MVC,具有高度靈活性和可重用性的公司專屬應用程式體系。
J2EE企業服務
前面已經提到過,J2EE企業服務是提供給Web容器和EJB容器的應用組件使用的。組件通過企業服務訪問EIS資源。訪問需求多種多樣,可能簡單如資料庫操作,或複雜如訊息傳遞/CICS環境下的大型主機通訊。
J2EE服務API為諸如資料庫訪問和目錄訪問等特定的服務提供一個標準Java介面,該介面完全隱藏具體實施細節。因此,程式員只需面對標準API,而不必和特定資源打交道,這有助於他們便於使用各種不同的服務。
例如,從J2EE應用組件的角度來看,訪問Sybase資料庫和訪問Oracle資料庫沒什麼兩樣。所有的不同只在於需要選擇不同的JDBC驅動程式和不同的資料庫檔案。由於幾乎不需要做任何代碼級修改,程式員可以毫不費力地訪問各種不同的資料庫。
JDBC (Java Data Base Connectivity)
與 ODBC類似,JDBC提供了一個標準、透明的資料庫連接的公用編程介面,各開發商根據JDBC的標準來實現其底層的驅動程式。J2EE組件通過統一的介面訪問不同種類的關係型資料庫。由於應用代碼獨立於特定的資料庫調用,因此當需要從一個資料庫轉到另一個資料庫時,代碼修改開銷可以降到最低。
JNDI(Java Naming and Directory Interfaces ,Java命名/目錄介面)
在分布式環境中,命名和目錄服務使得資源在全網路範圍內的合理分布成為可能。每個資源在分布式層次樹形結構中都具有唯一的名字。客戶程式通過訪問目錄服務獲得所需資源的控制代碼。 JNDI為企業命名/目錄服務調用制定標準,提出了一些統一的介面,由各開發商對這些介面加以實現。當前市場上目錄服務產品主要有LDAP、Novell 目錄服務和Active目錄服務等,JNDI在這些開發商產品之上定義了一個服務層,這樣,使用者就可以通過統一的介面去訪問底層的各種服務。
JMS(Java Messaging Services,JavaMessage Service)
Message Service在異構環境下扮演著重要角色。企業大型主機資訊系統或其他舊有遺留系統與J2EE中介軟體組件這樣的全異構系統之間的通訊串連,就是靠在兩端安裝Message Service實現的。通訊時,兩端應用程式各自與本端的Message Service進程進行會話,網路內Message Service進程之間則通過點到點或非同步方式依次傳遞訊息。
JMSAPI 實現了Message Service產品調用的標準化,目前市場上此類產品主要有IBM的MQ series、微軟的MSMQ、TIBCO的Rendezvous。JMS在這些產品各自的訊息API調用之上附加定義了一層,將所有這些產品統一於一個介面。這樣,J2EE應用就可以與特定的開發商產品實施保持相對獨立。
Javamail/JAF(JavaBeans Activation Framework)
正如名字所示,Javamail API為J2EE組件提供e-mail服務。它位於SMTP和POP3之類特定郵件服務實施上層,為所有公用服務如電子郵件格式識別、郵件收發和判斷是否有附件等,提供統一提供者。
Javamail API與JAF(Javabean Activation Framework)同步工作。
RMI(Remote Method Invocation,遠程方法調用)—IIOP/Java IDL
這兩種技術實現J2EE組件和CORBA組件之間的雙向通訊。Java IDL是推薦使用的在J2EE環境中訪問CORBA對象的方法;反之,RMI—IIOP則是在CORBA客戶程式中調用J2EE組件的方法。
JAX (Java API for XML)
Java XML API方便使用者在J2EE環境中調用XML文檔。JAX API提供的服務包括XML文法分析(SAX和DOM),XML與Java對象的綁定,XML訊息發送和XSLT轉換等。
JAX支援Web服務,方便J2EE商務邏輯組件適用於各種不同環境中。
JCA (Java連接器)
JCA 用來串連J2EE應用程式和EIS體繫結構,如ERP、大型主機交易處理、資料庫以及其他遺留資訊系統等,協助開發人員進行不同種類的EIS之間的無縫整合。 JCA連接器一方面與J2EE應用伺服器建立系統級串連,另一方面與訪問EIS資源的應用組件建立應用級串連。和其他服務API類似,JCA API在統一介面的同時,為開發商開發各具特色的資來源配接器產品提供空間。
JTA(Java Transaction API,Java事務介面)
JTA為 J2EE 平台提供了分散式交易服務