jax-ws webservice编程
1.理解JAX-WS1.1JAX-WS概述JAX-WS2.0 的全称为 Java API for XML-Based Webservices (JAX-WS) 2.0。JAX-WS 2.0 是对 JAX-RPC 1.0 规范的扩展,是 JAX-RPC 1.1 的后续版本, JAX-RPC 2.0 标准发布不久后便被重新命名为 JAX-WS 2.0。 JAX-WS 2.0 是面向 Java 5 的开发 Web services 的最新编程标准,它提供了新的编程模型和对以往的 JAX-RPC 方式的 Web services 进行了增强。 JAX-WS2.0 (JSR 224)是Sun新的web services协议栈,是一个完全基于标准的实现。在binding层,使用的是the Java Architecture for XMLBinding (JAXB,JSR 222),在parsing层,使用的是the Streaming API for XML (StAX,JSR 173),同时它还完全支持schema规范。 1.2JAX-WS 2.1特性支持SOAP 1.1(默认)、1.2 ?支持XML/HTTP Binding ?支持WS-Addressing ?支持document/literal样式 ?支持WS-I Basic Profile 1.1 ?支持消息传输优化机制(Message Transmission Optimization Mechanism,MTOM) 2.准备工作(1) jdk 1.6,j2ee-eclipse (2) JAXWS2.2.7-20120813(http://jax-ws.java.net/),下载后解压。 3.在eclipse中新建web工程在工程下新建目录wssrc,wsdl,build,与src目录平级 4.开始书写第一个web service
package ethan.webservice; import java.util.List; import javax.jws.WebMethod; import javax.jws.WebService; import ethan.webservice.bean.User; @WebService public interface IHello { @WebMethod public List<User> sayHello(String user); }
package ethan.webservice.impl; import java.util.ArrayList; import java.util.List; import javax.jws.WebService; import ethan.webservice.IHello; import ethan.webservice.bean.User; @WebService(endpointInterface = "ethan.webservice.IHello",portName = "HelloServicePort",serviceName = "HelloService",targetNamespace = "http://www.ethanSKY.com/webservice/hello") public class HelloImpl implements IHello { @Override public List<User> sayHello(String user) { System.out.println("=================start=================="); List<User> users = new ArrayList<User>(); User u1 = new User(); u1.setId("1"); u1.setName("name1"); User u2 = new User(); u2.setId("2"); u2.setName("name2"); users.add(u1); users.add(u2); System.out.println("2:"+user); System.out.println("=================end=================="); return users; } } 注意: @WebService 注释在了Class之上,这告诉了JAXWS,此类为Webservice。 @WebMethod 注释在了public方法上,这告诉了JAXWS,此方法为soap方法。 5.通过Java类编译WebserviceJAX-WS 2.0 有两种开发过程:自顶向下和自底向上。自顶向下方式指通过一个 WSDL 文件来创建Web Service,自底向上是从 Java 类出发创建 Web Service。两种开发过程最终形成的文件包括: 1.SEI。一个SEI对应WSDL中WebService的一个port,在Java中是一个Java接口。 2.SEI实现类。 3.WSDL和XSD文件。 结合公司内项目的特点,我们更多的是碰到以下两种情况: 1. Onsite要我们做一个Webservice或者是客户要求我们提供Webservice接口; 2. Onsite已经有一个Webservice了,现在要我们做客户端集成。 因此,我们选用Server端通过Java Class生成webservice,而客户端通过wsdl生成Java调用类的做法。 JAXWS为我们提供了两个工具: (1)wsgen 主要用于Server端通过Java类编译成Webservice及相关的wsdl文件 (2)wsimport 主要用于Client端(调用端)通过wsdl编译出调用Server端的Java文件 我们就来生成一下上面的这个Hello,打开命令行工具,输入如下命令: wsgen -cp /home/ethan/workspace/work/jax-ws-server/WebContent/WEB-INF/classes ethan.webservice.impl.HelloImpl -wsdl -s wssrc -r wsdl 注: -wsdl参数代表生成webservice - s参数代表生成的.java文件置于何处 -d 参数代表生成的编译class文件置于何处(这个可以忽略,我们利用eclipse编译) -r 参数代表生成的.wsdl文件与.xsd文件生成在何处 -cp参数代表classpath,即HelloImpl.class的所在 生成的java文件在wssrc目录下,将其拷贝到src目录。 同时在wsdl目录会生成四个文件,两个是wsdl文件两个是xsd文件。 6.部署webservice在工程的WEB-INF目录下建立“sun-jaxws.xml”文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="HelloService" implementation="ethan.webservice.impl.HelloImpl" url-pattern="/HelloService" /> </endpoints> 修改web.xml文件,如下:
<listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet> <servlet-name>HelloService</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>HelloService</servlet-name> <url-pattern>/HelloService</url-pattern> </servlet-mapping> 将JAXWS2.2.7-20120813中lib目录下的jar包导入工程。 将内容部署到应用服务器中,启动应用服务器,访问:http://localhost:8080/jax-ws-server/HelloService?wsdl,出现内容即代表完成服务端部署。 7.客户端开发利用wsimport生成客户端 在eclipse中新建java工程,在命令行输入:wsimport -keep -d bin -s src wsdl/HelloService.wsdl 生成的HelloService.java中 将url = new URL(baseUrl,"file:/home/ethan/workspace/work/jax-ws-client/wsdl/HelloService.wsdl"); 改为:url = new URL(baseUrl,"http://localhost:8080/jax-ws-server/HelloService"); 8.书写测试类:
public class HelloServiceTest { public static void main(String args[]){ HelloService service = new HelloService(); IHello port = service.getHelloServicePort(); List<User> users = port.open("aaa"); System.out.println(users.size()); } } 大功告成! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |