天天看点

使用JAX-WS开发简单webservice

     webservice的技术有很多,现在流行的有JAX-WS、XFile、CXF、Axis1、Axis2等。不过JAX-WS是webservice技术最轻量级的,不需要引入额外jar包。

 在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI(service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。

 在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。当然 JAX-WS 也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatch 直接使用SOAP消息或XML消息发送请求或者使用Provider处理SOAP或XML消息。

 我们使用JAX-WS开发WebService只需要很简单的几个步骤:写接口和实现=>发布=>生成客户端。

 开发webservice服务端我们可以先编写接口,接口中只需要把类注明为@WebService,把要暴露给客户端的方法注明为@WebMethod即可。

 1:编写webservice服务端接口 

package service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

/**
 * 测试webservice接口
 * @author 
 *
 */
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface TestService {
	
	/**
	 * 测试接口
	 */
	@WebMethod
    void SayHiDefault();
	
	@WebMethod
    void SayHi(@WebParam(name = "name") String name);
	
	@WebMethod
	String sayHello(String userName);

}
           

 2:编写接口的实现类

package service.imp;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

import service.TestService;

@WebService(endpointInterface = "service.TestService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class TestServiceImp implements TestService {

	@Override
	public void SayHiDefault() {
		System.out.println("Hi,wangql!");
	}

	@Override
	public void SayHi(String name) {
		System.out.println("Hi,"+name+"!");
	}

	@WebMethod
	public String sayHello(@WebParam(name = "userName") String userName) {
		return "hi," + userName + " welcome to wangql";
	}

}
           

 3:发布

 方法一:(此方式只能作为调试,有以下BUG:jdk1.6u17?以下编译器不支持以Endpoint.publish方式发布document方式的soap,必须在service接口和实现类添加“@SOAPBinding(style = SOAPBinding.Style.RPC)”注解)

package main;

import javax.xml.ws.Endpoint;

import service.TestService;
import service.imp.TestServiceImp;


public class ServerStart {
	
	public static void main(String[] args) {
		System.out.println("start publish jax-ws ...");
		TestService service = new TestServiceImp();
		Endpoint.publish("http://localhost:8080/jaxwsTest/TestService", service);
		System.out.println("publish webservice successful");
	}

}
           

 方法二:(基于web服务器Servlet方式,使用tomcat发布)

 以Tomcat为例,首先编写sun-jaxws.xml文件并放到WEB-INF下:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint name="TestService"
        implementation="service.imp.TestServiceImp"
        url-pattern="/service/test" />
</endpoints>
           

 然后编辑web.xml,添加listener和servlet(url-pattern要保持一致):

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	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_3_0.xsd">
  <display-name></display-name>	
  
  <listener>  
        <listener-class>
            com.sun.xml.ws.transport.http.servlet.WSServletContextListener  
        </listener-class>
  </listener>
  <servlet>
        <servlet-name>TestService</servlet-name>  
        <servlet-class>
            com.sun.xml.ws.transport.http.servlet.WSServlet  
        </servlet-class>
  </servlet>  
  <servlet-mapping>  
        <servlet-name>TestService</servlet-name>  
        <url-pattern>/service/test</url-pattern>  
  </servlet-mapping>
  
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
           

 完成之后启动tomcat,访问http://localhost:8080/jaxwsTest/service/test?wsdl

使用JAX-WS开发简单webservice

 成功访问wsdl文件,服务端可以正常运行。

 注:@SOAPBinding(style = SOAPBinding.Style.RPC)一定要加上

 http://www.micmiu.com/soa/webservice/jdk6-webservice-doc-rpc/ 可以看一下这篇文章,我再研究一下这个东西。

 3:生成webservice客户端

 方法一:使用jdk自带工具wsimport生成客户端

 一般情况下直接输入wsimport命令行直接生成客户端,因为我是用java开发的,所以我是先在MyEclipse上创建一个webservice项目,然后在通过wsimport命令生成客户端,这样可以尽量避免因为编写造成的不必要麻烦。

 (1)在Eclipse或者MyEclipse上创建一个webservice项目

使用JAX-WS开发简单webservice

 (2)我们先访问到项目的src目录下,然后执行"wsimport -keep http://localhost:8080/jaxwsTest/TestService?wsdl"生成客户端代码。

  注:我们访问的http://localhost:8080/jaxwsTest/TestService?wsdl是wsdl文件的路径

使用JAX-WS开发简单webservice

 我们查看我们的项目,如图

使用JAX-WS开发简单webservice

 这样就自动生成webservice客户端了。

 我们在客户端编写测试代码

package main;

import service.imp.TestServiceImpService;


public class WSClient {
	
	public static void main(String[] args) {
		TestServiceImpService test = new TestServiceImpService();
		String name = test.getTestServiceImpPort().sayHello("123213");
		System.out.println(name);
	}

}
           

 如图调用成功

 方法二:使用MyEclipse创建webservice Client

 在webservice服务端工程中 右击 new----> other ---->web service client创建客户端

使用JAX-WS开发简单webservice

 在WSDL URL添加地址就可以了

使用JAX-WS开发简单webservice

 如果出错检查自己的地址和tomcat服务是否已开启

 方法三:自己创建webservice客户端,因为webservice可以跨平台,我们可以用任何语言编写客户端,所以自己编写客户端是最好的选择。

继续阅读