Axis2学习笔记一 (Axiom 篇 )

Axis2学习笔记一 (Axiom 篇 )

                                                                                       

一. 简介

     
 

Axis2 是继 Axis1 之后 Apache 软件组织推出的下一代 Webservice 的实现品 , 和 1.0 比较有如下较大的改进 :

 

1.不是在 Axis1 的基础上扩展,而是重新开发,重新实现。

 

2.支持 SOAP1.1 和 SOAP1.2. 及 REST 风格。

 

3.新的 XML 处理对象模型 Axiom, 更快更有效率。

 

4.客户端支持同步、异步、单通道、双通道。

 

5.支持 HTTP SMTP JMS TCP 多种协议。

 

6.支持可插拔模块功能以强对数据的处理。

       

二 . Axiom

     
    SOAP 协议是基于 xml 做为数据交换的格式,所以 了解 axis2 工作原理 前 我们得了解一下AXIOM , Axis2 的映射 xml 数据的对象模型,其主要类图如下 :
  Axis2学习笔记一 (Axiom 篇 )_第1张图片
   
< 图一 >
 
 

  Axiom 采用最新拉式 (pull)xml 处理方式 :StAX ,拉式处理是最近 xml 解析方法的趁势,相较以前推式 (push) 处理如 dom 和 sax ,拉式将 xml 解析的控制权交给了客户端程序 , 只有当客户端程序需要数据时解析类才会真正从数据流中读取数据,所以这种方式当解析稍大一点 xml 数据时更加有效率。

       
 

  如图一 , 从最高抽象级别 Axiom 共分三大块 : OMXMLParserWrapper,OMFactory, OMNode 和 OMContainer, OMXMLParserWrapper 主要用来包装拉式 xml 数据流 , 这一点类似装饰模式,对处理数据功能进一步加强 ,OMFactory 是 OMNode 和 OMContainer 的工厂类,用于产生其实现类的对象 , OMXMLParserWrapper 的实现类具有 OMFactory 的实例引用 , 可以说 OMXMLParserWrapper 像装配车间 , 将原料 ( 从拉式 xml 数据流获取数据 ) 用机器 (OMFactory) 生产成产品 (OMNode 或 OMContainer 的实现类 ), 最后 OMNode 和 OMContainer 不用说就是映射 xml 文档数据中节点的对象了 , OMNode 代表 xml 文档树最末端的节点, OMContainer 可以包含其它节点的节点,比如图中的 OMElement 扩展了这两个接口 , 这样它既可以有父接点,也可以有子节点。

       
 

  通过 Axiom 一个典型的 xml 文档解析过程如下 :

       
    Axis2学习笔记一 (Axiom 篇 )_第2张图片  
   
< 图二 >
 
 

  如图二展示了一个客户端程序获取一个 xml 文档的根节点的过程 , 其中 StAXOMBuilder 是 OMXMLParserWrapper 的实现类 , OMLinkedListImplFactory 是 OMFactory 的实现类 , OMDocumentImpl 是 OMDocument(OMDocument 扩展了 OMContainer) 实现类,我们可以先看一下一段典型的实现代码,有助于理解 :

 

1. BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(“MyFilePath”)));

2.XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader(reader);

3. StAXOMBuilder builder = new StAXOMBuilder(OMAbstractFactory.getOMFactory(),parser);

4. OMElement root = builder.getDocumentElement();

       
 

  第一步 : 产生一个原始的 xml 数据流

 

  第二步 : 产生拉式 (pull)xml 数据流

 

  第三步 : 产生 StAXOMBuilder 对象

 

  第四步:获取根节点对象 , 获取这个节点的过程如图调用了 StAXOMBuilder 的 next() 方法 , 这个 next() 方法首先调用了 XMLStreamReader 的 next() 方法 ( 真正从数据流中取出数据 ) ,然后调用 OMLinkedListImplFactory 的 createOMElement 方法产生一个 OMElementImpl 对象 , 这个对象构造过程中又调用最初实例化 StAXOMBuilder 对象时产生的 OMDocumentImpl 对象的 addChild() 方法将本身赋给 OMDocumentImpl 对象的一个 documentElement 属性,等于最终返回的值就是这个对象 , 从这里面我们可以看出, OMDocument 及其实现类 OMDocumentImpl 并不直接提供给外界使用 ,最终返回给客户端的是另外一个 OMElementImpl 对象 , 还有在这里我们可以体会到 , 数据真正需要时才会从数据流取出。

转载自http://blog.csdn.net/eastbear2008/archive/2006/08/18/1095069.aspx

你可能感兴趣的:(xml,webservice,jms,REST,SOAP)