SOA复习

选择

绪论SOA

XML

XML处理

SOAP概念*2

WSDL概念*2

SOAP代码阅读*2

WSDL代码阅读*3

UDDI概念

JAXR

JAXB

REST概念

简答

XML处理

在选择处理XML数据的方法时,需要根据实际场景和需求进行考虑,以下是一些参考因素:

  1. XML文档大小:如果XML文档较小,则可以使用DOM来加载并操作整个文档。如果XML文档非常大,则SAX可能更好,因为它不需要将整个文档加载到内存中。
  2. 需要进行的操作:如果需要对XML文档进行频繁的增删改操作,则DOM是最好的选择;如果只需要遍历并查询文档,则SAX是最好的选择。
  3. 可扩展性:如果需要将XML数据转换为其他格式,则可以使用XSLT。如果需要执行复杂的XPath查询,则可能需要使用DOM或XSLT来实现。

举一些例子来说明:

  1. 如果您需要读取和修改XML文件的特定节点,例如在配置文件中修改某些设置,则DOM可能是最好的选择。这种情况下,您可以使用DOM将整个XML文档加载到内存中,并对其进行操作。
  2. 如果您需要从XML文件中提取某些信息,然后将其用于其他目的,例如web页面的显示,则SAX方法可能更适合。这种情况下,您可以编写一个SAX处理器,以事件驱动方式读取XML文件并提取所需的信息。
  3. 如果您需要将XML数据转换为HTML、PDF或其他格式,则XSLT是最佳选择。这种情况下,您可以编写一个XSLT样式表,以指定如何将XML数据转换为所需的输出格式。

总之,不同的场景和需求需要采用不同的方法来处理XML数据。开发人员需要根据具体情况选择最佳的方法。

SOAP二进制优化

一堆机制,按层层递进的方式如何完成二进制传输的携带

  1. 消息传输优化机制(MTOM)

    [MTOM]提供了一种优化,避免了携带base64编码的大型二进制内容

    [MTOM]定义了一个抽象SOAP传输优化特性,允许独立于底层协议绑定,以便优化机制可以在各种传输上可用,以及保留主要的SOAP绑定范例——SOAP消息信息集,无论如何序列化,都可以在相邻节点之间不变地传输。

    [MTOM]提供了对现有SOAP HTTP绑定的增强,以提供抽象SOAP传输优化特性的实现。当MTOM/XOP被用来优化SOAP消息时,它被序列化成一个使用XOP处理的MIME Multipart/Related消息。base64二进制数据从SOAP消息中提取出来,并在MIME消息中打包成独立的二进制附件。

    1. 在 SOAP 消息的头部添加一个 “Content-Transfer-Encoding” 属性并设置值为 “binary”,以表示这个消息是使用二进制传输的。
    2. 在 SOAP 消息的正文中标识哪些部分需要使用二进制编码。可以使用两个机制来标识这些部分:XOP(XML-binary Optimized Packaging)和 SWA(SOAP with Attachments)。其中,XOP 使用了 MIME 多部分媒体类型来将二进制数据与 SOAP 消息隔离开,并使用 XOP 元素来引用二进制数据。SWA 将二进制数据存储在 MIME 部分中,并通过 href 属性来引用。
    3. 将 XOP 元素或者 SWA 的 href 属性所对应的二进制数据进行编码,并将编码后的数据作为消息正文的一部分发送出去。
  2. 优化包括基于uri的引用

    从发送者到最终接收者或中介的SOAP消息中包含对Web资源的基于uri的引用。

    SOAP 消息将 Web 资源的 URI 作为 message part 嵌入到消息正文中,并在SOAP消息头部添加 “Content-Location” 属性来指示 Web 资源的位置。

    接收者通过解析 “Content-Location” 属性得到响应 Web 资源的 URL,然后根据 URL 获取到对应的 Web 资源。

    这种方式可以使得 SOAP 消息只携带 Web 资源的路径而非实际内容,从而避免了消息体积的过大,提高了传输效率。

Java服务平台*2(平台异常处理、handler)

异常处理

