很有必要钻研下Java6的Web服务的发布方式。
从前面两篇文章可以看出Java6对WebService的发布提供了API级别的直接支持,发布只需要一行代码就搞定了。但是作为一个服务,就需要启动,总不能每次启动都去运行一个Main方法来启动吧。
实际中Web服务的发布常常伴随着Web容器的启动而发布,而在Java6中,我们没法直接像Axis2和XFire那样直接去发布,但是可以通过变通的方法,通过Servlet来和容器绑定起来,在容器启动的时候发布服务。
下面以Tomcat6下 来实现Java6 Web服务的发布。
文件目录:
1. 开发WebService服务
package com.soa.getUserSer.service; import javax.jws.WebService; @WebService public class GetUserSer { /** * 服务的方法:获取用户信息 * @param name * @return */ public String getUser(String name){ String users="当前用户是:"+name; return users; } }
2. 开发发布服务的Servlet,为了通用性,最好选择GenericServlet来继承
package com.servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.xml.ws.Endpoint;
import com.soa.getUserSer.service.GetUserSer;
public class GetUserServlet extends GenericServlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
System.out.println("准备发布webService 服务:http://192.168.8.121:8092/soa/service.getUserSer");
//发布服务
Endpoint.publish("http://192.168.8.121:8092/soa/service.getUserSer", new GetUserSer());
System.out.println("服务发布成功:http://192.168.8.121:8092/soa/service.getUserSer");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
System.out.println("此Servlet不处理任何业务逻辑,仅仅yonglai发布一个Web服务:http://192.168.8.121:8092/soa/service.getUserSer");
}
}
这里将服务发布的代码写在了Servlet的init()方法中,当Servlet加载时候,会自动执行init()里面的方法。从而达到发布服务的目的,由于此Servlet不处理任何业务,因此,在Service里面仅仅写了一个提示性的语句。
3. 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>GetUserServlet</servlet-name>
<servlet-class>com.servlet.GetUserServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>GetUserServlet</servlet-name>
<url-pattern>/servlet/GetUserServlet</url-pattern>
</servlet-mapping>
</web-app>
注意,上面的Servlet比一般Servlet配置多了一行:
<load-on-startup>1</load-on-startup>
,这样写的目的是Servlet能伴随容易的启动在第一时间加载。以便服务能尽可能早的发布,否则,只有在第一次请求该Servlet的时候,才会被加载到容器。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <html> <head> <base href="<%=basePath%>"> <title>webservice获取用户地址</title> </head> <body> This is my JSP page. <br> <a href="http://192.168.8.121:8092/soa/service.getUserSer?wsdl">SOA获取用户信息WSDL地址<a> </body> </html>地址发布:
![](https://i-blog.csdnimg.cn/blog_migrate/71e4b12c4e8d30d896a872ff65c14992.png)
接口发布后的wsdl地址
可见,服务伴随着tomcat的启动发布成功。