JDK6的新特性之十一:更簡單,更強(qiáng)大的JAX-WS
JAX-WS2.0的來歷
--------------------------------------------------------------------------------
JAX-WS(JSR-224) 是Java Architecture for XML Web Services的縮寫,簡單說就是一種用Java和XML開發(fā)Web Services應(yīng)用程序的框架, 目前版本是2.0, 它是JAX-RPC 1.1的后續(xù)版本, J2EE 1.4帶的就是JAX-RPC1.1, 而Java EE 5里面包括了JAX-WS 2.0,但為了向后兼容,仍然支持JAX-RPC. 現(xiàn)在,SUN又把JAX-WS直接放到了Java SE 6里面,由于JAX-WS會用到Common Annotation(JSR 250),Java Web Services Metadata(JSR 181), JAXB2(JSR 222), StAX(JSR 173), 所以SUN也必須把后幾個原屬于Java EE范疇的Components下放到Java SE, 現(xiàn)在我們可以清楚地理解了為什么Sun要把這些看似跟Java SE沒有關(guān)系的Components放進(jìn)來,終極目的就是要在Java SE里面支持Web Services.
JAX-WS2.0的架構(gòu)
--------------------------------------------------------------------------------
JAX-WS不是一個孤立的框架,它依賴于眾多其他的規(guī)范,本質(zhì)上它由以下幾部分組成
1.用來開發(fā)Web Services的Java API
2.用來處理Marshal/Unmarshal的XML Binding機(jī)制,JAX-WS2.0用JAXB2來處理Java Object與XML之間的映射,Marshalling就是把Java Object映射到XML,Unmarshalling則是把XML映射到Java Object.之所以要做Java Object與XML的映射,是因為最終作為方法參數(shù)和返回值的Java Object要通過網(wǎng)絡(luò)傳輸協(xié)議(一般是SOAP)傳送,這就要求必須對Java Object做類似序列化和反序列化的工作,在SOAP中就是要用XML來表示Java object的內(nèi)部狀態(tài)
3.眾多元數(shù)據(jù)(Annotations)會被JAX-WS用來描述Web Services的相關(guān)類,包括Common Annotations, Web Services Metadata, JAXB2的元數(shù)據(jù)和JAX-WS2.0規(guī)范自己的元數(shù)據(jù).
4.Annotation Processing Tool(APT)是JAX-WS重要的組成部分,由于JAX-WS2.0規(guī)范用到很多元數(shù)據(jù),所以需要APT來處理眾多的Annotations.在<JDK_HOME>/bin下有兩個命令wsgen和wsimport,就是用到APT和Compiler API來處理碰到的Annotations,wsgen可以為Web Services Provider產(chǎn)生并編譯必要的幫助類和相關(guān)支持文件,wsimport以WSDL作為輸入為Web Service Consumer產(chǎn)生并編譯必要的幫助類和相關(guān)支持文件.
5.JAX-WS還包括JAX-WS Runtime與應(yīng)用服務(wù)器和工具之間的契約關(guān)系
JAX-WS2.0的編程模型
--------------------------------------------------------------------------------
現(xiàn)在用JAX-WS2.0來編寫Web Services非常簡單,不像JAX-RPC,JAX-WS可以把任意POJO暴露為Web Services,服務(wù)類不需要實現(xiàn)接口,服務(wù)方法也沒有必要拋出RMI異常.下面介紹在JDK6環(huán)境下用JAX-WS2.0開發(fā)和測試Web Services的步驟
1.編寫服務(wù)類,并用Web Services Metadata(JSR-181)標(biāo)注這個服務(wù)類,我用我的另一篇BlogJDK6的新特性之十:Web服務(wù)元數(shù)據(jù)中的WSProvider類作為服務(wù)類的例子,在此我重復(fù)貼一下WSProvider類的源代碼:
/**
* @author chinajash
*/
@WebService(targetNamespace="http://blog.csdn.net/chinajash",serviceName="HelloService")
public class WSProvider {
@WebResult(name="Greetings")//自定義該方法返回值在WSDL中相關(guān)的描述
@WebMethod
public String sayHi(@WebParam(name="MyName") String name){
return "Hi,"+name; //@WebParam是自定義參數(shù)name在WSDL中相關(guān)的描述
}
@Oneway //表明該服務(wù)方法是單向的,既沒有返回值,也不應(yīng)該聲明檢查異常
@WebMethod(action="printSystemTime",operationName="printSystemTime")//自定義該方法在WSDL中相關(guān)的描述
public void printTime(){
System.out.println(System.currentTimeMillis());
}
public static void main(String[] args) {
Thread wsPublisher = new Thread(new WSPublisher());
wsPublisher.start();
}
private static class WSPublisher implements Runnable{
public void run() {
//發(fā)布WSProvider到http://localhost:8888/chinajash/WSProvider這個地址,之前必須調(diào)用wsgen命令
//生成服務(wù)類WSProvider的支持類,命令如下:
//wsgen -cp . WebServices.WSProvider
Endpoint.publish("http://localhost:8888/chinajash/WSProvider",new WSProvider());
}
}
}
2.用wsgen生成上面服務(wù)類的必要的幫助類,然后調(diào)用用EndPoint類的靜態(tài)方法publish發(fā)布服務(wù)類(步驟請參考我的另一篇Blog JDK6的新特性之十:Web服務(wù)元數(shù)據(jù)),我在這里是將服務(wù)類發(fā)布到http://localhost:8888/chinajash/WSProvider
3.用wsimport為服務(wù)消費(fèi)者(也就是服務(wù)的客戶端)生成必要的幫助類,命令如下:
wsimport http://localhost:8888/chinajash/WSProvider?wsdl
這會在<當(dāng)前目錄>\net\csdn\blog\chinajash下生成客戶端的幫助類,在這個例子中會生成7個類
HelloService.class
ObjectFactory.class
package-info.class
PrintSystemTime.class
SayHi.class
SayHiResponse.class
WSProvider.class
4.在客戶端用下面代碼即可調(diào)用步驟1定義的Web Service
HelloService hs = new HelloService();
WSProvider ws = hs.getWSProviderPort();
System.out.println(ws.sayHi("chinajash"));
ws.printSystemTime();
調(diào)用上述代碼后客戶端控制臺輸出
hi,chinajash
服務(wù)端控制臺輸出服務(wù)器當(dāng)前系統(tǒng)時間
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。