基于XFire開發WebServices
為了實現Web Services的平臺無關性和實現訪問獨立性,軟件行業需要遵循一些作為標準的技術。其中一些包括:
---XML:在Web Services環境中各層之間進行傳遞的默認數據格式。
下面的高級層次圖表,基于WWW協會發布的“Web Services Architecture”(Web Services架構)文檔,顯示了這些技術在實際的工作環境中是如何發揮作用:
這個流程圖顯示了Web Services中的核心技術是如何工作的。
這里,Provider是提供服務的應用程序組件,Requester是使用服務的客戶端程序。很多其他技術也會參與到交互中,但是這個圖只顯示了在Web Services環境中必需的核心技術組件。
XFire是一個免費的開源SOAP框架,它不僅可以極大方便地實現這樣一個環境,并且可以提供許多Web Services規范中高級特征,這些特征在多數的商業或者開源工具都沒有提供。你要恰當的理解這些單詞:great ease and simplicity(非常輕松和簡單)。你將會看到使用XFire創建Web Services是多么的簡單。
package com.mybank.xfire.example; import java.text.NumberFormat; /** XFire WebServices sample implementation class. |
因為使用接口的設計是一個好的實踐,所以我們的Java類也實現了一個稱為IBankingService的接口。代碼十分簡單:
package com.mybank.xfire.example; public interface IBankingService { public String transferFunds( |
在實際實現中,這樣一個方法可能包括各種類型的復雜調用、查詢和處理操作。但是我們的示例代碼已經最小化了,以至于我們可以集中精力在主要目標上:把這個方法發布為Web Services。
你可以看到BankingService是一個普通的Java類,沒有任何代碼告訴我們它將會在Web Services中使用。好的,這里我們不需要增加任何東西。我們所有的工作都在部署描述符里完成。
Web應用的部署描述符
在Java中,Web應用程序通常需要至少一個部署描述符(叫做web.xml)對其進行配置。XFire本身是一個基于servlet的應用 程序。因此,我們需要增加必要的引用到描述符文件中。然后我們還必須配置將要創建的Web Services。我們使用一個稱為services.xml的新文件來完成這件事。
web.xml
首先,修改web.xml。我們需要增加下面的XFire servlet相關的條目:
<servlet>
<servlet-name>XFireServlet</servlet-name> <display-name>XFire Servlet</display-name> <servlet-class>org.codehaus.xfire.transport.http.XfireConfigurableServlet </servlet-class> </servlet> <servlet-mapping>
<servlet-name>XFireServlet</servlet-name> <url-pattern>/servlet/XFireServlet/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> |
<beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <name>Banking</name> <namespace>mybank</namespace> <serviceClass>com.mybank.xfire.example.IBankingService</serviceClass> <implementationClass>com.mybank.xfire.example.BankingService</implementationClass> </service> </beans> |
<implementationClass>保存了實現方法的Java類名。這是一個可選元素。如果上一個元素<serviceClass>包含了一個接口,那么相應的實現類必須在這里指定。
- • activation-1.0.2.jar
- • commons-codec-1.3.jar
- • commons-httpclient-3.0.jar
- • commons-logging-1.0.4.jar
- • jaxen-1.1-beta-8.jar
- • jdom-1.0.jar
- • log4j-1.2.x.jar
- • mail-1.3.3_01.jar
- • spring-1.2.x.jar
- • stax-api-1.0.jar
- • wsdl4j-1.5.2.jar
- • wstx-asl-2.9.jar
- • xbean-2.1.0.jar
- • xbean-spring-2.2.jar
- • xfire-all-1.0.jar
- • XmlSchema-1.0.jar
我們如何知道Web Service正在工作呢?
為了了解Web Service是否正在工作,我們需要測試。首先,我們測試來看WSDL是否可用。我們在瀏覽器中輸入URL。哪個URL?因為我們的應用程序的war文 件是websvc.war,并且在services.xml中給出的服務名是Banking,WSDL的URL應該是:http: //localhost:8080/websvc/services/Banking?wsdl。
請注意:URL的第一部分,例如,http://localhost:8080,可能會根據你的應用服務器不同而不同。無論怎樣,當你輸入URL后,將會看到一個XML文檔,它的根元素是。這個文檔叫做服務的WSDL。如果你看到了,這就是你的應用作為Web Service已經可用的第一個證明。
但是這個測試是不夠的。可能會發生這種情況,可以看到WSDL,但是從客戶端程序可能會訪問不到服務。因此為了核實服務是否可以訪問了,我們必須使用一個客戶端進行服務的實際調用來進行一個真正的測試。
開發一個客戶端
你可以使用任何的SOAP工具創建客戶端,例如,.Net或者Apache Axis,有很多種方法:使用從WSDL產生的stubs,使用動態代理,等等。在例子中,我們使用一個動態代理,以一個簡單的Servlet形式,叫做 WsClient.java。為了保持代碼兩最小,所有在屏幕顯示的元素都放在了doGet()方法中。對Web Service的實際調用由callWebService()方法完成,它相當地簡單。和下面的類似:
/* Call the Web service //Return the response |
這個代碼是如何工作的呢?我來解釋一下:首先,我們創建一個服務模型,它包含服務的說明——換句話說,就是服務的元數據。我們使用XFire的ObjectServiceFactory從IBankingService.class接口創建這個模型。
接著,為XFire獲得一個代理工廠對象,它包含了常規的代碼,也相當地簡單和易懂。這一步中沒有任何特定應用的東西。從這個proxyFactory,使用服務模型和服務端點URL(用來獲得WSDL),我們可以得到一個服務的本地代理。
就是它了。這個代理就是實際的客戶端。現在,我們可以調用它的transferFunds()方法來得到我們需要的Web Service。
http://localhost:8080/websvc/ws。
這個Servlet使用默認參數來調用Web Service和顯示接收到的響應。頁面的最后兩行應該讀取:
現在你可以確定Web Service已經發布并且在運行中了。
http://localhost:8080/websvc/ws?from=11-2345&to=77-9876&amt=250.00&cur=EUR。
這個清單總結了將一個Java方法發布為Web Service所必須的步驟:
- 1、 檢查Java類的方法和默認構造函數確保為public
- 2、 增加XFire servlet相關條目到web.xml中
- 3、 創建services.xml,把它放到WEB-INF/classes/META-INF/xfire目錄下
- 4、 增加XFire和第三方包到你的Web應用的WEB-INF/lib文件夾中
XFire的使用可能比較簡單,但是在特性和功能性上,它卻占據著領導者的位置。下面是它的高級特性:
- ---本地數據綁定支持POJOs(plain-old Java objects)、XMLBeans、JAXB(Java Architecture for XML Binding)、Castor等等。數據綁定說明了Web Services的XML請求和映射到Java對象的XML響應。
- ---使用StAX(Streaming API for XML)處理XML文檔。同DOM的基于樹和SAX的事件驅動的處理方式相比,StAX使用了拉(pull)機制,它使處理更快速,內存效率更高。
- ---支持多種傳輸協議,如HTTP、JMS(Java Message Service)和JVM內部傳輸。
- ---嵌入式,這是XFire的核心功能之一。你可以把這個SOAP引擎嵌入到你的應用中,完全隱藏所有XFire特定引用,同樣所有配置都是程序驅動。
- ---豐富的API,它使XFire可高度自定義,允許開發者在不同的階段截獲請求,并且對他們進行處理。
- ---兼容最新的標準例如SOAP1.1(沒有加密遠程工程調用,或者RPC)和1.2、WSDL1.1、the Web Services Interoperability Organization’s Basic Profile 1.0、Web Services Addressing和WS-Security。
String serviceUrl = "http://localhost:8080/websvc/services/Banking";
posted on 2008-04-23 15:25 々上善若水々 閱讀(2304) 評論(0) 編輯 收藏 所屬分類: WebService