Mapped Exceptions

  • @WebFault注释映射的异常。
  • 与映射异常对应的故障码始终是SOAP-ENV:Server
  • JAX-WS WSDL到Java的映射绑定WSDL:fault消息以生成Java.lang. exception的子类
  • 因此,使用从wsdl:portType映射的SEI实现了Web服务,那么返回SOAP错误的一个选项是抛出映射的异常,JAX-WS运行时将自动将其转换为适当的wsdl:fault,包装在SOAP正文中,然后返回

Unmapped Exception

  • SOAPFaultException封装了一个javax.xml.soap.SOAPFault,它直接映射到SOAP 1.1错误消息
  • 其他异常(除了SOAPFaultExceptions和@WebFault映射异常)也被JAX-WS转换为SOAP故障消息
  • 没有使用SEI且没有任何可以利用的映射异常,或正在使用SEI但必须处理与wsdl:fault不对应的异常,则可以构造并抛出SAAJ类javax.xml.ws.soap.SOAPFaultException的实例。JAX-WS运行时将其转换为SOAP错误消息并将其返回给客户端
  • 当WSDL中没有定义逻辑错误时,我们抛出一个通用的javax.xml.ws.WebServiceException——所有JAX-WS运行时异常的基异常类

Handler

Server-Side Handlers

  • 在JAX-WS中,服务器端处理程序使用@HandlerChain注释配置

  • 还可以通过XML中定义的handler

  • handler-chain元素表示处理程序链,它的子元素,即所有处理程序元素,按照在运行时执行的顺序表示处理程序(输出SOAP响应的相反顺序)。

    但是,根据JAX-WS规范,如果混合使用逻辑和协议处理程序,则逻辑处理程序在协议处理程序之前执行,但保留两组中的相对顺序

Client-Side Handlers

  • Client-Side Handlers

    使用JAX-WS,可以通过编程方式完成

    也可以使用 @javax.jws.HandlerChain注释完成

平台三种主流开发模式

  • start from Java

    (SFJ)开发模式是WS-Metadata实现所需的唯一开发模式。

    首先开发一个Java类,然后将该类部署为Web服务,在大多数情况下,是用@WebService对其进行注释。JAX-WS和JAXB运行时引擎将使用标准映射将该类映射到WSDL文档。

    在SFJ模式中,如果需要调整WSDL或XML类型的形状,可以通过向类中添加注释来完成。

  • start from WSDL

    使用预先存在的WSDL并使用WSDL编译器(作为JAX-WS实现的一部分提供)来生成一组实现WSDL的Java程序元素(SEIs)。

    然后,使用适当的业务逻辑实现SEIs,以实现WSDL定义的Web服务。

  • start from Java and WSDL

    1. 从打算实现它的 Java 类上的 @WebService 注解中引用一个预先存在的 WSDL。这个类上的注解必须将该类映射到所引用的 WSDL。
    2. 要求非常熟悉注解如何塑造WSDL。
    3. 在SFWJ开发模式中,预先存在的XML模式类型必须映射到预先存在的Java对象(参数和返回类型)。
    4. 开发人员使用JAX-WS WSDL编译器按照SFW开发模式,从现有的WSDL生成SEI;然后,使用包装器将此SEI映射到现有类
    5. 涉及到将现有的Java映射到现有的XML Schema和WSDL时,JWS并不能提供很大的帮助

一道问答(12分)

一堆JSR干了什么事,完成的任务有哪些

