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.wsdl3)、客户端代码(轮询式):
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); } }