當(dāng)您要將企業(yè)應(yīng)用程序轉(zhuǎn)變成與 Web 服務(wù)一起使用時,最簡單的途徑就是將單個操作與單個的企業(yè)服務(wù)結(jié)合在一塊。但這并不是最好的方法。在本文中,Jerome Josephraj 將向您展示如何構(gòu)架基于分層的、正確的模型-視圖-控制器(MVC)設(shè)計模式的Web 服務(wù)應(yīng)用程序。為此,他修改了 Struts(一種流行的開放源碼MVC 框架),以使其適用于 Web 服務(wù)領(lǐng)域。通過研究此處所概述的樣本應(yīng)用程序,您將知道如何才能將 Struts 與 Web 服務(wù)聯(lián)合起來使用。
構(gòu)建 Web 服務(wù)最簡單的途徑就是將單個操作與單個企業(yè)服務(wù)結(jié)合起來,如圖 3 所示。在這種設(shè)計方法中,實現(xiàn)業(yè)務(wù)邏輯的服務(wù)與實現(xiàn)數(shù)據(jù)檢索的服務(wù)是混合在一起的。
圖 3. 簡單粗糙的 Web 服務(wù)體系結(jié)構(gòu)
這樣的一種 Web 服務(wù)可以很輕易從已有的業(yè)務(wù)組件中開發(fā)出來。然而,它有很多的缺點:對用戶沒有提供統(tǒng)一認(rèn)證,提供者與訂閱者耦合不緊,業(yè)務(wù)邏輯沒有重用。簡而言之,對于一個連貫的解決方案來說這并不是一個非常好的體系結(jié)構(gòu)。
在 MVC 模式基礎(chǔ)上來實現(xiàn) Web 服務(wù)解決方案會更好點。在后續(xù)部分,您將看到如何使用 Struts 來做到這一點。我將通過 WSManager 層來詳述現(xiàn)有的 Struts 架構(gòu),這一層展示了采用 Web 服務(wù)的模型服務(wù)方法。
采用 Struts 應(yīng)用程序的 Web 服務(wù) 在以后的開發(fā)工作中您可以擴大構(gòu)建得比較好的 Struts 應(yīng)用程序來支持 Web 服務(wù)。前面講過,Struts 架構(gòu)清楚地區(qū)分開了視圖、控制器以及模型。模型包含所有必須的業(yè)務(wù)邏輯,從存儲數(shù)據(jù)倉庫中檢索數(shù)據(jù)。您可以構(gòu)建一個簡單的 Web 服務(wù)層——稱為 WSManager 層——這樣的模型可以提供 Web 服務(wù)也可以訂購 Web 服務(wù)。使用這種體系結(jié)構(gòu)的應(yīng)用程序?qū)⒒诮M件開發(fā)的最佳點與萬維網(wǎng)結(jié)合在了一起,如 圖 4所示。
作為初始聯(lián)系點來治理請求與服務(wù) 調(diào)用安全服務(wù),包括身份驗證與授權(quán)使用,從而避免任何重復(fù)的層訪問。 委派業(yè)務(wù)處理(采用由 Struts 應(yīng)用程序所使用的模型服務(wù)) 在 WSManager 層緩存數(shù)據(jù)避免任何不必要的數(shù)據(jù)庫訪問。 發(fā)布者:展示 Web 服務(wù) 在 WSManager 類中實現(xiàn)的每一個公共方法都將作為一種 Web 服務(wù)發(fā)布出來。換句話說,您要為這些類發(fā)布一種 Web 服務(wù)描述 。Web 服務(wù)描述是由服務(wù)的 Web 服務(wù)描述語言(Web Services Description Language,WSDL)描述與由它所引用的任何 XML schema 所組成。(WSDL 是描述服務(wù)的標(biāo)準(zhǔn)語言。)
您可以在公共注冊中心或在企業(yè)內(nèi)的公司注冊表上發(fā)布 Web 服務(wù)描述。同樣,你也可以發(fā)布由WEB 服務(wù)定義的XML Schema到同一個公共的或者公司專有的(UDDI)注冊中心上。 Java Web 服務(wù)客戶端采用 JAXR 應(yīng)用編程接口來查詢公司或公共注冊表上的服務(wù)描述。
假如您的客戶都是專有的合作伙伴,那您就不需要使用注冊表了。不過,您可以在您的應(yīng)用程序的 Web 層或者在具備適當(dāng)安全保護的熟知位置來發(fā)布您的 Web 服務(wù)描述( WSDL 和 XML schemas)。例如,假想有一個轉(zhuǎn)售者的客戶應(yīng)用程序,他與某個非凡廠商有協(xié)定。客戶應(yīng)用程序已經(jīng)在廠商開發(fā)時