當機構使用 Web 服務技術構建、部署和組織業務服務時,顯然必須進行仔細、全面設計 Java 2 平臺企業版 (J2EE) 應用程序。在這方面,最有效的幫助是嚴格應用旨在實現面向服務的體系結構 (SOA) 的體系結構模式。當公開 Enterprise JavaBean (EJB) 時,此類模式尤其有用。
人們通常把模式僅僅看作是為特殊設計問題提供指導的參考工具;而事實上,應將模式看作是體系結構要求的組成部分。它們是影響業務服務(封裝了業務規則驗證、計算、數據訪問以及其他驅動 J2EE 應用程序的核心功能的邏輯)組織決策的起點。除其他適用于 J2EE 的模式和思考方式以外,一些學術界人士、供應商和用戶還從 SOA 的角度對著名的Design Patterns一書(由 Addison-Wesley 出版社于 1994 年出版,作者是 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides —— 通常稱之為“四人幫”或“GoF”)中的許多模式進行了再計算和研究。
本文將從體系結構的角度介紹最重要的模式及其應用,假設您熟悉以下 Web 服務基礎知識:簡單對象訪問協議 (SOAP)、HTTP、XML、J2EE、EJB、Java 消息服務 (JMS) 等。
走進 Web 服務世界
從 J2EE 的角度而言,Web 服務基本上是 J2EE 編程模型的擴展(參見圖 1),具體體現在:
圖 1:J2EE/Web 服務模型
首先,我們將簡要概述將 EJB 應用程序公開為業務服務的過程。盡管本文使用 Oracle Application Server Containers for J2EE (OC4J) 環境,但對于任何其他符合 J2EE 的應用服務器也同樣適用。
下面,我將介紹一個企業對客戶 (B2C) 商務領域中的示例。(參見圖 2 和圖 3;圖 2 描繪了角色交互,圖 3 描繪了系統分解。)在該示例中,客戶登錄到“電子商店”網站,點擊感興趣的商品,選擇某些要購買的商品,查看訂單信息,提供支付信息,最后注銷。為簡單起見,我省略了大量詳細信息—例如,所有表示(Web 層)組件、安全支持等。
圖 2:“電子商店”示例—協作圖表
圖 3:“電子商店”示例—分解圖表
如圖 3 所示,該解決方案包含四種 EJB 子系統(每個子系統包含多個 bean):
此處最簡單的服務可能是基于非會話狀態會話 bean SystemIdEJB 的 GetSystemIdService。該 bean 是稱作“驗證客戶”的一組對象類的一部分。如果客戶已經成功通過驗證,則該 bean 提供稍后用于獲取其他客戶信息(例如,與商品目錄的呈現方式相關的客戶首選項)的系統用戶 ID。如果客戶未成功通過驗證,則該 bean 發出例外。
以下是發送至該服務的 SOAP 1.1 請求以及該服務發出的響應的示例:
POST /SystemId HTTP/1.1 ..........
Host:eStore.com
Content-Type:text/xml; charset="utf-8"
Content-Lengthnnnn
SOAPAction:"http://eStore.com/getSystemId"
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<m:GetSystemIdRequest
xmlns:m="http://eStore.com/GetSystemId.wsdl/"
xmlns:xsd="http://eStore.com/GetSystemId.xsd/">
<xsd:logon>LogonID</xsd:logon>
</m:GetSystemIdRequest>
</soapenv:Body>
</soapenv:Envelope>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<m:GetSystemIdResponse
xmlns:m="http://eStore.com/GetSystemId.wsdl/"
xmlns:xsd="http://eStore.com/GetSystemId.xsd/">
<xsd:authenticatedId>SystemID</xsd:authenticatedId>
</m:GetSystemIdResponse>
</soapenv:Body>
</soapenv:Envelope>
從以上示例可以清楚地看到:WSDL 和 XML 消息表示是啟用服務的主要元素。最重要的是,WSDL 描述了該服務的消息和端口、綁定以及服務定義:
<message name="GetSystemIdInput"> <message name="GetSystemIdOutput"> <service name="GetSystemIdService"> |
<package-mapping> <package-type>AuthenticateCustomer</package-type> <namespaceURI>urn:oracle-ws</namespaceURI> </package-mapping> |
共2頁: 1 [2] 下一頁 |