JAX-WS使用wsgen和wsimport從Java創建WebService

概念

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。兩種開發過程最終形成的文件包括:

  1. SEI(對應WSDL中的一個Web Service port,在Java中表現爲一個接口);
  2. SEI實現類;
  3. WSDL和XSD文件;

從Java開始的開發步驟:

  1. 聲明某個類爲@WebService,即將它聲明爲SEI實現類,然後對需要暴露的方法標註爲@WebMethod;
  2. 運行wsgen命令生成其他所需文件;
  3. 發佈Web Service;

SEI實現類

最簡單的SEI實現類:

  1. package net.oseye;
  2.  
  3. import javax.jws.WebMethod;
  4. import javax.jws.WebService;
  5.  
  6. @WebService
  7. public class Hello {
  8. @WebMethod
  9. public String SayHello(String name){
  10. return String.format("Hello,%s",name);
  11. }
  12. }
此時的目錄結構如下:

使用wsgen命令生成所需文件

  1. 進入JAX-WS-Java-Server項目目錄如:
    1. D:\MyTemp\workspace\JAX-WS-Java-Server>
  2. 執行wsgen命令:
    1. wsgen -cp ./bin -r ./wsdl -s ./src -d ./bin -wsdl net.oseye.Hello
  3. 執行中可能出現“directory not found: wsdl”,手動建立wsdl目錄。
  4. 成功後可在bin、src目錄的命名空間net.oseye裏看到生成的jaxws文件夾,以及在wsdl目錄中的HelloService.wsdl和HelloService_schema1.xsd。

此時的目錄結構如下:


發佈Web Service

在應用程序中發佈,JDK停工非常方便的API:Enndpoint.publish

  1. package net.oseye;
  2.  
  3. import javax.xml.ws.Endpoint;
  4.  
  5. public class Main {
  6.  
  7. /**
  8. * @param args
  9. */
  10. public static void main(String[] args) {
  11. Endpoint.publish("http://localhost:8808/HelloService", new Hello());
  12. }
  13.  
  14. }
運行應用程序,地址欄輸入:http://localhost:8808/HelloService,接客預覽:

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代理類,然後基於這些類開發自己的客戶端應用。

開發步驟:

  1. 創建eclipse項目;
  2. 運行wsimport命令生成客戶端代碼;
  3. 通過代理調用服務;

創建Ecplise項目

使用Eclipse創建客戶端項目JAX-WS-Client,目錄結構如下:

運行wsimport工具

使用上篇博文創建的Web Service地址,命令行進入JAX-WS-Client項目目錄,運行:

  1. wsimport -d ./bin -s ./src http://localhost:8808/HelloService?wsdl
此時的目錄結構如下:

通過代理調用服務


  1. package net.oseye;
  2.  
  3. public class Main {
  4.  
  5. /**
  6. * @param args
  7. */
  8. public static void main(String[] args) {
  9. HelloService helloService=new HelloService();
  10. String helloStr=helloService.getHelloPort().sayHello("oseye");
  11. System.out.println(helloStr);
  12. }
  13. }

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 定義生成類的包名
發佈了15 篇原創文章 · 獲贊 9 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章