Web工程集成JAX-WS的Web Service

 首先, 为了我们这个WS的实验能够顺利的完成,最好能到官网上下载到JAX-WS工具的完整版。下载到的是一个jar文件,需要在Windows命令行下运行jar命令解压安装的,比如我这边有个JAXWS2.1.1_20070501.jar。安装后得到一个目录,其中有个lib下有许多jar文件。bin目录下有几个命令,很有用的,如wsgen和wsimport等,当然,我提过,这两个命令在JDK6中已经有的了。

     现在开始做实验了。

    服务端

    1、新建web项目,将来准备发布到tomcat的。我这里新建的Web项目名为myWS2,目录所在:D:\workspace\myWS2,在这个项目根目录下新建一个文件夹wsdl

    2、为了方便,先导入这些个包吧:jaxws-rt.jar,jaxb-api.jar,jaxb-impl.jar,jaxb-xjc.jar,streambuffer.jar,stax-ex.jar,这些jar包只是运行下面的最简单的实验需要的jar包,实际操作中,如果你需要更多的jar包也是很正常的,这些jar包都是来自JAX-WS。

    3、在Web工程中新建类:

  1. package leon.ws;  
  2.   
  3. import javax.jws.WebService;  
  4.   
  5. @WebService  
  6. public class Hello {  
  7.     public String sayHello(String name) {  
  8.         return ("Welcome, I am Server. Hello, " + name);  
  9.     }  
  10.   
  11.     public int sum(int a, int b) {  
  12.         return a + b;  
  13.     }  
  14. }  
package leon.ws;

import javax.jws.WebService;

@WebService
public class Hello {
	public String sayHello(String name) {
		return ("Welcome, I am Server. Hello, " + name);
	}

	public int sum(int a, int b) {
		return a + b;
	}
}

    OK,非常简单,只有一个@WebService注解,类中的两个方法都没有使用@WebMethod注解,这样其实两个方法都会成为Web Service方法的。

   4、很重要的一步,就是要利用wsgen工具来生成wsdl和服务端辅助类了。打开DOS命令行,进入到服务端web工程的根目录,运行一下命令:

        wsgen -cp D:\workspace\myWS2\WebRoot\WEB-INF\classes leon.ws.Hello -wsdl -s src -r wsdl

       注意:这里的路径非常重要的,如果你的路径不一样一定要改对了。wsgen命令使用的是JDK6里面的,所以要配置好JDK环境变量,如果你用的JDK版本低,没有这工具,需要将下载安装的JAX-WS的bin下面的工具配置到环境变量path下。

      运行成功以后,刷新一下web工程目录下wsdl目录,可以看到两个文件了,一个xsd和一个wsdl,刷新一下src看到产生了jaxws包和4个类,也就是上面的Hello.java中,每个方法对应生成两个类。

   5、在WEB-INF下新建一个sun-jaxws.xml,内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">  
  3.   
  4.   <endpoint name="Hello" implementation="leon.ws.Hello" url-pattern="/HelloService" />  
  5.     
  6. </endpoints>  
<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">

  <endpoint name="Hello" implementation="leon.ws.Hello" url-pattern="/HelloService" />
  
</endpoints>

     这是定义WS的Endpoint的,实现类与上面定义的Hello.java对应好,两外两个属性name, url-pattern自己定义吧,不过最好合理一点。

 6、修改web.xml配置一个监听器,和一个Servlet将我们的Hello.java及其方法绑定成为Servlet,内容如下:

    

  1. <listener>  
  2.     <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>  
  3. </listener>  
  4.   
  5. <servlet>  
  6.     <servlet-name>Hello</servlet-name>  
  7.     <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>  
  8.     <load-on-startup>2</load-on-startup>  
  9. </servlet>  
  10.       
  11. <servlet-mapping>  
  12.     <servlet-name>Hello</servlet-name>  
  13.     <url-pattern>/HelloService</url-pattern>  
  14. </servlet-mapping>  
<listener>
	<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>

<servlet>
	<servlet-name>Hello</servlet-name>
	<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
	<load-on-startup>2</load-on-startup>
</servlet>
	
<servlet-mapping>
	<servlet-name>Hello</servlet-name>
	<url-pattern>/HelloService</url-pattern>
</servlet-mapping>

现在工程的目录结构如下:

发布到tomcat,运行,这个服务端Web工程会被tomcat加载。

tomcat启动成功后。浏览器访问:http://10.225.112.86:8888/myWS2/HelloService?wsdl

如果浏览器呈现出wsdl文件内容,就表示发布成功了。服务端完成。

另一种rpc风格:

 

 Web Service技术,无疑会越来越被广泛应用的,可以非常好的实现异构应用程序之间的相互通信。JAX-WS是SUN推出的一种实现Web Service的工具。下面是我学习用JAX-WS实现的一个很简单Web Service例子。

服务端:

新建Java Project

1、 创建服务接口Endpoint

  1. package leon.rpcws.iface;  
  2.   
  3. import javax.jws.WebMethod;  
  4. import javax.jws.WebService;  
  5. import javax.jws.soap.SOAPBinding;  
  6. import javax.jws.soap.SOAPBinding.Style;  
  7.    
  8. @WebService  
  9. @SOAPBinding(style = Style.RPC)  
  10. public interface IHello{  
  11.    
  12.     @WebMethod   
  13.     String sayHello(String name);  
  14. }  
package leon.rpcws.iface;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
 
@WebService
@SOAPBinding(style = Style.RPC)
public interface IHello{
 
	@WebMethod 
	String sayHello(String name);
}

