第8章 SOAP.ppt_第1页
第8章 SOAP.ppt_第2页
第8章 SOAP.ppt_第3页
第8章 SOAP.ppt_第4页
第8章 SOAP.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第8章,SOAP,-2-,了解SOAP的应用背景 掌握SOAP的消息结构 掌握SOAP消息交换模型 了解SOAP的常用应用模式 了解SOAP与COM、CORBA的区别 掌握常用的JAXM元素 了解SOAP连接的种类 掌握SOAP客户端的实现方式 掌握SOAP服务端的实现方式,目标,-3-,SOAP介绍,SOAP是基于XML的协议,是分布式系统之间交换信息的轻量级方法 SOAP的两个目标是简单性和可扩展性 SOAP基于XML语言和XSD标准,编码规则由四部分组成: SOAP信封(Envelope) 序列化的机制 SOAP RPC表示 SOAP绑定,(Simple Object Access Pr

2、otocol, 简单对象访问协议),-4-,SOAP消息结构,SOAP定义了基于XML的消息文档、规则和机制,可用于实现应用程序之间的通信 一条SOAP消息就是一个普通的XML文档,该文档包含下列元素 : Envelope(信封)元素,必需,可把此XML文档标识为一条SOAP消息 Header(报头)元素,可选,包含头部信息 Body(主体)元素,必需,包含所有的调用和响应信息 Fault元素,位于Body内,可选,提供有关处理此消息所发生错误的信息 attachment(附件),可选,可通过添加一个或多个附件扩展SOAP消息,-5-,SOAP消息结构,带附件的SOAP消息的结构,-6-,SO

3、AP消息交换模型,SOAP消息交换是从发送方到接收方的一种传输方法。从本质上说,SOAP是一种无状态(stateless)协议,它提供复合的单向消息交换框架,以便在称之为SOAP节点的SOAP应用程序之间传输XML SOAP 节点 SOAP actor属性 SOAP 消息处理,-7-,SOAP应用模式,为了增强SOAP节点之间的通信和消息路径模型,SOAP选择了一种取决于该通信模型的交互操作模式 :,基于底层传输的请求/响应模式,-8-,SOAP应用模式,请求/响应模式 多消息异步响应模式 单向模式 事件通知模式,-9-,SOAP应用模式,请求/响应模式 多消息异步响应模式 单向模式 事件通知

4、模式,-10-,SOAP与CORBA、COM/DCOM的区别,CORBA CORBA(Common Object Request Broker Architecture)公共对象请求代理体系结构是由OMG组织制订的一种标准的面向对象应用程序体系规范 COM/DCOM COM/DCOM(Component Object Model / Distributed Component Object Model)是微软公司提出的分布式组件对象模型标准,支持在局域网、广域网甚至Internet上不同计算机的对象之间的通讯 SOAP与CORBA、COM/DCOM的比较 SOAP不会取代CORBA,和COM/

5、DCOM,三者的概念有所区别 COM/DCOM是个组件模型标准 CORBA是分布式应用的服务标准 CORBA和DCOM为分布式应用程序建立服务,服务对象来执行客户端调用的服务 SOAP是基于XML和HTTP的分布式对象的通信协议,是COM/DCOM和CORBA对象进行通讯的协议,-11-,JAXM元素,在J2EE平台里,要开发一个Web服务,通常有两种选择: 使用JAX-RPC(Java API for XML-based RPC) 使用JAXM(Java API for XML Messaging) JAXM(Java API for XML Messaging,XML消息的Java API

6、)提供了使开发者能够用Java实现SOAP通信服务的API和规范,JAXM是JWSDP的一部分,支持SOAP1.1规范。通常我们说的JAXM API,它包括两个包: javax.xml.soap:是发送SOAP消息的基本包,主要包含了发送带有附件的SOAP消息的API(SOAP with Attachments API for Java ,SAAJ),为构建SOAP包和解析SOAP包提供了重要的支持。它包含了发送请求响应消息相关的API,SAAJ适合基于文档的同步或者异步通信 javax.xml.messaging:定义了JAXM的规范,包含了发送和接收消息所需的API,-12-,SOAPEl

