webservice:主要实现跨平台的web数据通讯java
做用:假设存在两个业务系统,一个使用C++编写,另一个使用Java语言编写,若是要实现两个不一样的业务系统之间的数据通讯就必须进行跨平台处理,互联网毫无疑问就是最好的链接平台。可是不一样的业务系统之间进行通讯,就必须制定双方都承认的规定:通讯协议,webservice正式基于soap简单对象服务协议实现不一样业务系统之间跨平台通讯的.web
跨平台通讯技术:Webservice、RMI等浏览器
webservice服务框架:CXF/AXIS服务器
soap请求头:simple object access protocol:简单对象访问协议并发
SOAP 消息就是一个普通的 XML 文档,包含下列元素:框架
xml namespace 指定标签元素名称空间,避免冲突,而且只能放置于指定名称空间的根元素,通常名称空间的名称指定为URI,只是为了防止命名冲突,该根标签囊括的元素必须之前缀soap开头,若是soap服务器接收到SOAP消息,Envelope的命名空间不是 http://schemas.xmlsoap.org/soap/envelope/,则自动抛弃该信息工具
为相互通讯的团体之间提供了一种很灵活的机制,在无需预先协定的状况下,以分散但标准的方式扩展消息。能够在SOAP.Header中添加条目实现这种扩展,如认证、事务管理、支付等。:Header元素是SOAP封装元素的第一个直接子元素。Header元素的全部直接子元素称做条目,条目的编码规则以下:测试
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:sayHello xmln1:ns2="http://inter.ws.zhiwei.com/"> <arg0>china</arg0> </ns1:sayHello> </soap:Body> </soap:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:sayHelloResponse xmlns:ns1="http://inter.ws.zhiwei.com/"> <return>Hello china</return> </ns1:sayHelloResponse> </soap:Body> </soap:Envelope>
types:指定了WebService用到的全部数据类型,上面案例用到了两种数据类型,int和datetime编码
message:指明一个操做所用到的数据类型。spa
portType:指出了这个WebService全部支持的操做,就是说有哪些方法可供调用
binding:
soap12:binding元素的transport指明传输协议,这里http协议
operation: 指明要暴露给外界访问接口
use属性指定输入输出的编码方式,这里没有指定编码。
①: 建立服务接口和服务实现类 服务接口
package com.zhiwei.cxf; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface IHelloWorld { public String sayHello(@WebParam(name = "name") String name); }
服务实现类:
package com.zhiwei.cxf; import javax.jws.WebParam; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; @WebService //标记该类为webservice的服务类 @SOAPBinding(style = Style.RPC) public class HelloWorld { //@WebParam:相似@RequestParam:将接口接受的参数暴露 public String sayHello(@WebParam(name = "name") String name) { return name + " say: Hello World "; } }
②:发布webservice服务
package com.zhiwei.service; import javax.xml.ws.Endpoint; import com.zhiwei.cxf.*; public class ServerDeploy { public static void deployService() { System.out.println("Server start ....."); HelloWorld service = new HelloWorld(); String address = "http://localhost:9000/helloWorld"; //绑定webservice的地址和服务接口,并发布服务 Endpoint.publish(address, service); } public static void main(String[] args) throws InterruptedException { deployService(); System.out.println("server ready ....."); Thread.sleep(1000 * 600); System.out.println("server exit ....."); System.exit(0); } }
测试:浏览器打开http://localhost:9000/helloWorld?wsdl 可查看webservice的wsdl内容,这里面详细介绍了webservice服务接口的使用方法。
/** JaxWsProxyFactoryBean:Factory for creating JAX-WS proxies JAX-WS:Java API for XML Web Services 功能:JAX-WS容许开发者能够选择RPC-oriented或者message-oriented 来实现本身的web services ,在JAX-WS中,一个远程调用能够转换为一个基于XML的协议例如SOAP,在使用JAX-WS过程当中,开发者不须要编写任何生成和处理SOAP消息的代码。JAX-WS的运行时实现会将这些API的调用转换成为对应的SOAP消息。 */ JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); /** * SEI:Service Endpoint Interface,服务端接口 */ factory.setServiceClass(IHelloWorld.class); // 指定服务端提供服务的接口 factory.setAddress("http://localhost:9000/helloWorld"); // 指定服务地址 // 指定内部故障拦截器 factory.getInFaultInterceptors().add(new LoggingInInterceptor()); // 指定外部故障拦截器 factory.getOutFaultInterceptors().add(new LoggingOutInterceptor()); // 建立JAX-WS服务的代理类,代理类能够直接调用webservice中的方法 IHelloWorld service = (IHelloWorld) factory.create(); // 调用服务接口方法 System.out.println("[result]--->" + service.sayHello("Python"));
客户端结果:
结果代表客户端调用远程的webservice服务成功。
wsimport:自动生成的层次结构:
wsimport自动生成代码测试:
HelloWorldService helloWorldService = new HelloWorldService(); HelloWorld helloWorld = helloWorldService.getHelloWorldPort(); System.out.println(helloWorld.sayHello("Java"));
结果:测试成功
命令:wsdl2java -d d:/temp -client http://localhost:9000/helloWorld?wsdl
生成代码结构层次:
测试代码:
HelloWSImpService helloWSImpService=new HelloWSImpService(); HelloWS helloWS=helloWSImpService.getHelloWSImpPort(); String result=helloWS.sayHello("--->China!"); System.out.println(result);
结果:测试成功
Hello --->China!!