2、 接口的实现类

  1. package leon.rpcws.impl;  
  2.   
  3. import javax.jws.WebService;  
  4. import leon.rpcws.iface.IHello;  
  5.   
  6. @WebService(endpointInterface = "leon.rpcws.iface.IHello")  
  7. public class HelloImpl implements IHello {  
  8.   
  9.     @Override  
  10.     public String sayHello(String name) {  
  11.         return "Hello JAX-WS. Welcome, "+name;  
  12.     }  
  13. }  
package leon.rpcws.impl;

import javax.jws.WebService;
import leon.rpcws.iface.IHello;

@WebService(endpointInterface = "leon.rpcws.iface.IHello")
public class HelloImpl implements IHello {

	@Override
	public String sayHello(String name) {
		return "Hello JAX-WS. Welcome, "+name;
	}
}

3、发布

  1. package leon.rpcws;  
  2.   
  3. import javax.xml.ws.Endpoint;  
  4.   
  5. import leon.rpcws.impl.HelloImpl;  
  6.   
  7. public class HelloPublisher {  
  8.     public static void main(String[] args) {  
  9.         Endpoint.publish("http://10.225.112.86:9999/ws/hello", new HelloImpl());  
  10.         System.out.println("published.");  
  11.     }  
  12. }  
package leon.rpcws;

import javax.xml.ws.Endpoint;

import leon.rpcws.impl.HelloImpl;

public class HelloPublisher {
	public static void main(String[] args) {
		Endpoint.publish("http://10.225.112.86:9999/ws/hello", new HelloImpl());
		System.out.println("published.");
	}
}

以上3个类,就可以完成一个很简单的Web Service服务端的创建和发布。运行HelloPublisher,console打印出published.同时红色方块亮起,表示发布成功。

打开浏览器,访问:http://10.225.112.86:9999/ws/hello?wsdl 可以查看到发布的wsdl文件:


OK,服务端发布成功。

客户端:

再新建一个Java Project作为客户端

1、 将服务端的IHello接口打成jar包,提供给客户端工程,本实验中,我为了方便,在客户端创建了包和接口名完全一样的IHello接口。

2、 创建客户端调用类

  1. package rpctest;  
  2.   
  3. import java.net.URL;  
  4.   
  5. import javax.xml.namespace.QName;  
  6. import javax.xml.ws.Service;  
  7. import leon.rpcws.iface.IHello;  
  8.   
  9. public class TestRPC {  
  10.     public static void main(String[] args) throws Exception {  
  11.         //1: argument service URI, refer to wsdl document above  
  12.         //2: argument is service name, refer to wsdl document above  
  13.   
  14.         URL url = new URL("http://10.225.112.86:9999/ws/hello?wsdl");  
  15.         QName qname = new QName("http://impl.rpcws.leon/", "HelloImplService");  
  16.         Service service = Service.create(url, qname);  
  17.         IHello hello = service.getPort(IHello.class);  
  18.    
  19.         System.out.println(hello.sayHello("Leon Su"));  
  20.     }  
  21. }  
package rpctest;

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import leon.rpcws.iface.IHello;

public class TestRPC {
	public static void main(String[] args) throws Exception {
		//1: argument service URI, refer to wsdl document above
		//2: argument is service name, refer to wsdl document above

		URL url = new URL("http://10.225.112.86:9999/ws/hello?wsdl");
        QName qname = new QName("http://impl.rpcws.leon/", "HelloImplService");
        Service service = Service.create(url, qname);
        IHello hello = service.getPort(IHello.class);
 
        System.out.println(hello.sayHello("Leon Su"));
	}
}

控制台正确的打印出:Hello JAX-WS. Welcome, Leon Su 表示成功了。

另外在JDK6中集成了两个工具wsgen和import,在JDK根目录\bin下可以查看到的,这是两个很有用的工具,可以大大提高开发效率的。下面我们使用wsimport在客户端生成辅助类来调用服务端的Web Service。

1、新建一个Java Project以后,是一个“空的”的工程,什么都没有,我们也不需要服务端给我们提供SEI(Service Endpoint Interface),服务端只需要知道怎么能访问到wsdl文件就可以啦。事实上,WS从理论上也是的,客户端只需要得到服务端的wsdl文件,就足够调用服务端的WS了。

  客户端访问服务端的wsdl地址:http://10.225.112.86:9999/ws/hello?wsdl

2、打开Windows的DOS命令行,进入客户端的根目录,然后运行一下命令:

       wsimport -keep http://10.225.112.86:9999/ws/hello?wsdl 

    成功执行后,发现他给我们在客户端工程根目录下创建了一个leon\rpcws\impl目录,而且生成了两个类:HelloImplService.java和IHello.java,将这两个类源文件剪切到客户端工程的源文件目录下(默认src),注意要带包剪切,也就是说两个类的包为:packageleon.rpcws.impl;

这两个类就是我们访问服务端WS的辅助类了,现在可以如下访问了:

  1. package leon.rpcws.test;  
  2.   
  3. import leon.rpcws.impl.HelloImplService;  
  4. import leon.rpcws.impl.IHello;  
  5.   
  6. public class HelloClient{  
  7.     public static void main(String[] args) {  
  8.         HelloImplService helloService = new HelloImplService();  
  9.         IHello hello = helloService.getHelloImplPort();  
  10.         System.out.println(hello.sayHello("Leon Su"));  
  11.     }  
  12. }  
package leon.rpcws.test;

import leon.rpcws.impl.HelloImplService;
import leon.rpcws.impl.IHello;

public class HelloClient{
	public static void main(String[] args) {
		HelloImplService helloService = new HelloImplService();
		IHello hello = helloService.getHelloImplPort();
		System.out.println(hello.sayHello("Leon Su"));
    }
}

服务端的WS发布启动,运行这个HelloClient,同样能成功的调用服务端的WS。

posted @ 2013-11-07 11:26  roilat  阅读(273)  评论(0)    收藏  举报