《CXF WEB service 框架学习笔记》由会员分享,可在线阅读,更多相关《CXF WEB service 框架学习笔记(8页珍藏版)》请在金锄头文库上搜索。
1、http:/cxf.apache.org/docs/index.htmlhttp:/cxf.apache.org/注意,在非java-project中,例如在web-project中可能出现(activation.jar和mail.jar)与工程中的j2ee.jar以及myeclipse中D:MyEclipse 5.5.1 GAmyeclipseeclipsepluginscom.genuitec.eclipse.j2eedt.core_5.5.1datalibrarysetEE_5的javaee.jar里面的同名包发生冲突,建议把j2ee.jar和javaee.jar中的同名包删除,或者直接
2、使用J2ee.jar把eclipse自带的javaee.jar从工程中去除并加入相应的包1. WSDL2JAVA生成客户端代码2. JAXB3. JAX-WS4. WS-Addressing5. WS-Policy6. WS-Security7. webservice 注释8. 拦截器WSDL2JAVA生成客户端代码CXF支持代码生成1)Java to WSDL 、2)WSDL to Java 、3)XSD to WSDL 、4)WSDL to XML 5)WSDL to SOAP 、6)WSDL to service 如下:D:apache-cxf-2.2.5binwsdl2java -d
3、d:/cxf-client -p example1.client http:/127.0.0.1:8080/ws/HelloWorld?wsdlJAXBhttp:/ 对象。对于对象,每次都需要set 或者get相应的属性,当然也可以使用map 来保存xml配置。 于是,一种新的处理方式用于对象和xml之间的映射就变得非常需要,还好sun提供了jaxb,一种很方便的方式来处理java对象和xml内容其中的xjc po.xsd能把xsd中定义的java结构转换为java类,这有点像xmlbeans的scompJAX-WShttps:/jax- web services的JAVA API (官方:J
4、AX-RPC 2.0 renamed to JAX-WS 2.0)在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代码。JAX-WS的运行时实现会将这些API的调用转换成为对于SOAP消息。在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI (service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来
5、实现对于远程服务器端的调用。通过web service所提供的互操作环境,我们可以用JAX-WS轻松实现JAVA平台与其他编程环境(.net等)的互操作。JAX-WS与JAX-RPC之间的关系Sun最开始的web services的实现是JAX-RPC 1.1 (JSR 101)。这个实现是基于Java的RPC,并不完全支持schema规范,同时没有对Binding和Parsing定义标准的实现。JAX-WS2.0 (JSR 224)是Sun新的web services协议栈,是一个完全基于标准的实现。在binding层(xml2java对象),使用的是the Java Architectur
6、e for XML Binding (JAXB, JSR 222),在parsing层,使用的是the Streaming API for XML (StAX, JSR 173),同时它还完全支持schema规范。1客户端开发者通过URL得到WSDL文件(通过HTTP访问可以得到http:/?wsdl)2客户端根据WSDL的描述,生成相关client接口代理方法,通过HTTP POST发送SOAP消息给服务器端。3服务器端Listener接受到SOAP请求消息,对JAVA来说,通常是一个servlet或者EJB。Listener把消息转发给 Dispatcher,有时候listener和Dis
7、patcher也可能是同一个类。Dispatcher会把请求消息交给WebService的运行终端。4,这时候,服务器端会将HTTP request转成服务器端的消息类型,形成javax.xml.ws.handler.MessageContext,并处理SOAP消息的头信息,如mustUnderstand。5,如果在服务器端配置了handler,会调用handler的handleMessage方法,通常用handler来承储消息,解密或者保证消息到达的顺序。handler通过在HandlerChain标注配置,handlers.xml文件内容为: WSSOAPHandler com.cxf.t
8、est.WSSOAPHandler WSHandler com.cxf.test.WSHandler 6,SOAP消息被反序列化为JAVA对象,传到真正的实现业务的类。7,调用真正的业务方法,执行后利用JAXB注解序列化成SOAP返回消息。8,如果配置了handler,会调用handler的handleMessage方法。如果业务方法有异常抛出,把异常转为SOAP fault 消息。9,Listener通过HTTP把response返回给客户端。JAX-WS的客户端调用分为proxy方式以及dispatch方式URL wsdlURL = new URL(file:/D:/ wsdl/prjCX
9、FWeb.wsdl);QName serviceQName = new QName(http:/ WSCXFProviderService);QName portQName = new QName(http:/ WSCXFProviderPort);Service service = Service.create(wsdlURL, serviceQName);WSCXFProvider port = (WSCXFProvider) service.getPort(portQName, WSCXFProvider.class);try System.out.println(port.testWS
10、(message);catch(SOAPFaultException e) System.out.println(e.getFault().getFaultCode(); System.out.println(e.getFault().getFaultString();1,用工具通过WSDL文件产生一个SEI(service endpoint interface),一个java的interface,能够对应该web service提供的功能。这个interface的类名会对应到WSDL的portType名称,方法会和operation对应,方法的参数会和message以及types对应。CXF
11、和Axis都提供这样的工具:wsdl2java。【上面的WSCXFProvider就是SEI】2,初始化Service,指定wsdL URL和service的QName,service的QName的前一部分是命名空间,后一部分是名称,与WSDL文件中的部分对应。然后通过getPort得到一个实现了SEI的实例,这个实例被叫做Proxy。它的QName与 wsdl文件中的wsdl:port name=WSCXFProviderPort部分对应。3,通过SEI调用web service,传给SEI的参数是加上JAXB annotation的java类(简单类型和String不用标记)。4,传入的参
12、数被序列化为SOAP消息的payload(body部分的xml),这是因为service.getPort是通过proxy机制创建的,调用这个proxy的方法时,和它关联的InvocationHandler的invoke方法也会执行,invoke方法会通过JAXB把java参数序列化为XML。然后会把soap request发到服务器端。5,返回response是后与4类似,InvocationHandler负责把XML利用JAXB反序列化为java对象。上面是ProxyWS-Addressing具体而言,WS-Addressing为同步和/或异步传输的SOAP消息提供了一套统一的寻址方式,而且
13、,它还提供了一些寻址特性来帮助Web服务的开发人员围绕多样性的消息交换模式不仅仅只是请求/响应的简单交换模式来构建新的应用WS-Policyhttp:/ 规范为服务请求者和服务提供者定义了语法和语义来描述他们的需求、首选项和性能如:安全、隐私 、应用程序优先权 、用户帐户优先权 、传输控制WS-Securityhttp:/ Web 服务以实现完整性和机密性时使用,它被设计成用来构建多种安全性模型(包括 PKI、Kerberos 和 SSL)的基础。WS-Security 特别为多安全性令牌、多信任域、多签名格式和多加密技术提供支持。本规范提供了三种主要的机制:安全性令牌传播、消息完整性和消息机密性。