前言:
雖然構建本地的jax-ws的webservice很簡單,但要部署到tomcat上要繞過點彎。
tomcat本身和jdk都沒有jaw-ws的API,所以部署的時候需要額外做點事情,有兩種選擇
1、下載必要的jar庫,JAX-WS RI,地址:https://jax-ws.java.net/
2、使用其他服務器,比如TomEE(tomcat的加強版)等。(未測試),可以參考:
Step by Step JAX-WS Web Services with Eclipse, TomEE, and Apache CXF
因為平時用tomcat比較多,就用第一種方式。
一、准備工作
下載jax-ws RI。
配置:根據文檔,
To install on Tomcat
-
Set
CATALINA_HOMEto your Tomcat installation. -
Run
ant installThis essentially copies
lib/*.jarfrom the root of JAX-WS RI extracted bundle to$CATALINA_HOME/shared/lib
為了安全,還是把tomcat目錄下的share/lib中的jar包復制到tomcat_home/lib下。
二、創建一個動態web project
2.1 創建工程
如下:

wsdl目錄是自己建的。
2.2 寫一個Hello的web service
package org.ccnt.jax.web.server; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public class Hello { @WebMethod public String say(String name) { return "hello, " + name; } }
注意:
@WebService
注釋在了Class之上,這告訴了JAXWS,此類為Webservice。
@WebMethod
注釋在了public方法上,這告訴了JAXWS,此方法為soap方法,該方法有兩個參數,一個input的String,一個output的String。
業務邏輯很簡單,客戶端調用傳入一個Name,服務端返回給客戶端一個”Hello: “+name的字串。
現在我們通過Java文件來生成Webservice相關布署文件以及調用接口。
2.3 用wsgen生成相應的類和wsdl文件
命令:
wsgen -cp ./build/classes -s ./src -r ./wsdl -d ./build/classes -wsdl org.ccnt.jax.web.server.Hello
生成一下目錄:

JAX-WS 2.0 有兩種開發過程:自頂向下和自底向上。自頂向下方式指通過一個 WSDL 文件來創建Web Service,自底向上是從 Java 類出發創建 Web Service。兩種開發過程最終形成的文件包括:
1.SEI。一個SEI對應WSDL中WebService的一個port,在Java中是一個Java接口。
2.SEI實現類。
3.WSDL和XSD文件。
結合公司內項目的特點,我們更多的是碰到以下兩種情況:
1. Onsite要我們做一個Webservice或者是客戶要求我們提供Webservice接口;
2. Onsite已經有一個Webservice了,現在要我們做客戶端集成。
2.4 配置文件,編寫sun-jaxws.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>
<endpoint name='Hello' implementation='org.ccnt.jax.web.server.Hello' url-pattern='/HelloService' />
</endpoints>
把Hello聲明為webservice
2.5 配置文件,修改web.xml文件
添加上:
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/HelloService</url-pattern>
</servlet-mapping>
三、部署
在Eclipse里面直接運行tomcat服務器,就把Hello webservice部署上了。
http://localhost:8080/JaxwsWebServer/HelloService

表面已經部署上了
四、客戶端調用
新建一個工程,到工程目錄下,命令:
wsimport -s ./src -d ./bin -p org.ccnt.jax.web.client http://localhost:8080/JaxwsWebServer/HelloService?wsdl
在org.ccnt.jax.web.client目錄下能看到幾個生成的文件,創建ClientMain來調用服務
package org.ccnt.jax.web.client; public class ClientMain { public static void main(String[] args) { HelloService service = new HelloService(); String response = service.getHelloPort().say("loull"); System.out.println(response); } }
五、總結下過程
- Create a web service (of course).
- Create a sun-jaxws.xml, defines web service implementation class.
- Create a standard web.xml, defines
WSServletContextListener,WSServletand structure of a web project. - Build tool to generate WAR file.
- Copy JAX-WS dependencies to “${Tomcat}/lib” folder.
- Copy WAR to “${Tomcat}/webapp” folder.
- Start It.
我在開發web項目的webservice的時候,步驟是:
1、create a web service
2、用wsgen工具生成wsdl、java、class文件,class文件可以交給Eclipse自動生成
wsgen -cp ./build/classes -r ./wsdl -s ./src -d ./build/classes -wsdl org.ccnt.jax.server.SampleService
3、編寫或修改sun-jaxws.xml文件,加上:
<endpoint name='MTOMSimple' implementation='org.ccnt.jax.web.server.HelloSimple' url-pattern='/HelloSimpleService' />
4、修改web.xml文件,加上:
<servlet> <servlet-name>HelloSimple</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloSimple</servlet-name> <url-pattern>/HelloSimpleService</url-pattern> </servlet-mapping>
5、部署,啟動