Server Side

  1. JWS将Port组件定义为Web服务的服务器视图。
    • 端口组件可以被打包成WAR或EJB JAR
    • WSEE定义了部署过程和打包结构
    • WS-Metadata描述了打包后的类的注释如何塑造部署
    • Java EE 5端口组件的部署对应于WSPA参考系统中部署子系统的一个功能。
  2. WSDL的结构由JAX-WS WSDL/Java映射决定,可以使用注释自定义
  3. 当端点通过 HTTP POST 收到 SOAP 请求时,部署的 Web 服务的调用被启动。
  4. Web服务的端点通常由侦听部署期间指定的端点URL的servlet类实现
    • 它是JWS实现的一部分
    • 在部署期间,WSEE运行时读取注释和/或部署描述符,确定端点URL,并配置容器的内部以在该端点部署侦听器
  5. JAX-WS运行时从SOAP消息中提取XML参数
  6. XML参数被反序列化为Java参数
    • 这种反序列化由JAXB运行时处理
    • JAXB运行时使用自省来检查目标类上的注释,并使用该信息(连同JAXB定义的标准Java/XML绑定)生成目标参数的实例
  7. 然后,调用Java目标
  8. Java返回类型类被移交给JAXB序列化,以成为XML返回类型实例(由Java返回类上的注释控制)
  9. JAX-WS运行时接受XML返回类型实例并将其包装在SOAP响应中
  10. 最后,SOAP响应作为HTTP响应的有效负载发送回请求者

server

Client Side

  1. 在编译客户机应用程序之前,使用WSDL到Java映射工具生成SEI
  2. 在运行时,JAX-WS javax_xml.ws.Service 类的一个实例被用来提供将被调用的 Web 服务的客户视图。Service.getPort 方法之一被用来获取上一步生成的 SEI 的运行时实例。
  3. 通过调用代理实例上的一个SEI方法来启动调用:
    • 注释用于将JAXB参数和方法调用转换为SOAP请求
    • 生成SOAP请求之后,在将其发送到Web服务端点之前,将调用处理程序(由WS-Metadata规范附加)
  4. 处理程序处理之后,SOAP请求消息被发送到Web服务,并返回一个SOAP响应。SOAP响应以相反的顺序处理
    • 首先,应用处理程序
    • 然后,对SOAP响应参数进行反序列化(通过JAXB运行时)
  5. 最后,代理实例返回JAXB实例作为返回值

client

