当前位置: 代码迷 >> Web前端 >> JAX-WS 学习4:部署到Web容器里
  详细解决方案

JAX-WS 学习4:部署到Web容器里

热度:375   发布时间:2012-11-04 10:42:41.0
JAX-WS 学习四:部署到Web容器里

在之前的介绍里,web service的发布都是通过调用:

Java代码 复制代码?收藏代码
  1. Endpoint.publish()??

方法来启动一个java内嵌的web容器来实现的。

?

这里要介绍一下怎么把生成的web service部署到一个web容器中去。

?

还是以之前的计算器的例子为例。首先我们用wsgen工具去生成部署所需要的所有部件:

?

Java代码 复制代码?收藏代码
  1. wsgen?-wsdl?-keep?-d?../output?-cp?.?test.CalculatorImpl???

运行此命令时,我得到了一个错误信息:

Java代码 复制代码?收藏代码
  1. 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,整个过程的流程图大约为:

?

sun-jaxws.xml文件的schema可以在下载的jax-ws RI的docs目录下找着(sun-jaxws.xsd)。

?

这里直接给出calculator的web.xml和sun-jaxws.xml的一个实现:

?

Sun-jaxws.xml代码 复制代码?收藏代码
  1. <?xml?version="1.0"?encoding="UTF-8"?> ??
  2. <endpoints?xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"??
  3. ????version="2.0"> ??
  4. ????<endpoint?name="calculator"?implementation="test.CalculatorImpl"??
  5. ????????url-pattern="/calculator"?/> ??
  6. </endpoints>???

?

Web.xml代码 复制代码?收藏代码
  1. <?xml?version="1.0"?encoding="UTF-8"?> ??
  2. <!DOCTYPE?web-app?PUBLIC?"-//Sun?Microsystems,? ??
  3. Inc.//DTD?Web?Application?2.3//EN" ??
  4. "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd"> ??
  5. ? ??
  6. <web-app> ??
  7. ????<listener> ??
  8. ????????<listener-class> ??
  9. ????????????????com.sun.xml.ws.transport.http.servlet.WSServletContextListener ??
  10. ????????</listener-class> ??
  11. ????</listener> ??
  12. ????<servlet> ??
  13. ????????<servlet-name>calculator</servlet-name> ??
  14. ????????<servlet-class> ??
  15. ????????????com.sun.xml.ws.transport.http.servlet.WSServlet ??
  16. ????????</servlet-class> ??
  17. ????????<load-on-startup>1</load-on-startup> ??
  18. ????</servlet> ??
  19. ????<servlet-mapping> ??
  20. ????????<servlet-name>calculator</servlet-name> ??
  21. ????????<url-pattern>/calculator</url-pattern> ??
  22. ????</servlet-mapping> ??
  23. ????<session-config> ??
  24. ????????<session-timeout>120</session-timeout> ??
  25. ????</session-config> ??
  26. </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/

  相关解决方案