JAX-WS学习(一)、哈你妹

1、开发环境: 

1)、jdk1.6+;
2)、JAX-WS RI 2.2.7(http://jax-ws.java.net/2.2.7/JAXWS2.2.7-20120813.zip),下载完直接解压至本地。

2、第一个WebService(服务端):

    1)、先写一个服务端类:

package com.sxit.first;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public class HelloWorldService {
    
    @WebMethod
    public String say(String name){
        return "Hello :" + name;
    }
    
}
@WebService是声明这是一个WebService服务。  
@WebMethod是表示此为公布给外部的soap方法,有两个参数,一个input为String,一个output为String。

   2)、把这个服务部署到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='FirstHelloWorld' implementation='com.sxit.first.HelloWorldService'
        url-pattern='/FirstHelloWorldService' />
</endpoints>   
注意:sun-jaxws.xml这个文件里是配置webservice服务的相关信息。

    3)、配置web.xml文件,加入监听器和servlet:

<?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">
    
    <listener>
         <listener-class> 
            com.sun.xml.ws.transport.http.servlet.WSServletContextListener 
        </listener-class>
    </listener>
    <servlet>
        <servlet-name>FirstHelloWorld</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>FirstHelloWorld</servlet-name>
        <url-pattern>/FirstHelloWorldService</url-pattern>
    </servlet-mapping>
</web-app>
注意:这里需要配置一个监听器,servlet的名字、访问路径要和之前sun-jaxws.xml配置的endpoint name、url-pattern一致。
 

    4)、最后项目结构是这样的,启动tomcat访问http://localhost:8080/ws/FirstHelloWorldService:



3、现在写一个客户端来调用发布好webservice:

    1)、首先是得到webservice服务描述信息的地址(也就是wsdl,webservice describle language,web服务描述语言):

               路径为:http://localhost:8080/Service/FirstHelloWorldService?wsdl

    2)、通过wsgen服务端可生成服务的wsdl文件:

E:\Workspaces\ws\WebRoot\WEB-INF>wsgen -cp E:\Workspaces\ws\WebRoot\WEB-INF\classes com.sxit.first.HelloWorldService -wsdl -d E:\tmp\ws -s E:\tmp\ws -verbose
-cp 是指在classpath下寻找服务类 
-d  是指编译后的文件(class)目录
-s  生成的本地代码(java)目录 
-wsdl  生成wsdl文件

    3)、客户端通过以上两种方式取得wsdl文件,保存在E:/tmp/ws目录下,然后通过wsimport命令来生成本地代码:

E:\tmp\ws>wsimport -keep -d src -s src HelloWorldServiceService.wsdl
parsing WSDL...
generating code...
compiling code...
-d 是指编译后的class文件目录
-s 是指源代码目录

    4)、最后可以在src目录下看到生成好的本地代码:
   5)、把生成的service类中的file开头的wsdl路径全部换成之前的 http://localhost:8080/Service/FirstHelloWorldService?wsdl,写一个客户端类:
package com.sxit.first;
/**
 *@功能:客户端
 *@作者: smile
 *@时间:2013-3-6 下午1:41:11
 *@版本:1.0
 */
public class client {
    public static void main(String[] args) {
        
        HelloWorldServiceService service = new HelloWorldServiceService();
        System.out.println(service.getHelloWorldServicePort().say("sb"));
    }
}
    6)、启动之前的那个服务,然后执行客户端,可以看到会打印出 hello sb;
    1)、在WEB-INF中新建一个binding.xml:
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="HelloWorldServiceService.wsdl"
    xmlns="http://java.sun.com/xml/ns/jaxws">
    <bindings node="wsdl:definitions">
        <enableAsyncMapping>true</enableAsyncMapping>
    </bindings>
</bindings> 
   2)、重新执行wsimport命令:
E:\Workspaces\Service\WebRoot\WEB-INF>wsimport -b binding.xml -s src HelloWorldS
erviceService.wsdl
    3)、客户端代码(轮询式):
package com.sxit.first;

import javax.xml.ws.Response;

/**
 *@功能:异步调用客户端(轮询式)
 *@作者: smile
 *@时间:2013-3-6 下午2:25:36
 *@版本:1.0
 */
public class Client {

	public static void main(String[] args) {
		
		HelloWorldServiceService service = new HelloWorldServiceService();
		HelloWorldService port = service.getHelloWorldServicePort();
		
		Response<SayResponse> sayAsync = port.sayAsync("sb");
		while (!sayAsync.isDone()) {
            System.out.println("is not down");
        }
		
		try {
            SayResponse callNameResponse = sayAsync.get();
            String message = callNameResponse.getReturn();
            System.out.println(message);
        } catch (Exception ex) {
        	
        }
	}
}
    4)、CallBack回调式:
package com.sxit.first;

import java.util.concurrent.ExecutionException;

import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Response;

public class CallBackClient {

	public static void main(String[] args) throws Exception {
		
		HelloWorldServiceService service = new HelloWorldServiceService();
		HelloWorldService port = service.getHelloWorldServicePort();
		
		port.sayAsync("sb", new AsyncHandler<SayResponse>() {
			
			@Override
			public void handleResponse(Response<SayResponse> res) {
				try {
					SayResponse response = null;
					response = res.get();
					String message = response.getReturn();
					System.out.println(message);
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (ExecutionException e) {
					e.printStackTrace();
				}
			}
		});
		Thread.sleep(1000);
	}

}

猜你喜欢

转载自luan.iteye.com/blog/1824748