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);
}
}