天天看點

JAX-WS 學習四:部署到Web容器裡

在之前的介紹裡,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

把他們拷到工程裡去先,其中:

  1. 所有的java檔案和到源碼裡去
  2. 建立一個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,整個過程的流程圖大約為:

JAX-WS 學習四:部署到Web容器裡

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

打包

打包就不具體介紹了,總之包的結構如下:

JAX-WS 學習四:部署到Web容器裡

參考:http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/