目录:
- 概述
- 实验环境
- 服务端的实现
- 客户端的实现
[一]、概述
Java API for XML Web Services (JAX-WS)是Java程序设计语言一个用来创建Web服务的API。
在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI(service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。
在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。
当然 JAX-WS 也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatch 直接使用SOAP消息或XML消息发送请求或者使用Provider处理SOAP或XML消息。
JAX-WS2.0 (JSR 224 )是Sun新的web services协议栈,是一个完全基于标准的实现。在binding层,使用的是the Java Architecture for XML Binding (JAXB, JSR 222 ),在parsing层,使用的是the Streaming API for XML (StAX, JSR 173 ),同时它还完全支持schema规范。
JAX-WS与JAX-RPC的区别 可参见:http://java.sun.com/xml/faq.html#JAX-WS-and-JAX-RPC-difference
JAX-WS一些参考资料:
[二]、实验环境
- java version “1.6.0_18″、Eclipse3.7
- maven构建项目:mvn archetype:create -DgroupId=com.micmiu.jaxws.demo -DartifactId=jaxws-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
[三]、服务端的实现
1.最基本的实例
编写接口代码:HelloService.java
1 2 3 4 5 6 7 8 9 10 |
package com.micmiu.jaxws.demo; /** * blog http://www.micmiu.com * * @author Michael */ public interface HelloService { String sayHello(String userName); } |
实现接口并添加webservice注释:HelloServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.micmiu.jaxws.demo.impl; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import com.micmiu.jaxws.demo.HelloService; /** * blog http://www.micmiu.com * * @author Michael */ @WebService() //默认SOAPBinding style = Style.DOCUMENT @SOAPBinding() public class HelloServiceImpl implements HelloService { @WebMethod public String sayHello(@WebParam(name = "userName") String userName) { return "hi," + userName + " welcom to www.micmiu.com"; } } |
编写服务端发布代码:ServerStart.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.micmiu.jaxws.demo; import javax.xml.ws.Endpoint; import com.micmiu.jaxws.demo.impl.HelloServiceImpl; /** * blog http://www.micmiu.com * * @author Michael */ public class ServerStart { /** * @param args */ public static void main(String[] args) { System.out.println("start publish jax-ws ..."); HelloService service = new HelloServiceImpl(); Endpoint.publish("http://localhost:8082/HelloService", service); System.out.println("publish webservice successful"); } } |
运行ServerStart,日志如下:
1 2 3 4 5 6 |
start publish jax-ws ... 2012-7-12 10:56:41 com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass 信息: Dynamically creating request wrapper Class com.micmiu.jaxws.demo.impl.jaxws.SayHello 2012-7-12 10:56:42 com.sun.xml.internal.ws.model.RuntimeModeler getResponseWrapperClass 信息: Dynamically creating response wrapper bean Class com.micmiu.jaxws.demo.impl.jaxws.SayHelloResponse publish webservice successful |
浏览器打开:http://localhost:8082/HelloService?wsdl 回车显示如下:
可见服务端已经发布成功。
运用JDK自动的命令: wsgen 生成wsdl文件和异常处理的相关类
ps:如果webservice中有异常声明,必须用wsgen生成常处理的相关类之后,才能发布。
按win+R键,输入cmd回车进入命令行界面,切换到target下创建目录ws,在执行如下命令:
1 |
mkdir ws\bin ws\src ws\wsdl |
- bin -> 存放生成的class文件
- src -> 存放生成的源代码文件
- wsdl -> 存放生成的wsdl 文件
再执行如下命令:
1 |
wsgen -cp .;classes/ -r ws/wsdl -s ws/src -d ws/bin -wsdl com.micmiu.jaxws.demo.impl.HelloServiceImpl |
生成后的目录如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
D:\workspace_dev\jaxws-demo\target>tree /F ws 卷 work 的文件夹 PATH 列表 卷序列号为 2AF7-9BD9 D:\WORKSPACE_DEV\JAXWS-DEMO\TARGET\WS ├─bin │ └─com │ └─micmiu │ └─jaxws │ └─demo │ └─impl │ └─jaxws │ SayHello.class │ SayHelloResponse.class │ ├─src │ └─com │ └─micmiu │ └─jaxws │ └─demo │ └─impl │ └─jaxws │ SayHello.java │ SayHelloResponse.java │ └─wsdl HelloServiceImplService.wsdl HelloServiceImplService_schema1.xsd |
2.@WebService 指定 endpointInterface 实例
修改接口代码:HelloService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.micmiu.jaxws.demo; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; /** * blog http://www.micmiu.com * * @author Michael */ @WebService @SOAPBinding(style = Style.DOCUMENT) public interface HelloService { @WebMethod String sayHello(@WebParam(name = "userName") String userName); } |
修改接口实现类:HelloServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.micmiu.jaxws.demo.impl; import javax.jws.WebService; import com.micmiu.jaxws.demo.HelloService; /** * blog http://www.micmiu.com * * @author Michael */ @WebService(endpointInterface = "com.micmiu.jaxws.demo.HelloService") public class HelloServiceImpl implements HelloService { public String sayHello(String userName) { return "hi," + userName + " welcom to www.micmiu.com"; } } |
运行ServerStart 启动程序,可通过运行日志和浏览器访问wsdl文件进行验证。
[四]、客户端的实现
1. wsimport 生成客户端
按win+R键,输入cmd回车进入dos,切到target目录,然后创建目录:client、client\bin、client\src
在target目录下运行如下命令回车即可生成客户端文件:
1 |
wsimport -s client/src -d client/bin -p com.micmiu.jaxws.client http://localhost:8082/HelloService?wsdl |
生成源文件目录结构如下:
1 2 3 4 5 6 7 8 9 10 11 |
D:\WORKSPACE_DEV\JAXWS-DEMO\TARGET\CLIENT\SRC └─com └─micmiu └─jaxws └─client HelloServiceImpl.java HelloServiceImplService.java ObjectFactory.java package-info.java SayHello.java SayHelloResponse.java |
2.编写客户端测试程序:HelloClient.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.micmiu.jaxws.client; /** * blog http://www.micmiu.com * @author Michael */ public class HelloClient { /** * @param args */ public static void main(String[] args) { HelloServiceImplService service = new HelloServiceImplService(); HelloServiceImpl hello = service.getHelloServiceImplPort(); System.out.println("start webservice client ..."); System.out.println("send Michael to server "); System.out.println(hello.sayHello("Michael")); System.out.println("test client end."); } } |
运行测试程序,日志如下:
1 2 3 4 |
start webservice client ... send Michael to server hi,Michael welcom to www.micmiu.com test client end. |
可见客户端调用成功。
——————-
原创文章,转载请注明: 转载自micmiu – 软件开发+生活点滴[ http://www.micmiu.com/ ]
为什么我引用不到HttpExchange、还有JAXWSProperties呢?