通俗地说,WSDL文档描述了WebService如下3个方面:-WHAT:该WebService包含什么操作-HOW:该WebService的操作应该怎么调用-WHERE:该WebService的服务地址/*******************************只要得到Web Service的WSDL文档,接下来程序就可以调用Web Service*******************************/
-------------------------------------------Web Service 接口-types(标准的Schema)-message(2N个)-portType(N个Operation)Web Service实现-binding (N个更详细的operation)-service (指定Web Service的服务器名称/地址)-------------------------------------------一次WebService的调用--其实并不是方法调用,而是发送SOAP消息(即XML片段);调用一次Web Service 的本质:1.客户端把调用方法参数,转化为XML文档片段(SOAP消息)--该文档片段必须符合WSDL定义的格式;2.通过网络把XML文档片段传给服务器;3.服务器接收到XML文档片段;4.服务器解析XML文档片段,提取其中的数据,并把数据转换成调用Web Service所需的参数值;5.服务器端执行方法;6.把执行方法得到的返回值再次转换生成XML文档片段(SOAP消息)--该文档片段必须符合WSDL定义的格式;7.通过网络把XML文档片段传给客户端;8.客户端接收到XML文档片段;9.客户端解析XML文档片段,提取其中的数据,并把数据转换调用Web Service的返回值;从上面调用本质来看,要一个语言支持Web Service,唯一的要求是:该语言支持XML文档解析、生成,支持网络传输。2.SAOP:Simple Object access Protocol(简单对象访问协议)=========================第七讲=============================处理Map等CXF无法自动转换的复合数据类型的形参和返回值==========================================================在CXF开发中,如果遇到系统无法自动处理的类型,就需要这样处理思路:提供一个转换器(继承XmlAdapter),负责把CXF无法自动处理的类型,转换为可以处理的类型。1.使用@XmlJavaTypeAdapter注释修饰CXF无法自动处理的类型;使用该Annotation处理的时候,需要指定一个转换器2.实现自己的转换器,需要开发一个CXF可以处理的类型;==========================第八讲/第十讲========================CXF拦截器===========================================================Web Service 急需解决的问题:如何进行权限控制?
思路:服务器端要求input消息携带用户名密码信息,否则拒绝调用。如果不用CXF等框架,SOAP消息的生成、解析都是由程序员负责的,因此无论是添加用户名密码信息,还是提取用户名密码信息,都可以由程序员的代码完成。如果用CXF等框架,SOAP消息的生成、解析都是由CXF等框架来完成的。为了让程序员能访问、修改CXF框架所生成的XML(SOAP消息),CXF提供了拦截器。**服务器端添加拦截器1.获取Endpoint的publish方法返回值;2.调用该方法返回值的getInInterceptors()、getOutInterceptors()方法获取In、Out拦截器列表,添加拦截器;//调用Endpoint的publish方法发布Web ServiceEndpointImpl ep =EndPoint.publish("http://10.1.14.6");//添加In拦截器ep.getInInterceptors().add(e);//添加Out拦截器ep.getOutInterceptors().add(e);HelloWorldWs factory =newHelloWorldWs();//此处返回的是远程WebService的代理HelloWorld hw = factory.getHelloWorldPort();Client client =ClientProxy.getClient(hw);client.getInInterceptors().add(e);client.getOutInterceptors().add(e);// 服务器添加校验Header拦截器//通过PhaseInterceport,可以指定拦截器在哪个阶段起作用publicclassAuthInterceptorextendsAbstractPhaseInterceptor<SoapMessage>{publicAuthInterceptor(){//该拦截器会在“调用之前”拦截;Phase是阶段常量super(Phase.PRE_INVOKE);}//实现自己的拦截器时,需要实现handleMessage方法//handleMessage方法中的形参就是被拦截到的SOAP消息//一旦程序获取到SOAP消息,就可以解析或修改SOAP消息@Overridepublicvoid handleMessage(SoapMessage msg)throwFault{//得到SOAP消息的所有HeaderList<Header> headers = msg.getHeaders();}}//客户端添加Header消息拦截器publicclassAddHeaderInterceptorextendsAbstractPhaseInterceptor<SoapMessage>{privateString userId;privateString userPass;publicAddHeaderInterceptor(String userId,String userPass){super(Phase.PREPAR_SEND);//准备发送时调用this.userId = userId;this.userPass = userPass;}@Overridepublicvoid handleMessage(SoapMessage msg)throwsFault{List<Header> headers = msg.getHeaders();//把ele元素包装成Header,并添加到SOAP消息的Header列表headers.add(newHeader(newQName("fkjava"),ele));}}
SOAP Header 可选的,有程序员控制添加; Body Body元素总是默认的,Body元素里可有两种情况 -当Web Service交互正确时,Body元素里的内容由WSDL控制; -当Web Service交互出错时,Body元素内容是Fault===========================第十二讲/第十三讲========================CXF与Spring整合==============================================================可以在传统的Java EE应用的基础上添加一层Web Service。我们的Java EE应用就可以对外暴露成Web Service,这样就允许任何平台任何语言编写的程序来调用这个Java EE应用。在传统SSH项目基础上增加WebService的步骤1.复制CXF的Jar包;(最核心6个)2.在web.xml配置CXF的核心控制器:CXFServlet;3.在Spring配置文件中倒入CXF提供Schema,XML配置文件;4.在Spring配置文件中使用jaxws:endpoint元素暴露WebService;5.如果要添加拦截器,在jaxws:endpoint元素里添加inInterceptors,outInterceptors子元素;**implementor指定WebService的服务提供者。支持两种方式:a.直接给定服务器提供者的类名(不推荐);<javws:endpoint implementor="org.lr.cxf.ws.impl.HelloWorldWs" address="/lrservice"></javws:endpoint>b.设置为容器中一个bean.<bean id="helloWorldWs" class="org.lr.cxf.ws.impl.HelloWorldWs" p:us-ref="userService"/><!-- id前要加# --><javws:endpoint implementor="#helloWorldWs" address="/lrservice"></javws:endpoint>===========================第十四讲=============================CXF与Spring整合的第二种方式_让JavaEE应用依赖第三方WebService--就是调用WebService==============================================================1.复制CXF的Jar包;(最核心6个)2.在web.xml配置CXF的核心控制器:CXFServlet;3.在Spring配置文件中倒入CXF提供Schema,XML配置文件;4.在Spring配置文件中使用jaxws:client元素调用WebService;5.如果要添加拦截器,在jaxws:client元素里添加inInterceptors,outInterceptors子元素;**为了保证该Web Service代理对象可以自动装配给Action,应该保证该id属性值与Action中setter方法名有对应关系<jaxws:client id="hw" serviceClass="org.lr.cxf.ws.HelloWorld" address="http://192.168.10.254:9999/lrservice"></jaxws:client>来自为知笔记(Wiz)附件列表新闻热点
疑难解答