一、为了解决不同平台(不同操作系统)之间的相互调用。如用C语言调用java中的方法。
webservice不是框架甚至不是一种技术,是一种跨平台跨语言的规范。主要解决远程调用,跨平台调用,跨语言调用。
应用举例:1、同一个公司新旧系统的整合。
??????????????????? 2、不同公司的业务整合。
??????????????????? 3、内容聚合,比如同一个网站上需要显示天气预报、pm2.5、股票行情等。需要调用不公平台。
二、Axis(webservice)→ Axis2(webservice)? XFire→CXF。本视频主要将XFire即webservice部分。
Cxf = Celtix(ESB框架) + XFire(webservice框架)。
SOA(面向服务的架构) service1、service2、service3即插即用。IBM希望通过SOA像组装电脑一样开发程序。
1、各种提供服务的组件。(Web Service)
2、企业服务总线相当于电脑的主板。
CXF号称是SOA框架。
/************************************************************
使用CXF开发webservice服务端。
每个webservice分两个部分业务接口和实现类。
(1)开发一个Web service业务接口。该接口要用@webservice修饰。
(2)开发一个Web service实现类。也要用@webservice修饰。
(3)发布Webservice之后要用java包,需要加的jar:geronimo-servlet_3.0_spec-1.0.jar(与servlet-api.jar是同一个包只是名字不一样)相当于一个web应用所以要把servlet-api.jar加进去。cxf内置了一个jetty? web服务器(jetty 无论从性能还是架构上都比tomcat好到由于tomcat是apache的亲儿子所以人们都用tomcat)。jetty的包(以jetty开头jar包)要引进去。
? cxf2.4必须要用jdk7和tomcat7。
/************************************************************
使用CXF开发webservice客户端。
(1)调用cxf中的wsdl2java工具:具体方法为在控制台上cd到客户端程序的src文件夹 然后执行命令wsdl2java “服务端暴露的地址?wsdl”在src中生成客户端文件。
wsdl文档是公开的,web service definition language(webservice的描述文档) 。任何语言实现了webservice都需要提供并暴露wsdl文档。根据wsdl不能推出webservice的
实现语言
(2)找到wsdl2java生成的类中一个集成service的类。该类的实例可当成工厂来使用。
(3)调用service资料实例的getxxxport方法。
形参和返回值
1、当形参和返回值是String和基本数据类型可以轻松的处理。
2、档形参和返回值是javabean式的复合类、list集合和数组等时CXF也可以很好处理。
3、还有一些map、非javabean复合类,cxf是处理不了的。
XML******************************************************
xml里面两个属性:
targetNameSpace:相当于java中的package,一个java源文件中只能有一个package语句
xmlns:相当于java中的import但是功能要强一些比如java 中 import java.unit.*;import java.sql*;当调用Date类时会出错因为引入的两个包中都有该类。而xmlns中可以用xmlns:标识符加包名(即targetNameSpace相当于package命名的包名)调用元素的时候用标识符+元素名的形式这样就不会出现上述问题了。
**********************************************************
webservice的三个技术基础:
1、wsdl web service definition language(webservice定义语音)
2、soap simple object access protocol (简单对象访问协议)
3、uddi
一次webservice调用其实并不是方法调用,而是发送一个soap消息(即符合wsdl规定格式的xml文档)对于sayhi操作来说:
传入的消息是:<sayhi><arg0>字符串</arg0></sayhi>
传出的消息是:<sayhiresponse><teturn>字符串</teturn></sayhiresponse>
schema要深入学习
schema主要是规定个xml的规范,并可用于检查一个xml文档是不是符合该规范。
通俗的说,wsdl文档描述了webservice如下3个方面:
1、WHAT:该webservice包含什么操作。
2、How:该web service的操作怎么调用。
3、where:该webservice的调用地址。
一次调用webservice的本质:
1、客户端吧调用犯法参数,转换成xml文档片段(SOAP消息)--该文档片段必须符合wsdl规定的格式。
2、通过网络,把xml文档片段传给服务器。
3、服务器接受到xml文档片段。
4、服务器解析xml文档片段,提取其中的数据。并把数据转换调用webservice所需的参数值。
5、服务器端执行方法。
6、把服务器中执行方法得到的返回值再次转化为xml文档(SOAP)--该文档片段必须符合wsdl规定的格式。
7、通过把xml文档片段传给客户端。
8、客户端接受xml文档。
9、客户端解析xml文档片段,提取其中的数据。并把数据转换调用webservice的返回值。
从上面调用本质看,有一个语言支持webservice,要求是该语言支持xml文档解析、生成、支持网络传输。
=========================================================================================================================
wsdl文档和相应的注释
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="HelloWorld" targetNamespace="http://ws.cxf.fkjava.org/" xmlns:ns1="http://ws.cxf.fkjava.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
? <wsdl:types>
? ?? ?xm:schema 表示该元素中为schema规范的内容。targetNamespace="http://ws.cxf.fkjava.org/"对应的接口中要用到的所有类,方法、javabean的规范。tns也是对应的xmlns:tns="http://ws.cxf.fkjava.org/“
? ?? ?规定了该接口要用到的所有形参返回参数的形式。
<xs:schema elementFormDefault="unqualified" targetNamespace="http://ws.cxf.fkjava.org/" version="1.0" xmlns:tns="http://ws.cxf.fkjava.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="getCatsbyUser" type="tns:getCatsbyUser"/>
<xs:element name="getCatsbyUserResponse" type="tns:getCatsbyUserResponse"/>
<xs:element name="sayHi" type="tns:sayHi"/>
<xs:element name="sayHiResponse" type="tns:sayHiResponse"/>
<xs:complexType name="getCatsbyUser">
??? <xs:sequence>
????? <xs:element minOccurs="0" name="arg0" type="tns:user"/>
??? </xs:sequence>
? </xs:complexType>
<xs:complexType name="user">
??? <xs:sequence>
????? <xs:element minOccurs="0" name="address" type="xs:string"/>
????? <xs:element minOccurs="0" name="id" type="xs:int"/>
????? <xs:element minOccurs="0" name="name" type="xs:string"/>
????? <xs:element minOccurs="0" name="pass" type="xs:string"/>
??? </xs:sequence>
? </xs:complexType>
<xs:complexType name="getCatsbyUserResponse">
??? <xs:sequence>
????? <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:cat"/>
??? </xs:sequence>
? </xs:complexType>
<xs:complexType name="cat">
??? <xs:sequence>
????? <xs:element minOccurs="0" name="color" type="xs:string"/>
????? <xs:element minOccurs="0" name="name" type="xs:string"/>
??? </xs:sequence>
? </xs:complexType>
<xs:complexType name="sayHi">
??? <xs:sequence>
????? <xs:element minOccurs="0" name="arg0" type="xs:string"/>
??? </xs:sequence>
? </xs:complexType>
<xs:complexType name="sayHiResponse">
??? <xs:sequence>
????? <xs:element minOccurs="0" name="return" type="xs:string"/>
??? </xs:sequence>
? </xs:complexType>
</xs:schema>
? </wsdl:types>
? <wsdl:message name="sayHiResponse">
??? <wsdl:part element="ns1:sayHiResponse" name="parameters">
??? </wsdl:part>
? </wsdl:message>
? <wsdl:message name="getCatsbyUserResponse">
??? <wsdl:part element="ns1:getCatsbyUserResponse" name="parameters">
??? </wsdl:part>
? </wsdl:message>
? <wsdl:message name="getCatsbyUser">
??? <wsdl:part element="ns1:getCatsbyUser" name="parameters">
??? </wsdl:part>
? </wsdl:message>
? <wsdl:message name="sayHi">
??? <wsdl:part element="ns1:sayHi" name="parameters">
??? </wsdl:part>
? </wsdl:message>
? <wsdl:portType name="HelloWorld">
? ?? ?portType里面放的是操作及对应相应接口中的方法
??? <wsdl:operation name="getCatsbyUser">
????? <wsdl:input message="ns1:getCatsbyUser" name="getCatsbyUser">
??? </wsdl:input>
????? <wsdl:output message="ns1:getCatsbyUserResponse" name="getCatsbyUserResponse">
??? </wsdl:output>
??? </wsdl:operation>
??? <wsdl:operation name="sayHi">
????? <wsdl:input message="ns1:sayHi" name="sayHi">
??? </wsdl:input>
????? <wsdl:output message="ns1:sayHiResponse" name="sayHiResponse">
??? </wsdl:output>
??? </wsdl:operation>
? </wsdl:portType>
</wsdl:definitions>
-----------------------------------------------------第二个xml文档和注释---------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="HelloworldWs" targetNamespace="http://impl.ws.cxf.fkjava.org/" xmlns:ns1="http://ws.cxf.fkjava.org/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.ws.cxf.fkjava.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
? <wsdl:import location="http://192.168.1.4:9923/bixuyouyigemingzi?wsdl=HelloWorld.wsdl" namespace(接口wsdl文档中的targetNamespace的值)="http://ws.cxf.fkjava.org/">
??? </wsdl:import>
? <wsdl:binding name="HelloworldWsSoapBinding" type="ns1:HelloWorld">
??? <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
??? <wsdl:operation name="getCatsbyUser">
????? <soap:operation soapAction="" style="document"/>
????? <wsdl:input name="getCatsbyUser">
??????? <soap:body use="literal"/>
????? </wsdl:input>
????? <wsdl:output name="getCatsbyUserResponse">
??????? <soap:body use="literal"/>
????? </wsdl:output>
??? </wsdl:operation>
??? <wsdl:operation name="sayHi">
????? <soap:operation soapAction="" style="document"/>
????? <wsdl:input name="sayHi">
??????? <soap:body use="literal"/>
????? </wsdl:input>
????? <wsdl:output name="sayHiResponse">
??????? <soap:body use="literal"/>
????? </wsdl:output>
??? </wsdl:operation>
? </wsdl:binding>
? <wsdl:service name="HelloworldWs">
??? <wsdl:port binding="tns:HelloworldWsSoapBinding" name="HelloworldWsPort">
????? <soap:address location="http://192.168.1.4:9923/bixuyouyigemingzi"/>
??? </wsdl:port>
? </wsdl:service>
</wsdl:definitions>
================================================================================================
如何进行权限控制:服务器总是要input消息必须携带用户名、密码信息——如果没有,或不正确则拒绝被调用。
如果不用cxf等框架,SOAP消息的生成、解析都是由程序员负责的无论是添加用户名、密码信息、还是提取用户名都可以有程序员的代码完成。
如果用cxf等框架,soap消息的生成、解析都是cxf等框架来完成的,为了控制soap添加了拦截器。
服务器端添加拦截器
(1)获取Endpoint的publish方法返回值。
(2)调用该方法的返回值的getImplementor()、getOutInterceptors()方法获取对应的拦截器列表接下来就可以获取拦截器了。
自定义的拦截器:
?????? 需要实现interceptor接口。实际上我们一般会继承AbstractPhaseInterceptor.
soap文档:
根元素为Envolope
??????? Header? :默认情况下,Header元素不是强制出现的。Header元素有程序员控制添加,主要用于携带一些额外的信息,比如用户名密码等信息因为这些信息不能加在body中因为body需要满足wsdl规定的规范。
??????? Body:1、如果调用正确。Body元素的内容应该遵守WSDL所要求的格式。
2、如果调用错误。Body元素的内容就是Fault子元素。
视频看到1-9了,第8个没有看。