7、ement,javax.xml.soap.SOAPElement接口是JAXM DOM API中的一个关键接口 JAXM API中提供了SOAPEnvelope、SOAPHeader、SOAPBody等都是SOAPElement的子接口 属性 SOAPElement接口提供了几个添加、检索和删除元素属性的方法,-13-,SOAPElement,JAXM DOM实现也提供了一组添加、检索、删除SOAPElement子元素的方法,-14-,SOAPElement,文本节点 addTextNode方法可以把一个文本节点添加到SOAPElement。通过调用getValue方法,可以从文本节点中读取数

8、据 下述代码片段将添加一个带有本地名(fname)和文本节点(apple)的子元素,/ soapMsg是一个SOAPMessage对象 SOAPPart part = soapMsg.getSOAPPart(); / 获取SOAP信封 SOAPEnvelope env = part.getEnvelope(); / 获取SOAP主体 SOAPBody body = env.getBody(); / 创建名为fname的元素 SOAPElement child=body.addChildElement(fname); / 创建值为apple的文本节点 child.addTextNode(appl

9、e); / 读取文本值 String str=child.getValue();,-15-,SOAPElement,名称 Name对象表示XML的名称,它可以是本地名称,也可以是命名空间限定的名称 上述代码中,nsName对象表示带有本地名“getPrice”、前缀“m”以及URI为“,/ soapMsg是一个SOAPMessage对象 SOAPPart part = soapMsg.getSOAPPart(); / 获取SOAP信封 SOAPEnvelope env = part.getEnvelope(); / 创建本地Name对象 Name localName = env.createN

