WebService 的发布通过调用
Endpoint.publish()
方法来启动一个java内嵌的WEB容器来实现的,如果要将WebService部署到一个WEB容器中去,需要使用jax-ws提供的jar包,演示项目中使用的是最新的jax-ws的jar
https://jax-ws.java.net/2.2.10/ 可以在此进行下载。
实现方式:
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 文件
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <!--name:service 名称 implementation:服务的实现类-->
<endpoint name="calculator" implementation="com.st.services.CalculatorService" url-pattern="/service/calculator" /> <endpoint name="fileService" implementation="com.st.services.FileService" url-pattern="/service/fileService" /> </endpoints>
web.xml 文件
<listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletContextListener </listener-class> </listener> <servlet> <servlet-name>webService</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>webService</servlet-name> <url-pattern>/service/*</url-pattern> </servlet-mapping>
按照上面的流程图就可以很清楚的理解了:
在初始化期间,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
- mimepull.jar (处理文件的时候需要使用到)
启动服务器,便可通过浏览器去访问 http://localhost:8080/jaxws/service/calculator (我使用的是Tomcat服务器,端口8080,系统名称为jaxws)
参考:http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/