當您要將企業應用程序轉變成與 Web 服務一起使用時
最簡單的途徑就是將單個操作與單個的企業服務結合在一塊
但這並不是最好的方法
在本文中
Jerome Josephraj 將向您展示如何構架基於分層的
正確的模型-視圖-控制器(MVC)設計模式的Web 服務應用程序
為此
他修改了 Struts(一種流行的開放源碼MVC 框架)
以使其適用於 Web 服務領域
通過研究此處所概述的樣本應用程序
您將知道如何才能將 Struts 與 Web 服務聯合起來使用
不斷發展的 Java 編程語言和 Sun 公司的 J
EE 規范使得遵守各類准則的軟件開發者們能夠創建出分布式計算應用程序
這些應用程序在以前只能通過相關專門工具才可實現
這樣
當某些開發團體要選擇在 Java 平台中實現新系統時
其他團體就會通過另外的技術來創建
提高並維護應用程序
然後將它們集成到已有的各類分布式應用程序中去
這種情形就引起了互操作性的競爭
新應用程序與舊應用程序如何交互呢?答案就是
Web 服務
Web 服務是程序設計新的聖杯
它們能夠共享並協調分散的各類計算資源
在本文中
您將了解實現此目的的一種方法
您將看到如何在與 Web 服務相結合的開放源碼 Struts 框加的基礎上來構建應用程序
在開始之前您必須了解一些 J
EE 與 Web 服務的相關知識
這裡
我將簡要地介紹下 Struts 架構與模型-視圖-控制器(MVC)
如果您以前沒碰到過
那麼您應該在後面先看下 參考資料 部分來獲取更多信息
MVC 模式分離開發角色 MVC 設計模式很清楚的劃定了程序員與設計者的角色界限
換句話說
從商業邏輯上拆解了數據
這種模式是讓設計者集中於設計應用程序的顯示部分
而開發者則集中於開發驅動應用程序功能所需的組件
MVC 模式有好幾種變異
不過它們都是基於相同的基礎結構
應用程序的數據模型 (Model)
顯示層代碼(View)
以及程序控制邏輯( Controller) 是存在其中的獨立但能相互間通信的組件
模型組件描述並處理應用程序數據
視圖指的是用戶界面
它反映的是模型數據並把它遞交給用戶
控制器是將視圖上的行為(例如
按下 Submit 按鈕)映射到模型上的操作(例如
檢索用戶詳細信息)
模型更新後
視圖也被更新
用戶就能夠完成更多行為
MVC 模式使代碼易懂而且使代碼更容易重用
另外
在很多工程中視圖經常要被更新
MVC 模式將模型和控制器與這些所做的更改獨立開來
圖 MVC 設計模式 Struts基於 MVC 的堅固框架 Struts 是 MVC 模式基礎上構建 Web 應用程序的一種開放源碼框加
Struts 鼓勵在 MVC 模式上構建應用程序而且提供大多數 Web 應用程序所共有的服務
在 Struts 應用程序中
您可以構建模型層
這樣業務邏輯與數據檢索邏輯重用就很容易了
這層負責運行應用程序的業務邏輯
獲取相關數據(例如
運行 SQL 命令或者讀取平面文件)
Struts 鼓勵在模型-視圖-控制器設計范例基礎上構建應用程序
Struts 提供自己的控制器組件(ActionController 類)並與其他技術相結合來提供模型與視圖
對於模型(Model 類)
Struts 能與任何標准的數據訪問技術相結合
包括 EJB
JDBC 以及 Object
Relational Bridge
對於視圖(ActionForm 類)
Struts 在 JSP 環境以及其他基於表示邏輯的系統中運行的很好
圖
闡明了基於 Struts 應用程序的邏輯流程
圖 Struts 應用程序的邏輯流 簡單粗糙的 Web 服務體系結構
構建 Web 服務最簡單的途徑就是將單個操作與單個企業服務結合起來
如圖
所示
在這種設計方法中
實現業務邏輯的服務與實現數據檢索的服務是混合在一起的
圖 簡單粗糙的 Web 服務體系結構 這樣的一種 Web 服務可以很容易從已有的業務組件中開發出來
然而
它有很多的缺點
對用戶沒有提供統一認證
提供者與訂閱者耦合不緊
業務邏輯沒有重用
簡而言之
對於一個連貫的解決方案來說這並不是一個非常好的體系結構
在 MVC 模式基礎上來實現 Web 服務解決方案會更好點
在後續部分
您將看到如何使用 Struts 來做到這一點
我將通過 WSManager 層來詳述現有的 Struts 架構
這一層展示了采用 Web 服務的模型服務方法
采用 Struts 應用程序的 Web 服務 在以後的開發工作中您可以擴大構建得比較好的 Struts 應用程序來支持 Web 服務
前面講過
Struts 架構清晰地區分開了視圖
控制器以及模型
模型包含所有必須的業務邏輯
從存儲數據倉庫中檢索數據
您可以構建一個簡單的 Web 服務層——稱為 WSManager 層——這樣的模型可以提供 Web 服務也可以訂購 Web 服務
使用這種體系結構的應用程序將基於組件開發的最佳點與萬維網結合在了一起
如 圖
所示
圖 采用 Web 服務的 Struts 應用程序 下面的部分要討論的是這種體系結構中不同組件的詳細信息
特別要密切注意 WSManager 層
因為它是此體系結構中真正新加的部分
Struts 控制器 MVC 體系結構的控制器部分主要集中於接收客戶端的請求(一般為運行 Web 浏覽器的用戶)
決定執行哪一種業務邏輯功能來響應請求
然後負責生成下一個用戶界面連接到合適的視圖組件上去
在 Struts 中
控制器的主要組件就是 ActionServlet 類的一個小服務程序
ActionServlet 負責通過 XML 文檔將 URI 請求映射到特定的行為
這個文檔包含了 URI 請求列表而且還告知 ActionServlet 它應該如何分配每個請求
這種方法有幾個好處
應用程序的整個邏輯流程在分級文本文件中
這種格式的列表更容易查看與理解
尤其是對於一個很大的應用程序而言
ActionServlet 決定了應用程序的流程
許多 Action 類都繼承了 ActionServlet
每個 Action 類
都映射到各自獨立的處理過程
通過 Struts 的 ActionController 與 Struts JSPs 相結合
作為繼承 Struts中 Action 類的一個 Java 類來實現
Struts中 Action 類調用 WSManager 類中的相關方法來使用 Web 服務
WSManager 獲取所要求的響應——或者如果有一個被解除了就會出現異常——將它回傳給 Struts 控制器
WSManager
WSManager 接收 JAX
RPC 端點的請求
將 WSManager 類中的方法調用映射到新來的客戶端請求
這些新來的客戶端請求是 SOAP 信息的格式
WSManager 必須實現安全認證
轉變參數
在指定請求到模型服務之前
要對這些請求進行參數預處理
請求所包含的參數形式有 Java 對象
Java原始參數
XML 文檔
或者甚至是 SOAP 文檔分片(例如
SOAP Element 對象)
這些類型必須要轉化成內部所支持的 schema(例如
預定義的 Java 數據訪問對象)
雖然 WSManager 可以很直接地處理與 Java 對象結合的參數
但它還需要采取一些附加步驟來處理 XML 文檔
建議以下步驟
WSManager 類應該能夠通過XML Schema來驗證XML文檔的有效性
WSManager 類接著要把 XML 文檔轉化成內部支持的 schema
最後 WSManager 應該分解文檔並且盡可能地將它映射到域對象中去
WSManager 實現以下任務是非常重要的
身份驗證和授權使用
錯誤處理
緩存
WSManager 也可以生成響應
這個過程由方法調用返回值的簡單構造所組成
WSManager 中保留這樣的功能
您可以通過緩存數據從而避免重復訪問模型服務層
您還可以集中管理響應聚集以及 XML 文檔轉換
如果您要返回給調度者的文檔必須遵守與內部 schema 不同的 schema 時
這一點就顯得尤其重要
WSManager 處理所有SOAP 請求並把它們委派到模型層所暴露的業務邏輯
如果模型服務是作為一個 EJB 層來實現
那您一樣可以在 EJB 層中通過 Session Fa?ade 設計模式來實現
如果您采用這種模式執行 WSManager
您將獲得很多好處
因為 WSManager 會:
作為初始聯系點來管理請求與服務
調用安全服務
包括身份驗證與授權使用
從而避免任何重復的層訪問
委派業務處理(采用由 Struts 應用程序所使用的模型服務)
在 WSManager 層緩存數據避免任何不必要的數據庫訪問
發布者
展示 Web 服務
在 WSManager 類中實現的每一個公共方法都將作為一種 Web 服務發布出來
換句話說
您要為這些類發布一種 Web 服務描述
Web 服務描述是由服務的 Web 服務描述語言(Web Services Description Language
WSDL)描述與由它所引用的任何 XML schema 所組成
(WSDL 是描述服務的標准語言
)
您可以在公共注冊中心或在企業內的公司注冊表上發布 Web 服務描述
同樣
你也可以發布由WEB 服務定義的XML Schema到同一個公共的或者公司專有的(UDDI)注冊中心上
Java Web 服務客戶端采用 JAXR 應用編程接口來查詢公司或公共注冊表上的服務描述
如果您的客戶都是專有的合作伙伴
那您就不需要使用注冊表了
不過
您可以在您的應用程序的 Web 層或者在具備適當安全保護的熟知位置來發布您的 Web 服務描述( WSDL 和 XML schemas)
例如
假想有一個轉售者的客戶應用程序
他與某個特殊廠商有協定
客戶應用程序已經在廠商開發時
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28171.html