往年卷A

  1. 关于SOA,以下哪些声明是正确的?(A)

    A. 三角形SOA操作模型中涉及的三个角色是: 服务请求者、服务提供者和服务注册处

    B. 服务可以非正式地分为任务服务、实体服务和实用服务,其中,只有任务服务可以作为服务组合来实现
    C. 在面向服务的同时,软件开发分为三个阶段,即平台开发、服务开发和应用开发,应用开发可以由业务专家以服务组合的方式进行。
    D. Web服务是一种面向服务的编程语言,在SOA中用来构建服务。
    E. 只要是自足的、与平台/实现无关的、可重复使用的,本地或网络软件组件都可以被视为服务。

  2. 以下哪项是文档对象模型(DOM)可能不被用于某个XML应用程序的最佳原因?(C)
    A. 该应用需要复杂的处理
    B. 可以允许该应用是非验证性的
    C. 该应用程序在内存使用方面受到很大的限制
    D. 架构要求使用属性

  3. XSL样式表是一个XML文档吗?(A)
    A.是
    B.不是
    C. 取决于文件头
    D. 只有当它被应用于一个XML文档时

  4. 在SOAP消息中,以下哪个部分在env:Envelope中是必须的?(xmlns:env=”http://www.w3.org/2003/05/soap-envelop")(B)
    A. env:Header
    B. env:Body
    C. env:Fault
    D. A.和B.都是

  5. 关于SOAP,以下哪些声明是不正确的?(D)

    A. SOAP是一种消息交换协议,它提供了一种无状态的、单向的消息交换范式,但可以用来创建更复杂的交互模式
    B. 在SOAP处理模式中,定义了两种类型的中间人:转发中间人和主动中间人
    C. 在SOAP故障消息中,env:body的直接子元素应该是env:fault(xmlns:env=”http://www.w3.org/2003/05/soap-envelope“)

D. 在SOAP处理模型中,SOAP头是用来携带增值字符信息的,它们可以被最终接收者和/或中间人处理。SOAP体是用来携带从初始发送者到最终接收者的有效载荷,它可以被最终接收者和/或中间人访问,但它只能被最终接收者修改。

  1. 以下哪个元素不能成为WSDL中描述部分的DIRECT子元素(在 “http://www.w3.org/ns/wsdl “的命名空间下)?(E)

    A. types
    B. interface
    C. binding
    D. service
    E. endpoint(端点)
    F. import

  2. 关于 WSDL,以下哪项不正确?(C)
    A. WSDL 文档用于定义服务,从某个 WSDL 文档派生的服务具有类似的能力。
    B. 元素interface和operation被用来定义服务的抽象能力,而元素binding、endpoint和service被用来将接口与具体的消息和部署信息联系起来。
    C. 一个interface中的操作可以在一个名称空间下共享相同的名称,只要它们对输入/输出消息有不同的定义。这种特性被称为”操作重载”。
    D. 由于故障信息是由接口中的操作共享的,所以元素fault被定义为元素interface的直接子元素,并由 QName 来引用。
    E. 除了XML模式,我们还可以在WSDL中使用其他模式定义语言。

  3. 关于代码1,以下哪项规范不正确?(B)
    A.头块交易只需要被最终的接收者处理,如果最终的接收者失败了,应该产生一个SOAP故障消息
    B.由于头块交易定义了交易ID,响应消息(如果有的话)必须包含这个头块,而不改变,否则,我们不能实现SOAP消息的相关性,因此应该产生一个SOAP故障消息
    C. 只要有需要,就可以在这个SOAP消息中添加多个头块以支持更多的字符。
    D.只要有需要,元素体中可以包含多个直接子元素

  4. 代码1中所示的SOAP消息最可能是一个(B)
    A. XML-basod内容交换的消息
    B. RPC请求消息
    C. RPC响应消息
    D. 故障消息

  5. 关于代码1,以下哪项规范不正确?(C)
    A. 这个SOAP消息的发送者应该期待一个HTTP响应消息。由于HTTP是面向连接的,地址信息在HTTP响应消息中是不必要的。
    B. 在SOAP规范中,寻址方法是由HTTP规范定义的,而不是SOAP规范。
    C. 如果HTTP地址URI中的parametcr code-FT35ZBQ被用来识别资源,那么这个SOAP消息是Web架构兼容的,SOAP规范规定了URI计算的默认算法
    D. 属性encodingStyle用于定义元素的序列化方案。它的值是一个特定于应用的决定,并且假定互操作的能力已经被 “out-of-band”解决了。

  6. 根据Code-2,以下哪项声明不正确?(B)
    A.元素操作中的属性模式给出了这个操作的MEP(消息交换模式)。MEP由URI识别,不限于WSDL 2.0预先定义的8种类型。
    B.如果在元素操作中没有属性模式,这个操作的 MEP 由子元素(输入、输出、过失、过失)的存在和顺序决定。
    C. 代号 “#any “意味着检索操作接收任何单一元素作为输入。
    D. “reservationDetails.xsd “定义了消息类型 “list:reservationList”,如果消息类型改变了,WSDL 文档仍然可以保持不变。
    E. 元素描述可以包含多个接口,只要它们有不同的名称。

  7. 根据Code-2,以下哪些声明是不正确的?(B)
    A.在WSDL扩展中定义的属性wsdlx:safe=”true “表示该操作不会以任何方式约束客户。在这个例子中,我们将使用HTTP PQST来调用这些操作。
    B. 元素服务在接口和端点之间定义了一对一的对应关系。元素服务只能有一个端点作为子元素。
    C.元素服务中的一些信息,如属性地址,只有在服务部署后才能被确认
    D. 本例中的元素绑定是不可重用的。在可重复使用的绑定中,属性界面和特定于操作和特定于故障的绑定细节应该被省略。

  8. 根据Code-2,以下哪些声明是正确的?(C)
    A. 属性schemaLocation=”reservationLíst. xsd “用于定位模式,如果我们在这里找不到模式,将产生一个SOAP故障。
    B. 由于interface reservationListInterface中没有定义故障,ServiceRequestor将不会收到任何SOAP故障按摩。
    C. 这个例子中的所有属性 messageLabel 都可以省略
    D. 由于在检索操作中使用了 “in-out “MEP,因此在SOAP-HTTP绑定中为该操作使用SOAP Request-ResponseMEP是唯一选择。

  9. 在 JAX-WS 处理程序框架中,对于一个端口类型(在 WSDL 1.1 中),在客户端定义的处理程序链是 LH1/SH1/LH2/SH2,而在服务器端定义的处理程序链是 SH3/LH3/LH4/SH4(LH=逻辑处理程序,SH-SOAP 处理程序)。在request-response调用期间,正确的顺序是什么?(B)
    A. SH2/SH1/LH2/LH1/LH4/LH3/SH4/SH3;SH3/SH4/LH3/LH1/LH2/SH1/5H2
    B. LH1/LH2/SH1/SH2/SH3/SH4/LH3/LH4;LH4/LH3/SH4/SH3/SH2/SH1/LH2/LH1
    C. LH1/SH1/LH2/SH2/SH3/LH3/LH4/SH4;SH4/LH4/LH3/SH3/SH2/SH1/LH2/SH1
    D. SH2/LH2/SH1/LH1/SH4/LH4/LH3/SH3;SH3/LH3/LH4/SH4/LH1/SH1/LH2/SH2

  10. 以下哪些元素不能包含在UDDI中?(D)

    A. businessEntitiy
    B. businessService
    C. bindingTemplate
    D. TechnicalService(正确:Technical Models
    E. publisherAssertion

  11. 关于JAXR,以下哪些声明是不正确的?(B)
    A. JAXR是一个JSR,它定义了执行注册表操作的API
    B. JAXR定义了RegistryProviders和JAXR Providers之间的通信协议和消息类型
    C. 在JAXR中定义了两个能力配置文件,0级配置文件和1级配置文件
    D. 用于UDDI的JAXR提供者必须是0级的。用于 ebXML 的 JAXR 提供者必须是 1 级兼容的。
    E. JAXR可插件提供者用于为JAXR客户提供抽象能力组。注册处专用的JAXR提供者用于支持各种注册处标准。

往年卷B

  1. 关于SOA,以下哪项声明是正确的?(B)
    A. 三角形SOA操作模型中涉及的三个角色是: 服务请求者、服务提供者和服务平台
    B. 在以服务为导向的同时,软件开发分为两个阶段,服务开发和应用开发。应用开发可以由业务专家通过服务构成来完成。
    C. 网络服务是一种面向服务的编程语言,用于构建SOA中的服务。
    D. 只要是自足的、与平台/实现无关的、可重复使用的本地或网络软件组件,都可以被视为服务。
    E. 按照任务和属性,服务可以被非正式地划分为任务服务、实体服务和实用服务。在这些服务中,只有任务服务可以实现为服务构件。

  2. XSL样式表是一个XML文档吗?(A)
    A. 是的
    B.不是
    C. 取决于文件头
    D. 只有当它被应用于一个XML文档时

  3. 考虑一下下面的XML:(B)
    Click<1ink>hereto apply
    如果使用SAX解析器,以下事件将以什么顺序发生?

    1. Start element-Name: paragraph
    2. End element-Name: paragraph
    3. Start element-Name: Link
    4. End element-Name: link
    5. Characters: Click
    6. Characters: here
    7. Characters: to apply
    8. End characters

    A. 1,5,7,3,6,4,2
    B. 1,5,3,6,4,7,2
    C. 1,5,6,7,3,4,2
    D. 1,5,8,3,6,8,4,7,8,2

  4. 在SOAP消息中,以下哪个部分在env:Envelope中是必须的?(B)

    (xmlns:env=”http://www.w3.org/2003/05/soap-envelop“)
    A. env:Header
    B. env:Body
    C. env:Fault
    D. env:Binding

  5. 关于SOAP,以下哪些声明是不正确的?(A)
    A. SOAP是一种网络协议,它提供了一种无状态的、单向的消息交换范式,但可以用来创建更复杂的交互模式
    B. 一般来说,SOAP主体是用来将有效载荷从最初的SOAP发送者传送到最终的SOAP接收者;SOAP头是用来传送增值服务的信息,它们可以被最终的SOAP接收者和/或SOAP中介机构处理。
    C. 在SOAP处理模型中,定义了两种类型的中间人:转发中间人和主动中间人。
    D. 在一个故障SOAP消息中,只有一个元素env: fault在env:body(xmlns:env=”http://www.w3.org/2003/05/soap-envelope")中。

  6. 代码-1显示了一个 (C)
    A.基于XML的内容交换的SOAP消息
    B. RPC请求的SOAP消息
    C. RPC响应SOAP消息
    D. 故障消息

  7. 代码-1 中使用的mustUnderstand属性表示头块 (C)
    A. 必须由 “初始发送者 “节点处理
    B. 必须由 “中间人 “节点处理
    C. 必须由 “最终接收者 “节点处理
    D. 必须由信息路径上的所有节点处理

  8. 以下哪个元素不能成为 WSDL 中描述元素的 DIRECT 子元素(在 “http://www.w3.org/ns/wsdl “的名称空间下)?(E)
    A. 类型
    B. 接口
    C. 绑定
    D. 服务
    E. 端点
    F. 进口

  9. 关于 WSDL,以下哪项声明是不正确的?(D)
    A.WSDL文档用于定义服务,从某个WSDL文档中派生的服务具有类似的能力。
    B. 除了XML模式,我们还可以在WSDL中使用一些其他的模式定义语言。
    C. 元素接口和操作被用来定义服务的抽象能力,而元素绑定和服务被用来将接口与具体的消息和部署地址联系起来。
    D. 接口中的操作可以在一个名称空间下共享相同的名称,只要它们对输入/输出消息有不同的定义,这被称为 “重载”。
    E. 由于故障信息是由接口中的操作共享的,所以元素故障被定义为元素接口的直接子元素,并由QName引用。

  10. 根据Code-2,以下哪项声明不正确?(B)
    A. 操作元素中的Pattern属性给出了这个操作的MEP(message exchangeepattern)。
    B. 如果操作元素中没有Pattern属性,这个操作的MEP是由操作中的子元素的存在和顺序决定的。
    C. 样式属性确定了在定义该操作时遵循的某套规则
    D. 接口元素可以包含多个操作元素,只要它们有不同的名称即可。

  11. 根据Code-2,以下哪项声明不正确?(B)
    A.WSDL扩展中定义的wadlx:safe表示该操作不会以任何方式损害客户。
    B.messageLable用来表示消息方向。它的值可以是 “in”、”out”、”in/out”。
    C. opLogMessage操作在reservationInterface接口中也可用。
    D. 虽然在Code-2中没有显示,但在messageLogInterface接口或reservationInterface接口中应该有一个故障清除。

  12. 在JAX-WS中,处理程序框架被用来 (B)
    A. 在java值类和XML消息之间进行转换
    B. 提供消息的预处理和后处理
    C. 部署服务
    D. 访问XML注册表

  13. 关于JAXB,以下哪项声明是不正确的?(D)
    A. JAXB主要是Java和XML之间的一个绑定工具
    B. 它被WSPA中的序列化子系统和部署子系统所使用。
    C.基于标准的绑定,JAXB定义了Mapping Annotations和BindingLanguage来进行自定义的映射工作。
    D. JAXB支持三种开发模式:SFW(从WSDL开始)、SFJ(从Java开始)和SFWJ(从WSDL和Java开始)。

  14. 在UDDI中,以下哪个元素包含WSDL的规范?(D)
    A. businessEntitiy
    B. 业务服务
    C. bindingTemplate
    D. tModel
    E. publisherAssertion

  15. 关于JAXR,以下哪项声明是不正确的?(B)
    A. JAXR是一个JSR,用于定义执行注册表操作的API
    B. JAXR定义了RegistryProviders和JAXR Providers之间的通信协议和消息类型。
    C. JAXR中定义了两个能力配置文件,0级配置文件和1级配置文件
    D. 用于 UDDI 的 JAXR 提供者必须是 0 级兼容的。ebXML的JAXR提供者必须是1级兼容的。
    E. JAXR可插件提供者被用来为JAXR客户提供抽象的能力组。