用Axis for Java進(jìn)行Web Services開(kāi)發(fā) (2)
上面的代碼可能和原文檔中不同,并且在名稱(chēng)空間、函數(shù)多態(tài)上會(huì)給用戶(hù)造成糊涂。不過(guò)別急,我在翻譯手冊(cè)的同時(shí)會(huì)加入很多解釋的代碼,如果哪位純粹看不懂可以通過(guò)郵件獲取幫助:luopc@edu-edu.com.cn ,郵件主題必須是我提供的文檔名稱(chēng)。通過(guò)上面的調(diào)用代碼,最終生成向服務(wù)器請(qǐng)求SOAP信息包,具體XML內(nèi)容如下:
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
這里我不再多少,細(xì)心的朋友請(qǐng)從代碼中找相應(yīng)的對(duì)應(yīng)信息來(lái)進(jìn)行自己的邏輯理解。至于SOAP協(xié)議在我以后的翻譯文檔中會(huì)加入進(jìn)去。
從上面的代碼中我們?cè)谡{(diào)用的時(shí)候輸入了參數(shù)new Object[]{“hello!”}。然后從生成的SOAP請(qǐng)求包中可以看到自動(dòng)序列化成
call.addParameter("testParam",
org.apache.axis.Constants.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
加入上面的代碼之后生成如下的SOAP信息:
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
可以作簡(jiǎn)單的對(duì)比。
也許你會(huì)疑惑設(shè)置參數(shù)名稱(chēng)和不設(shè)置參數(shù)名稱(chēng)有什么區(qū)別的疑問(wèn)。這里作簡(jiǎn)單的解釋?zhuān)?br />1. 為什么要call.setReturnType(org.apache.axis.Constants.XSD_STRING)?
上面你可以調(diào)用或者可以不調(diào)用,但當(dāng)返回結(jié)果中沒(méi)有標(biāo)明數(shù)據(jù)類(lèi)型時(shí)Axis就不知道如何進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換。當(dāng)然如果返回類(lèi)型你很清楚并且返回應(yīng)答SOAP的結(jié)果中表明了相應(yīng)的數(shù)據(jù)類(lèi)型你便可以不進(jìn)行上面的函數(shù)調(diào)用。
2. 為什么要設(shè)置參數(shù)名稱(chēng)和類(lèi)型?
好了,下在你知道了如何調(diào)用Web Services了,下面告訴你如何寫(xiě)作和發(fā)布Web Services。
通過(guò)Axis發(fā)布Web Services
這里寫(xiě)作一個(gè)簡(jiǎn)單的類(lèi),然后一步一步進(jìn)行發(fā)布。希望用戶(hù)能夠從中理出一些思路來(lái)。我在其他的關(guān)于Web Services的文章中會(huì)專(zhuān)門(mén)針對(duì)Web Services的通用發(fā)布方法。雖然Web Services牽涉到很多復(fù)雜的知識(shí),但請(qǐng)大家不要感覺(jué)到這些操作簡(jiǎn)單,也許你已經(jīng)有很多疑問(wèn),沒(méi)關(guān)系,記下你的疑問(wèn),不斷的投試。
public class SayHello {
public String echoString(String hello){
return hello;
}
}
哈哈,這個(gè)類(lèi)是不是太簡(jiǎn)單了。
一步一步來(lái)。
Axis提供兩種將Java類(lèi)發(fā)布成Web Services的途徑,即即時(shí)快速自動(dòng)發(fā)布和通過(guò)配置文件進(jìn)行發(fā)布。我們首先從最容易部署的入手。
JWS----即時(shí)部署
簡(jiǎn)單說(shuō)就是將自己寫(xiě)的Java類(lèi)源文件按一定的規(guī)則Copy到特定的目錄下便可自行被Axis部署。具體步驟如下:
? 將上面寫(xiě)的SayHello.java復(fù)制到axis目錄下。
? 改名為SayHello.jws。
注意:在你寫(xiě)的類(lèi)中不能有具體包的信息,因?yàn)檫@正是Axis即時(shí)部署不支持的。
運(yùn)行我們前面寫(xiě)的客戶(hù)端進(jìn)行測(cè)試,運(yùn)行結(jié)果是hello!。
目前你是否有如下的問(wèn)題?
如果類(lèi)中用多態(tài)的函數(shù)將如何處理?
其實(shí)很簡(jiǎn)單,我們知道在每次發(fā)出調(diào)用請(qǐng)求之前代理程序在后臺(tái)會(huì)直接請(qǐng)求你給的URL,這里是http://localhost:8080/axis/SayHello.jws?wsdl,其實(shí)這一請(qǐng)求返回來(lái)的是WSDL描述文件,通過(guò)具體的描述文件的內(nèi)容和你輸入的參數(shù)的類(lèi)型比較,最終確定發(fā)送什么請(qǐng)求。細(xì)節(jié)上的解釋需要用戶(hù)閱讀SOAP的具體內(nèi)容。我也會(huì)提供相應(yīng)的權(quán)威文當(dāng)翻譯的。
Axis的客戶(hù)端默認(rèn)就是通過(guò)HTTP協(xié)議傳輸嗎?
如何將自己定義的類(lèi)型進(jìn)行映射?
通過(guò)WSDD自定義部署
上面的自動(dòng)部署相當(dāng)簡(jiǎn)單,但當(dāng)你需要
? 映射自己的類(lèi)型時(shí)
? 不需要暴露源代碼時(shí)
? 需要自己的路徑和包管理時(shí)
? 對(duì)用戶(hù)操作Web Services的事件進(jìn)行相應(yīng)時(shí)
就需要通過(guò)WSDD來(lái)自定義部署。
前面新特性中提到過(guò),Axis是一個(gè)很靈活的可配置系統(tǒng),但在配置之前你得懂得Axis Web Services描述文檔(WSDD)的格式和意義。這里有一個(gè)簡(jiǎn)單的例子(deploy.wsdd):
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
很簡(jiǎn)短的描述就會(huì)自定義對(duì)特定類(lèi)以Web Services的形式發(fā)布。上面的每一個(gè)service項(xiàng)都會(huì)意味著開(kāi)通一個(gè)相應(yīng)的可被WSDL文件引用的服務(wù)。其內(nèi)部描述信息將會(huì)描述從請(qǐng)求-處理請(qǐng)求-應(yīng)答需要的所有核心信息。這里provider=”java:RPC”對(duì)應(yīng)著相應(yīng)的服務(wù)類(lèi)為org.apache.axis.providers.java.RPCProvider。其實(shí)你可以通過(guò)多種方式提供相應(yīng)的服務(wù)。在關(guān)于A(yíng)xis的架構(gòu)文章中將會(huì)詳細(xì)解釋這些內(nèi)容。
上面的各個(gè)參數(shù)我不再解釋?zhuān)蚁氪蠹乙豢淳兔靼住?br />下面讓我們?cè)谏厦娴暮?jiǎn)單配置上開(kāi)始一步一步的進(jìn)行各種高級(jí)配置:
服務(wù)存活范圍
Axis提供Session、Request和Application三種可選范圍配置。具體配置標(biāo)記為:
...
posted on 2006-06-08 18:06 xiaofeng 閱讀(178) 評(píng)論(0) 編輯 收藏