在之前的介紹裡,web service的釋出都是通過調用:
Endpoint.publish()
方法來啟動一個java内嵌的web容器來實作的。
這裡要介紹一下怎麼把生成的web service部署到一個web容器中去。
還是以之前的電腦的例子為例。首先我們用wsgen工具去生成部署所需要的所有部件:
wsgen -wsdl -keep -d ../output -cp . test.CalculatorImpl
運作此指令時,我得到了一個錯誤資訊:
The @javax.jws.WebService.name element cannot be used in with @javax.jws.WebService.endpointInterface element
意思是 name 屬性和 endpointInterface 屬性不能同時出現,隻好把CalculatorImpl裡的name屬性先删除,回頭查一下為什麼會有這個錯誤。
運作完上面指令行後,我們就得到一些新檔案:
- CalculatorImplService.wsdl
- CalculatorImplService_schema1.xsd
- Add.java
- AddResponse.java
- Multi.java
- MultiResponse.java
把他們拷到工程裡去先,其中:
- 所有的java檔案和到源碼裡去
- 建立一個wsdl目錄,把wsdl檔案和xsd檔案放到此目錄中去。
剩下的就是怎麼提供一個web.xml了,使得對url的通路能被我們的web service實作類處理請求了。
下載下傳:
以前一直都是基于JDK自帶的api來實作的,下面就需要用到一些jax-ws提供的lib包了。是以需要先去下一份jax-ws的實作,例如我目前使用的2.2.5的下載下傳位址是:
http://jax-ws.java.net/2.2.5/
實作方式:
sun的jax-ws實作提供了兩個類用來配置web容器的web.xml,實作從url到web service實作類的映射:
- 監聽類:com.sun.xml.ws.transport.http.servlet.WSServletContextListener
- Servlet: com.sun.xml.ws.transport.http.servlet.WSServlet
其中WSServletContextListener又會去查找和web.xml在同一級目錄下的另一個檔案sun-jaxws.xml,整個過程的流程圖大約為:
sun-jaxws.xml檔案的schema可以在下載下傳的jax-ws RI的docs目錄下找着(sun-jaxws.xsd)。
這裡直接給出calculator的web.xml和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="calculator" implementation="test.CalculatorImpl"
url-pattern="/calculator" />
</endpoints>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,
Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>calculator</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>calculator</servlet-name>
<url-pattern>/calculator</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>120</session-timeout>
</session-config>
</web-app>
按照上面的流程圖就可以很清楚的了解了:
在初始化期間,WSServletContextListener會讀取WEB-INF目錄下的 sun-jaxws.xml和web.xml,将web service的實作類與某個url進行綁定,這個綁定是通過一個WSServlet類間接進行的。每次來一個請求後,WSServletContextListener就會進行攔截,根據請求的url,找到對應的web service的實作,調用其他方法。
依賴包
很顯然,諸如 WSServletContextListener 和 WSServlet 類并不是java預設自帶的。這些類在下載下傳的jax-ws RI的lib目錄下的jar裡,是以要想真正成功的運作這些web service,我們也需要把必需的依賴包加上,它們包括:
- gmbal-api-only.jar
- ha-api.jar
- jaxb-impl.jar
- jaxws-api.jar
- jaxws-rt.jar
- management-api.jar
- policy.jar
- stax-ex.jar
- streambuffer.jar
打包
打包就不具體介紹了,總之包的結構如下:
參考:http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/