JAX-WS 構建簡單webservice部署到tomcat上
前言:
雖然構建本地的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_HOME to your Tomcat installation.
Run
ant install
This essentially copies lib/*.jar from 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文件。
結合公司內項目的特點,我們更多的是碰到以下兩種情況:
-
Onsite要我們做一個Webservice或者是客戶要求我們提供Webservice接口;
-
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, WSServlet and structure of a web project.
Build tool to generate WAR file.
Copy JAX-WS dependencies 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、部署,啓動