轻松简单地开发Web Services 2
XFire和其它類庫(kù) 現(xiàn)在是最后一步了,需要得到所有必需的類庫(kù)。我們?cè)鯓拥玫剿鼈兡?去XFire網(wǎng)站,下載xfire-distribution-1.0.zip,然后解壓到一個(gè)本地文件夾。復(fù)制下面的jar文件和它的庫(kù)文件夾到WEB-INF/lib中:
? 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
一切妥當(dāng)。我們來部署和啟動(dòng)應(yīng)用程序。為了部署示例應(yīng)用,只需要復(fù)制websvc.war到Apache Tomcat的webapps文件夾中,再等待幾秒鐘。它將會(huì)自動(dòng)啟動(dòng)。這個(gè)應(yīng)用的全部源代碼也包含在這個(gè)war文件中。我們的程序已經(jīng)準(zhǔn)備作為一個(gè)Web Service了。
1我們?nèi)绾沃繵eb Service正在工作呢? 為了了解Web Service是否正在工作,我們需要測(cè)試。首先,我們測(cè)試來看WSDL是否可用。我們?cè)跒g覽器中輸入U(xiǎn)RL。哪個(gè)URL?因?yàn)槲覀兊膽?yīng)用程序的war文件是websvc.war,并且在services.xml中給出的服務(wù)名是Banking,WSDL的URL應(yīng)該是:http://localhost:8080/websvc/services/Banking?wsdl。
請(qǐng)注意:URL的第一部分,例如,http://localhost:8080,可能會(huì)根據(jù)你的應(yīng)用服務(wù)器不同而不同。無論怎樣,當(dāng)你輸入U(xiǎn)RL后,將會(huì)看到一個(gè)XML文檔,它的根元素是。這個(gè)文檔叫做服務(wù)的WSDL。如果你看到了,這就是你的應(yīng)用作為Web Service已經(jīng)可用的第一個(gè)證明。
但是這個(gè)測(cè)試是不夠的。可能會(huì)發(fā)生這種情況,可以看到WSDL,但是從客戶端程序可能會(huì)訪問不到服務(wù)。因此為了核實(shí)服務(wù)是否可以訪問了,我們必須使用一個(gè)客戶端進(jìn)行服務(wù)的實(shí)際調(diào)用來進(jìn)行一個(gè)真正的測(cè)試。
開發(fā)一個(gè)客戶端
你可以使用任何的SOAP工具創(chuàng)建客戶端,例如,.Net或者Apache Axis,有很多種方法:使用從WSDL產(chǎn)生的stubs,使用動(dòng)態(tài)代理,等等。在例子中,我們使用一個(gè)動(dòng)態(tài)代理,以一個(gè)簡(jiǎn)單的Servlet形式,叫做WsClient.java。為了保持代碼兩最小,所有在屏幕顯示的元素都放在了doGet()方法中。對(duì)Web Service的實(shí)際調(diào)用由callWebService()方法完成,它相當(dāng)?shù)睾?jiǎn)單。和下面的類似:
/* Call the Web service
?? *
?? */
public String callWebService(
????String fromAccount, String toAccount, double amount, String currency)
????throws MalformedURLException, Exception {
????//Create a metadata of the service????
????Service serviceModel = new ObjectServiceFactory().create(IBankingService.class);????
????log.debug("callSoapServiceLocal(): got service model." );
????//Create a proxy for the deployed service
????XFire xfire = XFireFactory.newInstance().getXFire();
????XFireProxyFactory factory = new XFireProxyFactory(xfire);????
????String serviceUrl = "http://localhost:8080/websvc/services/Banking";
????IBankingService client = null;
????try {
????????client = (IBankingService) factory.create(serviceModel, serviceUrl);
????} catch (MalformedURLException e) {
????????log.error("WsClient.callWebService(): EXCEPTION: " + e.toString());
????}??
????//Invoke the service
????String serviceResponse = "";
????try {
????????serviceResponse = client.transferFunds(fromAccount, toAccount, amount, currency);
????} catch (Exception e){
????????log.error("WsClient.callWebService(): EXCEPTION: " + e.toString());??????????
????????serviceResponse = e.toString();
????}????
????log.debug("WsClient.callWebService(): status=" + serviceResponse);????????
????//Return the response
????return serviceResponse;
}
這個(gè)代碼是如何工作的呢?我來解釋一下:首先,我們創(chuàng)建一個(gè)服務(wù)模型,它包含服務(wù)的說明——換句話說,就是服務(wù)的元數(shù)據(jù)。我們使用XFire的ObjectServiceFactory從IBankingService.class接口創(chuàng)建這個(gè)模型。
接著,為XFire獲得一個(gè)代理工廠對(duì)象,它包含了常規(guī)的代碼,也相當(dāng)?shù)睾?jiǎn)單和易懂。這一步中沒有任何特定應(yīng)用的東西。從這個(gè)proxyFactory,使用服務(wù)模型和服務(wù)端點(diǎn)URL(用來獲得WSDL),我們可以得到一個(gè)服務(wù)的本地代理。
就是它了。這個(gè)代理就是實(shí)際的客戶端。現(xiàn)在,我們可以調(diào)用它的transferFunds()方法來得到我們需要的Web Service。
一旦示例應(yīng)用發(fā)布并啟動(dòng),就可以嘗試servlet URL:http://localhost:8080/websvc/ws。
這個(gè)Servlet使用默認(rèn)參數(shù)來調(diào)用Web Service和顯示接收到的響應(yīng)。頁面的最后兩行應(yīng)該讀取:
Response Received
COMPLETED: CDN$ 500.00 was successfully transferred from A/C# 11111-01234 to A/C# 99999-05678
現(xiàn)在你可以確定Web Service已經(jīng)發(fā)布并且在運(yùn)行中了。
為了嘗試不同的輸入值,你可以使用完整的URL,例如:http://localhost:8080/websvc/ws?from=11-2345&to=77-9876&amt=250.00&cur=EUR。
基本的Web Services開發(fā)步驟清單
這個(gè)清單總結(jié)了將一個(gè)Java方法發(fā)布為Web Service所必須的步驟:
1、 檢查Java類的方法和默認(rèn)構(gòu)造函數(shù)確保為public
2、 增加XFire servlet相關(guān)條目到web.xml中
3、 創(chuàng)建services.xml,把它放到WEB-INF/classes/META-INF/xfire目錄下
4、 增加XFire和第三方包到你的Web應(yīng)用的WEB-INF/lib文件夾中
這就是所有需要的步驟,是的,相當(dāng)簡(jiǎn)單。XFire的其他高級(jí)特性
XFire的使用可能比較簡(jiǎn)單,但是在特性和功能性上,它卻占據(jù)著領(lǐng)導(dǎo)者的位置。下面是它的高級(jí)特性:
---本地?cái)?shù)據(jù)綁定支持POJOs(plain-old Java objects)、XMLBeans、JAXB(Java Architecture for XML Binding)、Castor等等。數(shù)據(jù)綁定說明了Web Services的XML請(qǐng)求和映射到Java對(duì)象的XML響應(yīng)。
---使用StAX(Streaming API for XML)處理XML文檔。同DOM的基于樹和SAX的事件驅(qū)動(dòng)的處理方式相比,StAX使用了拉(pull)機(jī)制,它使處理更快速,內(nèi)存效率更高。
---支持多種傳輸協(xié)議,如HTTP、JMS(Java Message Service)和JVM內(nèi)部傳輸。
---嵌入式,這是XFire的核心功能之一。你可以把這個(gè)SOAP引擎嵌入到你的應(yīng)用中,完全隱藏所有XFire特定引用,同樣所有配置都是程序驅(qū)動(dòng)。
---豐富的API,它使XFire可高度自定義,允許開發(fā)者在不同的階段截獲請(qǐng)求,并且對(duì)他們進(jìn)行處理。
---兼容最新的標(biāo)準(zhǔn)例如SOAP1.1(沒有加密遠(yuǎn)程工程調(diào)用,或者RPC)和1.2、WSDL1.1、the Web Services Interoperability Organization’s Basic Profile 1.0、Web Services Addressing和WS-Security。
最重要的是,XFire屬于新一代Web Services引擎。不僅僅是營(yíng)銷用語,“新一代”有一些重要的意義。Apache Axis是第一代Java語言的Web Services引擎,已經(jīng)成為了所有后來工具的參考標(biāo)準(zhǔn)。在過去的幾年里,Axis以及這些其它的工具已經(jīng)在很多生產(chǎn)環(huán)境中進(jìn)行了實(shí)地測(cè)試。從中得出的一個(gè)關(guān)鍵的問題就是Web Services并不最適合RPC類型的通信。對(duì)于性能和效率,面向文檔的消息形式是最好的方式。但是Apache Axis和很多其他的Web Services引擎都被設(shè)計(jì)成了面向RPC的(盡管它們支持文檔形式)。現(xiàn)在,整個(gè)行業(yè)正在開發(fā)新一代的SOAP引擎,設(shè)計(jì)為面向文檔的。Apache已經(jīng)宣布結(jié)束舊版本的Axis引擎開發(fā),現(xiàn)在專注于Axis2,現(xiàn)在它的預(yù)發(fā)布版本是0.95。XFire在今年的2月份發(fā)布了它的第一個(gè)產(chǎn)品版本(1.0)。它的下一個(gè)版本(1.1)僅僅在幾個(gè)星期之后就進(jìn)行了發(fā)布。
性能
Web Services需要消耗很多資源,但是性能方面它們不是那么引人注目。XFire打破了這種趨勢(shì)。它消耗更少的內(nèi)存(部分因?yàn)?StAX的使用),但是表現(xiàn)卻比多數(shù)可比較的SOAP引擎出色。你可以在資源中提供的鏈接中看到比較的結(jié)果。
此外,XFire還提供了各種方法來進(jìn)一步優(yōu)化性能。一個(gè)方法是使用JVM內(nèi)置傳輸(in-JVM transport)。如果你知道Web Services和客戶端運(yùn)行在同一個(gè)JVM上,你可以選擇使用本地傳輸,它可以大幅提升性能。在示例中的客戶端代碼,看以下指定服務(wù)端點(diǎn)URL的這行:
String serviceUrl = "http://localhost:8080/websvc/services/Banking";
替換為
String serviceUrl = "xfire.local://Banking";
你會(huì)看到性能上的明顯提高,因?yàn)樗@過了整個(gè)網(wǎng)絡(luò)層。
局限性
XFire有些重要的局限性你應(yīng)該清楚:
---開發(fā)Web Services的好的實(shí)踐是從WSDL開始。大部分的SOAP引擎提供了從WSDL生成服務(wù)stub的工具。XFire也提供了這樣一個(gè)工具。但是它是基于注釋(annotations-based)的,因此需要J2SE5.0。對(duì)于仍堅(jiān)持使用J2SE1.4.x的人來說,它不是一個(gè)令人拍手叫好的工具,因?yàn)槲覀冇泻芏嗥渌绞絹砭帉懣蛻舳?#xff0c;一個(gè)就是文章中演示的方式。
---附件支持,它將會(huì)包含在未來發(fā)行的版本中。
---易于學(xué)習(xí)的用戶向?qū)АFire團(tuán)隊(duì)在這個(gè)方面還有很多工作需要做。
結(jié)論
Java當(dāng)前的趨勢(shì)是簡(jiǎn)化技術(shù)的使用。因此,我們正看到一波基于POJO的開發(fā)成就。同時(shí),面向服務(wù)架構(gòu)(SOA,Services-oriented architecture)和Web Services已經(jīng)變成了當(dāng)前行業(yè)的熱點(diǎn)話題。XFire正是在這種情況下產(chǎn)生的。它能夠使POJO發(fā)布為最少的Web Services,而只需要付出最小化的努力。從而,它使希望使用這項(xiàng)技術(shù)的初級(jí)開發(fā)者的學(xué)習(xí)曲線變得平緩。同時(shí),由于它兼容最新標(biāo)準(zhǔn)和提供了豐富的API,XFire為高級(jí)用戶提供了更多的大好機(jī)會(huì)。
總結(jié)
以上是生活随笔為你收集整理的轻松简单地开发Web Services 2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做无痛胃肠镜后注意事项(无痛胃肠镜后注意
- 下一篇: dwr配置文件dwr.xml详解