Java6开发WebService应用--发布(3)



 很有必要钻研下Java6的Web服务的发布方式。

从前面两篇文章可以看出Java6对WebService的发布提供了API级别的直接支持,发布只需要一行代码就搞定了。但是作为一个服务,就需要启动,总不能每次启动都去运行一个Main方法来启动吧。

实际中Web服务的发布常常伴随着Web容器的启动而发布,而在Java6中,我们没法直接像Axis2和XFire那样直接去发布,但是可以通过变通的方法,通过Servlet来和容器绑定起来,在容器启动的时候发布服务。

下面以Tomcat6下 来实现Java6 Web服务的发布。

文件目录:
Java6开发WebService应用--发布(3)_第1张图片
 

 

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的时候,才会被加载到容器。

4、部署、启动并测试
<%@ 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>
 地址发布:
Java6开发WebService应用--发布(3)_第2张图片 

 

 接口发布后的wsdl地址
Java6开发WebService应用--发布(3)_第3张图片
 

 可见,服务伴随着tomcat的启动发布成功。

 
5、总结
1)、Java6的服务发布的总体思想是通过Java6 API的调用达到发布的目的,截止目前,已经看到两种发布方式,一种是直接调用API:
Endpoint.publish( "http://192.168.14.117:8888/java6ws/Java6WS", new Java6WS());
另一种是,本例中Servlet方式。
2)、Endpoint.publish是一个后台线程,一旦发布了就会一直等待处理Web服务的请求,只有当main方法退出,或者容器关闭的时候,才自动退出。
3)、其实除了这种方式,也可以整合Spring来实现服务的发布,这就和Spring的Ioc容器整合在一起了。不管什么,道理就一个,调用Endpoint.publish()方法来实现服务的发布。
4)、在发布服务的时候,应该避免使用Tomcat容器的端口,一面发生冲突,在本文中,Tomcat使用的端口是8080,而Web服务发布使用的端口是8888。

你可能感兴趣的:(webservice)