10、ame(model); / 创建命名空间Name对象 Name nsName = env.createName(getPrice,m,-16-,SOAPMessage,javax.xml.soap.SOAPMessage类是所有JAXM SOAP消息的根类,SOAPMessage对象由一个SOAP部分和一个或多个附件部分(可选)组成 一般情况下,一个SOAPMessage对象包含以下内容组件: 一个SOAPPart对象 一个SOAPEnvelope对象 一个SOAPBody对象 一个SOAPHeader对象 示例代码:,SOAPPart sp = message.getSOAPPart();

11、SOAPEnvelope se = sp.getEnvelope(); SOAPBody sb = se.getBody(); SOAPHeader sh = se.getHeader();,-17-,SOAPMessage,javax.xml.soap.SOAPMessage类是所有JAXM SOAP消息的根类,SOAPMessage对象由一个SOAP部分和一个或多个附件部分(可选)组成 SOAPMessage的常用方法,-18-,SOAPPart,javax.xml.soap.SOAPPart类是SOAPMessage对象中特定于SOAP部分的容器,所有消息都必须有一个SOAPPart S

12、OAPPart的常用方法,-19-,SOAPEnvelope,javax.xml.soap.SOAPEnvelope是SOAPElement的子接口,其映射到SOAP Envelope部分 SOAPEnvelope对象也包含消息报头对象(SOAPHeader)和消息主体对象(SOAPBody),该对象可以通过调用SOAPEnvelope的getHeader()方法和getBody()方法获取 SOAPEnvelope的常用方法,-20-,javax.xml.soap.SOAPHeader是SOAPElement的一个子接口,其映射到SOAP的报头部分 SOAPHeader的常用方法 SOAPH

13、eaderElement的常用方法,SOAPHeader和SOAPHeaderElement,-21-,SOAPBody和SOAPBodyElement,javax.xml.soap.SOAPBody是SOAPElement的一个子接口,表示SOAP消息中SOAP正文元素内容的对象的内容 SOAPBody的常用方法,/ sbody是一个SOAPBody对象,myName是一个Name对象 SOAPBodyElement sbe = sbody.addBodyElement(myName);,-22-,SOAPFault,javax.xml.soap.SOAPFault以SOAP元素作为模型,映

14、射到SOAP Fault部分,用于封装SOAP消息传递过程中的错误信息 SOAPFault的常用方法,-23-,SOAP连接,JAXM提供有两种类型的连接: 发送者和接收者通过消息提供者进行间接的连接这种方式需要消息提供者,JAXM提供者(Provider)是一种可以提供多种任务的服务型对象类型,包括提供存储、转发机制来保证异步SOAP消息的传送 发送者和接收者直接连接独立的点对点连接,客户端应用程序无需使用消息提供者,所以即使不在Servlet或者JavaEE容器里也能使用,javax.xml.soap.SOAPConnection,javax.xml.messaging.ProviderC

15、onnection,-24-,构建消息,构建JAXM SOAP消息的第一步是获得MessageFactory,可以通过两种方式来获取: 如果应用程序运行在容器中,并且正使用JAXM提供者,则应用程序将使用它与提供者的连接来请求消息工厂 如果应用程序不使用提供者,则可以通过调用MessageFactory类的静态方法来返回一个消息工厂的实例 通过MessageFactory创建SOAP消息的代码示例代码如下: 创建完SOAPMessage对象后,就可以简单的通过消息本身去访问消息对象的各部件,/ 消息工厂 MessageFactory msgFactory = MessageFactory.ne

16、wInstance(); / 生成SOAP消息实例 SOAPMessage message = msgFactory.createMessage();,SOAPPart sp = message.getSOAPPart(); SOAPEnvelope se = sp.getEnvelope(); SOAPBody sb = se.getBody(); SOAPHeader sh = se.getHeader();,-25-,编写SOAP客户端,基于消息发送者到接收者的直连点对点直接连接,创建客户端,向服务器发送SOAP消息,并处理服务器的返回消息 在编写SOAP应用时,需将JAXM开发工具包j

17、axm-api.jar引入到工程中,或配置到CLASSPATH,Name headerName = soapEnvelope.createName(studentInfo, stu, http:/localhost:8080/soap); SOAPHeaderElement headerElement = soapHeader .addHeaderElement(headerName); headerElement.setMustUnderstand(true); headerElement.addTextNode(ZKCW9901); Name bodyName = soapEnvelope

18、.createName(getStudentInfo, stu, http:/localhost:8080/soap); SOAPBodyElement bodyElement = soapBody.addBodyElement(bodyName); Name eleName = soapEnvelope.createName(StudentName); SOAPElement se = bodyElement.addChildElement(eleName); se.addTextNode(Zhang Fei); message.saveChanges();,-26-,编写SOAP服务器,S

19、OAP服务时SOAP消息的最终接收者,使用JAXM,有两种方式可以实现在容器中运行并利用JAXM提供者的SOAP服务程序: 使用Servlet(在Servlet容器中运行) 使用EJB的消息驱动Bean(在EJB容器中运行) 使用Servlet实现SOAP服务器,-27-,JAXMServlet,JAXM API提供一个类javax.xml.messaging.JAXMServlet用来实现SOAP服务器 重载init方法的代码类似如下: SOAP Servlet服务程序在扩展JAXMServlet的同时,须应该实现OnewayListener接口或ReqRespListener接口,publ

20、ic class MyJAXMServlet extends JAXMServlet implements ReqRespListener static MessageFactory mf = null; public void init(ServletConfig sc) throws ServletException / 初始化父类 super.init(sc); / 创建一个消息工厂 try mf = MessageFactory.newInstance(); catch (Exception e) e.printStackTrace(); ,-28-,编写SOAP服务器,基于消息发送者

21、到接收者的点对点直接连接直连,创建SOAP服务端,接收、处理SOAP消息(将SOAP消息存入指定文件),并返回SOAP响应消息,/ 将SOAP请求消息写入指定文件 FileOutputStream fos = new FileOutputStream(new File(c:soapmessage.xml); msg.writeTo(fos); fos.close(); / 此处省略返回消息处理的业务逻辑,而用硬编码形式创建一个返回消息 resp = mf.createMessage(); SOAPEnvelope se = resp.getSOAPPart().getEnvelope(); se.getBody().addChildElement(se.createName(ResponseMessage) .addTextNode(Received Message,Thanks); return resp;,-29-,部署测试,首先部署SOAP服务器应用到Web服务器(如,Tomcat) 启动Web服务器,如果启动成功,开始测试 执行SOAP客户端应用 sender.java,如果客户端指定的URI路径无误,客户端会将消息发送到SOAP服务器,并接收SOAP服务器应用的响应消息,然后在控制台输出 如果客户端运行通过,此时查看服务器的C:盘,可看到生

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论