`

SOAP and JDOM

阅读更多

        看完上一篇 blog: Web 服务搜索与执行引擎 ( )—— 初看客户端如何调用 Web 服务 , 我想我们对当前客户端如何调用 Web 服务的现状 , 无论是从高层接口的利用还是低层接口自己手动构建 SOAP 消息都有了最初步的印象了 . 接下来将要进行的是整个项目最核心的部分之一 : 服务的执行 . 我将为大家展示我们在项目中如何使用 SOAP with Attachments API for Java (SAAJ) ,简化创建和发送 SOAP 消息的详细过程。

Web 服务的基础是以标准格式发送和接收消息,这样所有系统都可以理解消息。通常情况下,这种标准格式是 SOAP SOAP 消息可以手工生成和发送,但是如果说我们按上篇 blog 那样 : 在客户端,首先创建一个 HttpConnector 对象,负责 HTTP 连接。设定 Connector 的一些头部信息,比如 EndPoinURL SoapAction 等。如果网络连接需要使用代理服务器,那也要在这里设定相关的信息。接着创建 SoapSerializer 对象,用于生成 Soap 消息。按照 WSDL 里定义,把所有参数按顺序序列化,得到一个完整的 SOAP 请求消息。该 Soap 消息,作为 Payload 通过 HttpConnector 被发送到服务端。最后,生成一个 SoapReader 对象,负责读取服务端返回的 SOAP 消息,取得其中的返回值。

按上面这种 SOAP 消息的构建方法的话就会变得复杂起来 , 所以说有必要借助于一些 API 来简化我们的操作 . 有几个基于 Java API 可以用来构建低层 SOAP 消息来访问 Web 服务。这些 API 包括 SAAJ Web 服务调用框架( WSIF )、上篇 blog 里提到的 Axis 等。

Ø              选择 SAAJ 的理由

我们最终选择了 SAAJ, 因为基于简单及适用性来考虑 .SAAJ 无疑很适合基于文档的同步或者异步 Web Service SAAJ 使用简单,有助于在 Java 环境中集成各种 Web Service ,它扩展了对文档风格的 Web Service 通信的自然支持( natural support )。 SAAJ 还支持基于标准接口上的 XML 消息传递,并且这一点得到了供应商的广泛支持。另外 SOAP with Attachments API for Java (SAAJ)—— Java API for XML Messaging (JAXM) 的一个分支 —— 能够使许多必需的步骤变得自动化,例如创建上面所说的连接,或者创建和发送实际消息。

Ø              什么是 SAAJ

SAAJ 是在松散耦合软件系统中利用 SOAP 协议实现的基于 XML 消息传递的 API 规范。顾名思义, SAAJ 支持带附件的 SOAP 消息。
  对于 Java API for XML Messaging (JAXM) JAXM 1.0 的理念是通过提供消息传递和 SOAP API ,允许开发人员根据 SOAP 编写支持消息传递标准的业务应用程序。随着 JAXM 1.1 版的推出, SOAP API (javax.xml.soap) 被分割成了 SAAJ1.1 规范和 JAXM1.1 JAXM1.1 只包含基于消息传递的 API javax.xml.messaging )。目前,正在使用的 SAAJ 版本是 1.2

Ø              如何使用

回想那篇 blog, Web 服务搜索与执行引擎 ( )——WSDL 解析精髓 , 提到了为了使用 SAAJ 构建 SOAP 消息调用该服务,我们将需要从 WSDL 收集下列最基本的信息:

目标名称空间

服务名称

端口名称

操作名称

操作输入参数  

SOAP 文档结构简单,利用 SAAJ 构建起来也比较方便。但我们需要将用户从网页中输入的数据作为 SOAP 的有效负载发送至异构平台的服务,如何来构建这个有效负载呢?按照什么样的格式将用户输入的数据放入 SOAP 的有效负载中呢?格式可以从解析 WSDL 文档过程中知道,即上面说的那些基本信息 , 但怎么来匹配用户的输入数据呢?这时就需要以 WSDL 中解析出来的参数名称作为用户从网页中输入的文本框的名字,从而匹配了每一个子参数的值,然后即可构建 SOAP 消息的有效负载。然后将 SOAP 消息发送至远程平台。

调用后,将返回一个 SOAP 消息返回值,我们需要解析,并将结果在网页中呈现给客户,我们利用了 JDOM 技术,根据从 WSDL 中解析出的返回信息来提取 SOAP 中的返回值,最终呈现给用户。

具体过程 包括 5 个步骤:

1.        创建 SOAP 连接

2.        生成 SOAP 消息

3.        填充消息

4.        发送消息

5.        检索响应

SOPA 消息的结构

大家也可以去看看我的那篇 blog: Web 服务搜索与执行引擎 ( )—— 重温 WSDL SOAP , 再次复习下 WSDL SOAP 的有关知识 . 首先来看看消息自身的结构。一条基本的 SOAP 消息由带有两个主要部分的信封( envelope )构成:头部和主体。应用程序确定如何使用这些部分,但整个消息必须遵循特定的 XML 结构,例如:
清单 1. 一条示例 SOAP 消息

 这里,头部是空的,而主体包含了有效信息,或要传递的消息。在本例中,它是请求某本书价格的消息。

< SOAP-ENV:Envelope  xmlns:SOAP-ENV ="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:xsi ="http://www.w3.org/1999/XMLSchema-instance"  xmlns:xsd ="http://www.w3.org/1999/XMLSchema" >  
 
< SOAP-ENV:Header  />
  
      < SOAP-ENV:Body >  

        
< ns1:getPrice  xmlns:ns1 ="urn:Book"  

             SOAP-ENV:encodingStyle
="http://schemas.xmlsoap.org/soap/encoding/" >  

                  
< isbn  xsi:type ="xsd:string" > 123544111 </ isbn >  

        
</ ns1:getPrice >  

    
</ SOAP-ENV:Body >  

</ SOAP-ENV:Envelope >  

 

注意消息的结构。 Envelope 包含 Header Body 元素,这三者都是 http://schemas.xmlsoap.org/soap/envelope/ namespace 的一部分。应用程序使用 SOAPConnection 来发送消息。

创建连接和消息

清单 2. 创建连接

import javax.xml.soap.SOAPConnectionFactory;

import javax.xml.soap.SOAPConnection;

public   class  DynamicInvokeInterce ...{

......

public   List invokeOperation(Operation operation)  throws  Exception ...{

      
try   ...{

         SOAPConnectionFactory soapConnFactory 


                            SOAPConnectionFactory.newInstance();

         SOAPConnection connection 


                             soapConnFactory.createConnection();         

         connection.close();

        }
 
catch (Exception e)  ...{

            System.out.println(e.getMessage());

        }


}


}


……

 

     创建一个 SOAP 连接 , 如上清单 2 所示。 SAAJ 客户机可以利用 SOAP Connection Factory ,通过创建 SOAPConnection 来建立点到点的同步连接。该连接提供了同步调用服务的方法。

其次 , 工厂还创建了消息自身:

清单 3. 创建消息对象

import  javax.xml.soap.SOAPConnectionFactory;

import  javax.xml.soap.SOAPConnection;

 
import  javax.xml.soap.MessageFactory;

import  javax.xml.soap.SOAPMessage;

import  javax.xml.soap.SOAPPart;

import  javax.xml.soap.SOAPEnvelope;

import  javax.xml.soap.SOAPBody;

public   class  DynamicInvokeInterce  ... {

   ……

public   List invokeOperation(Operation operation)  throws  Exception

      
try   ... {

         SOAPConnectionFactory soapConnFactory 
=  

                            SOAPConnectionFactory.newInstance();

         SOAPConnection connection 
=  

                             soapConnFactory.createConnection();

         MessageFactory messageFactory 
=  MessageFactory.newInstance();

         SOAPMessage message 
=  messageFactory.createMessage();         

         SOAPPart soapPart 
=  message.getSOAPPart();

         SOAPEnvelope envelope 
=  soapPart.getEnvelope();

         SOAPBody body 
= envelope.getBody();      

         connection.close();

   …

}

 

    如清单 3 所示 , 使用 MessageFactory 创建消息自身。这一消息已经包含了空的基本部分,比如 envelope header SOAPPart 包含了 envelope ,而 envelope 又包含了主体。从而创建了对所需对象(比如 SOAPBody )的引用。

接着,填充 SOAPBody
清单 4. 填充主体

...

import  javax.xml.soap.SOAPBody;

import  javax.xml.soap.SOAPElement;

public   class  DynamicInvokeInterce  ... {

  
public   static   final  String XSI_NAMESPACE_PREFIX  =   " xsi " ;

public   static   final  String XSI_NAMESPACE_URI  =   " http://www.w3.org/2001/XMLSchema-instance " ;

public   static   final  String XSD_NAMESPACE_PREFIX  =   " xsd " ;

       
public   static
分享到:
评论

相关推荐

    XML_XSL_DTD_SCHEMA_SAX_DOM_JDOM_WEBSERVICE简介.pdf

    Web服务通常遵循SOAP(Simple Object Access Protocol)、WSDL(Web Services Description Language)和UDDI(Universal Description, Discovery, and Integration)等标准。这些标准定义了如何发布、查找、调用和...

    java and xml 3rd edition 3

    Java作为一种多平台、面向对象的编程语言,提供了丰富的API和库来支持XML的处理,例如DOM(文档对象模型)、SAX(简单API for XML)和StAX(流式API for XML)等解析器,以及JAXB(Java架构绑定)和JDOM等对象模型。...

    Java and XML(英文第三版)_java_xml_birdsolc_源码

    《Java and XML(英文第三版)_java_xml_birdsolc_源码》是关于Java与XML集成编程的一本权威指南,特别适合于那些希望深入理解如何在Java应用程序中有效地使用XML技术的开发者。这本书详细阐述了Java平台上的XML处理...

    java and xml 3rd edition

    7. **SOAP(Simple Object Access Protocol)和Web Services**:讲解如何使用Java和XML构建和消费SOAP Web服务,包括JAX-RPC和JAX-WS框架。 8. **JAXB2和XMLBeans**:对比分析JAXB2和XMLBeans,两者都是Java与XML...

    webservice技术在数据接口方面的应用.pdf

    应用服务器是承载Web Service运行的平台,可以选择任何支持UDDI(Universal Description, Discovery, and Integration)的服务器来发布和查找服务。在项目实践中,通过IDE生成WSDL文件,然后编写Java服务端代码,...

    J2EE And XML Development

    该书不仅对J2EE和XML的重要性进行了阐述,还详细讲解了如何在J2EE应用的每一层中有效地使用XML,以及如何解开Java XML API网,包括JAX家族及其他新兴标准如JDOM等。 ### J2EE与XML:为何结合? J2EE作为企业级应用...

    J2EE And XML

    3. **Web服务的实现**:介绍如何使用SOAP(Simple Object Access Protocol)、WSDL(Web Services Description Language)和UDDI(Universal Description, Discovery, and Integration)来构建和消费Web服务,实现跨...

    jboss 第二部分

    它支持JAAS(Java Authentication and Authorization Service),并提供了一套易于使用的API来处理安全性问题,如身份验证、会话管理以及权限控制。 总结起来,JBoss作为Java EE的实现,其强大之处在于它整合了众多...

    利用Java技术进行XML编程3

    8. **Parsers and Transformers**: `javax.xml.parsers`包包含了创建解析器的类,如`DocumentBuilderFactory`,而`javax.xml.transform`包提供了转换XML文档的工具,如`TransformerFactory`和`Transformer`,可以...

    Cactus 业务流程执行平台的研究和实现

    此外,平台还利用 JSP(JavaServer Pages)和 AJAX(Asynchronous JavaScript and XML)技术构建了一个服务搜索引擎,用户可以通过此搜索引擎快速找到所需的服务。这种交互式的Web应用提供了实时反馈,提升了用户...

    Effective.XML.50.Specific.Ways.To.Improve.Your.XML

    4. **XML与Web服务**:XML在Web服务中的应用,如SOAP(Simple Object Access Protocol)消息格式,以及WSDL(Web Services Description Language)用于描述Web服务。 5. **AJAX与XML**:AJAX(Asynchronous ...

    Java学习的30个目标.txt

    - **JDOM**:了解JDOM库的使用方法,学会使用JDOM构建和解析XML文档。 - **DOM4J**:掌握DOM4J的特性,学会使用DOM4J进行XML数据操作。 - **JAXR**:了解JAXR在XML注册表中的应用。 #### 十三、Web服务 - **JAX-...

    XML 高级编程.rar

    5. **XMLHttpRequest**:在Web开发中,XMLHttpRequest对象常用于异步获取和发送XML数据,是AJAX(Asynchronous JavaScript and XML)技术的基础。 6. **XML绑定**:许多编程语言支持XML与对象模型之间的绑定,例如...

    J2EE面试题集锦

    4. **JAF (Java Authentication and Authorization Framework)** - JAF提供了一个框架,支持开发者通过自定义策略来实现安全控制功能。 5. **RMI (Remote Method Invocation)** - RMI允许一个Java对象调用另一个...

    2009年淘宝网J2EE面试题集锦(附答案)

    Web服务是一种通过网络进行通信的软件,使用标准的XML格式交换数据,常见的Web服务协议有SOAP(Simple Object Access Protocol)和REST(Representational State Transfer)。 这些知识点涵盖了J2EE开发的基础到...

    xml 高级编程1-6

    - **UDDI(Universal Description, Discovery, and Integration)**:一种服务发现标准,通过XML记录服务信息。 7. **XML编程API** - **JDOM, DOM4J (Java)**:Java平台上的XML处理库,提供对DOM和XPath的支持。 ...

    学习Java语言的30个参考,让你坐拥别人之上的30个擦考

    - **JNDI、JMS**:学习Java Naming and Directory Interface、Java Message Service的使用方法。 - **JTA、JMX**:了解事务管理、系统监控的相关技术。 ### 16. EJB技术 - **会话Bean、实体Bean**:掌握Session ...

    Websphere应用与实践

    1. **创建数据源**:数据源是应用连接数据库的关键,需指定JNDI(Java Naming and Directory Interface)名称以便应用通过JNDI查找并使用。 2. **修改.ear文件**:.ear文件是J2EE应用的打包格式,需要更新其中的资源...

    J2EE面试题集附答案

    - **JAF** (Java Authentication and Authorization Service): 提供了一种框架来支持身份验证和授权机制。允许开发人员自定义这些服务。 - **RMI** (Remote Method Invocation): 允许在不同JVM上的对象直接调用...

    Java高手的25个学习要点.txt

    JNDI(Java Naming and Directory Interface)提供了一种查找和访问命名服务的方式;JMS(Java Message Service)则是用于消息传递的应用程序接口;JTA(Java Transaction API)/ JTS(Java Transaction Service)则...

Global site tag (gtag.js) - Google Analytics