概念
JAX-WS2.0的全稱Java API for XML-Based Web Service 2.0.JAX-WS2.0是對JAX-RPC1.0規範的擴展,是JAX-RPC1.1的後續版本,JAX-RPC2.0標準發佈不久後就被重命名爲JAX-WS2.0.
JAX-WS2.0是Sun新的Web service協議棧,是一個完全基於標準實現的。在binding層,使用的是the Java Architecture for XML Binding(JAXB),在parsing層,使用的是the Streaming API for XML(StAX),同時它還完全支持schema規範。
官網下載地址:http://jax-ws.java.net/2.1.1/index.html
術語
- SEI:Service Endpoint Interface
- JAX:Java API for XML Web Servcie
- JAX-WS RI:JAX-WS Reference Implementation
- SAAJ:SOAP with Attachments API for Java
創建 Web Service方式
JAX-WS 2.0有兩種創建Web Service的開發過程:自頂向下和自定向上。自頂向下方式指通過一個WSDL文件來創建Web Service;自底向上是從Java類出發創建Web Service。兩種開發過程最終形成的文件包括:
- SEI(對應WSDL中的一個Web Service port,在Java中表現爲一個接口);
- SEI實現類;
- WSDL和XSD文件;
從Java開始的開發步驟:
- 聲明某個類爲@WebService,即將它聲明爲SEI實現類,然後對需要暴露的方法標註爲@WebMethod;
- 運行wsgen命令生成其他所需文件;
- 發佈Web Service;
SEI實現類
最簡單的SEI實現類:
- package net.oseye;
- import javax.jws.WebMethod;
- import javax.jws.WebService;
- @WebService
- public class Hello {
- @WebMethod
- public String SayHello(String name){
- return String.format("Hello,%s",name);
- }
- }
使用wsgen命令生成所需文件
- 進入JAX-WS-Java-Server項目目錄如:
- D:\MyTemp\workspace\JAX-WS-Java-Server>
- 執行wsgen命令:
- wsgen -cp ./bin -r ./wsdl -s ./src -d ./bin -wsdl net.oseye.Hello
- 執行中可能出現“directory not found: wsdl”,手動建立wsdl目錄。
- 成功後可在bin、src目錄的命名空間net.oseye裏看到生成的jaxws文件夾,以及在wsdl目錄中的HelloService.wsdl和HelloService_schema1.xsd。
此時的目錄結構如下:
發佈Web Service
在應用程序中發佈,JDK停工非常方便的API:Enndpoint.publish
- package net.oseye;
- import javax.xml.ws.Endpoint;
- public class Main {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Endpoint.publish("http://localhost:8808/HelloService", new Hello());
- }
- }
wsgen工具簡介
wsgen 是在JDK的bin目錄下的一個exe文件(Windows版),該命 令的主要功能是用來生成合適的JAX-WS。它讀取Web Service的終端類文件,同時生成所有用於發佈Web Service所依賴的源代碼文件和經過編譯過的二進制類文件。這裏要特別說明的是,通常在Web Service Bean中用到的異常類會另外生成一個描述Bean,如果Web Service Bean中的方法有申明拋出異常,這一步是必需的,否則服務器無法綁定該對像。此外,wsgen 還能輔助生成WSDL和相關的xsd文件。wsgen 從資源文件生成一個完整的操作列表並驗證web service是否合法,可以完整發布。
命令參數說明:
- -cp 定義classpath
- -r 生成 bean的wsdl文件的存放目錄
- -s 生成發佈Web Service的源代碼文件的存放目錄(如果方法有拋出異常,則會生成該異常的描述類源文件)
- -d 生成發佈Web Service的編譯過的二進制類文件的存放目錄(該異常的描述類的class文件)
客戶端開發的通常過程是從已有的WSDL處罰,創建輔助類JAXB對象和Service代理類,然後基於這些類開發自己的客戶端應用。
開發步驟:
- 創建eclipse項目;
- 運行wsimport命令生成客戶端代碼;
- 通過代理調用服務;
創建Ecplise項目
使用Eclipse創建客戶端項目JAX-WS-Client,目錄結構如下:
運行wsimport工具
使用上篇博文創建的Web Service地址,命令行進入JAX-WS-Client項目目錄,運行:
- wsimport -d ./bin -s ./src http://localhost:8808/HelloService?wsdl
通過代理調用服務
- package net.oseye;
- public class Main {
- /**
- * @param args
- */
- public static void main(String[] args) {
- HelloService helloService=new HelloService();
- String helloStr=helloService.getHelloPort().sayHello("oseye");
- System.out.println(helloStr);
- }
- }
wsimport簡介
wsimport也是在JDK的bin目錄下的一個exe文件(Windows版),主要功能是根據服務端發佈的wsdl文件生成客戶端存根及框架,負責 與Web Service 服務器通信,並在將其封裝成實例,客戶端可以直接使用,就像使用本地實例一樣。對Java而言,wsimport幫助程序員生存調用web service所需要的客戶端類文件.java和.class。要提醒指出的是,wsimport可以用於非Java的服務器端,如:服務器端也許是C# 編寫的web service,通過wsimport則生成Java的客戶端實現。
命令參數說明:
- -d 生成客戶端執行類的class文件的存放目錄
- -s 生成客戶端執行類的源文件的存放目錄
- -p 定義生成類的包名