Axis2 创建 web service (3) : 示例解读

来源:互联网 发布:excel macro编程 编辑:程序博客网 时间:2024/06/05 10:47

对于一个工具来说,最重要的是读懂里面的sample,下面这篇文章就是对axis2的sample的解读,英文原文链接如下

Axis2 Quick Start Guide

http://axis.apache.org/axis2/java/core/docs/quickstartguide.html

作者解读并非翻译,与原文有一定区别,作为补充

环境准备:

apache-ant-1.9.4

配置好ANT_HOME

apache-tomcat-7.0.55

axis2-1.5.6

配置好AXIS2_HOME

将axis2.war放到C:\apache-tomcat-7.0.55\webapps下面,启动tomcat,打开 http://localhost:8080/axis2/  ,出现下面画面

administration默认用户名密码是 admin/axis2

目录

原文的目录如下,以C:\axis2-1.5.6\samples下面的quickstart, quickstartadb, quickstartaxiom,quickstartjibx, quickstartxmlbeans讲解了不同方式下服务器和客户端的代码

  • Introduction
  • Getting Ready
  • Axis2 services
  • Creating services
    • Deploying POJOs
    • Building the service using AXIOM
    • Generating the service using ADB
    • Generating the service using XMLBeans
    • Generating the service using JiBX
  • Generating Clients
    • Creating a client using AXIOM
    • Generating a client using ADB
    • Generating a client using XML Beans
    • Generating a client using JiBX
  • Summary

*.aar代码结构

*.aar是axis2生成的打包文件,直接将生成的文件放入 C:\apache-tomcat-7.0.55\webapps\axis2\WEB-INF\services 中,在 http://localhost:8080/axis2/services/listServices 中就能看到相应的service,打开就能看到相应的 wsdl

以接下来的quickstart示例来说

生成的aar代码结构如下

- StockQuoteService   - META-INF     - services.xml   - lib   - samples     - quickstart       - service         - pojo           - StockQuoteService.class
注意里面的server.xml

The services.xml file defines the service itself and links the Java class to it

<service name="StockQuoteService" scope="application">    <description>        Stock Quote Sample Service    </description>    <messageReceivers>        <messageReceiver             mep="http://www.w3.org/2004/08/wsdl/in-only"    class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>        <messageReceiver            mep="http://www.w3.org/2004/08/wsdl/in-out"    class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>    </messageReceivers>    <parameter name="ServiceClass">        samples.quickstart.service.pojo.StockQuoteService    </parameter></service>


quickstart  (POJO)

quickstart 示例演示了使用 POJO来创建一个web service

cd C:\axis2-1.5.6\samples\quickstart

ant compile.service

ant generate.wsdl

ant generate.service

剪切生成的 C:\axis2-1.5.6\samples\quickstart\build\StockQuoteService.aar 到 C:\apache-tomcat-7.0.55\webapps\axis2\WEB-INF\services 下面


http://localhost:8080/axis2/services/listServices
http://localhost:8080/axis2/services/StockQuoteService?wsdl
http://localhost:8080/axis2/services/StockQuoteService?xsd
http://localhost:8080/axis2/services/StockQuoteService/getPrice?symbol=IBM
http://localhost:8080/axis2/services/StockQuoteService/update?symbol=IBM&price=100

在这种方式下的开发顺序

1. 创建自己的pojo并编译

2. 根据pojo使用java2wsdl生成相应的wsdl

3. 编写server.xml

4. 将pojo的class和server.xml打包成 .aar包

5. 发布aar包,生成相应的web service

6. 直接通过uri 或者 使用客户端进行调用

quickstartaxiom (AXIOM)

Axis2 uses AXIOM, or the AXIs Object Model, a DOM (Document Object Model)-like structure that is based on the StAX API (Streaming API for XML). Methods that act as services must take as their argument an OMElement, which represents an XML element that happens, in this case, to be the payload of the incoming SOAP message. Method getPrice(OMElement), for example, extracts the contents of the first child of the payload element, which corresponds to the stock symbol, and uses this to look up the current price of the stock. Unless this is an "in only" service, these methods must return an OMElement, because that becomes the payload of the return SOAP message.
关于AXIOM的更详细介绍,可以参考
http://smartzxy.iteye.com/blog/272018
http://smartzxy.iteye.com/blog/274362
其实,说白了,axiom就是一种专有的XML的解析方式
注意 AXIOMClient 的写法

示例代码结构
- quickstartaxiom   - README.txt   - build.xml   - resources     - META-INF       - services.xml       - StockQuoteService.wsdl   - src     - samples       - quickstart         - service           - axiom             - StockQuoteService.java         - clients           - AXIOMClient.java



在这种方式下的开发顺序
1. 创建server类 StockQuoteService.java,并编译

2. 使用java2wsdl生成相应的wsdl

cd C:\axis2-1.5.6\samples\quickstartaxiom\build\classes
java2wsdl -cp . -cn samples.quickstart.service.axiom.StockQuoteService -of StockQuoteService.wsdl

说明:其中-cp是指classpath -cn是指classname

出现错误: 

[ERROR] Required MessageReceiver couldn't be found, thus, default MessageReceiver has been used

解决方式:

Note : You can safely ignore the error it displays.

3. 编写server.xml

4. 将pojo的class,server.xml,wsdl打包成 .aar包

5. 发布aar包,生成相应的web service

6. 编写AXIOMClient.java 客户端进行调用


输出结果

price updatedCurrent price of WSO: 123.42

请参考文章

http://danlley.iteye.com/blog/102164

quickstartadb (ADB)

在这种方式下的开发顺序
1. 编写StockQuoteService.wsdl

2. 使用wsdl2java生成相应的java代码

cd C:\axis2-1.5.6\samples\quickstartadb
wsdl2java -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.service.adb -d adb -s -ss -sd -ssi -o build\service
-ss The -ss switch creates the server side code (skeleton and related files)
-sd The -sd switch creates a service descriptor (services.xml file)
-ssi The -ssi switch creates an interface for the service skeleton.
或者
ant generate.service
ant generate.client
ant generate.all

3. 编写server.xml

4. 将pojo的class,server.xml,wsdl等打包成 .aar包

5. 发布aar包,生成相应的web service

http://localhost:8080/axis2/services/listServices
http://localhost:8080/axis2/services/StockQuoteService?wsdl
http://localhost:8080/axis2/services/StockQuoteService?xsd

6. 编写ADBClient.java 客户端进行调用

ant run.client
42price updated42.35


quickstartxmlbeans (XMLBEANS)

和adb类似

quickstartjibx (JIBX)

和adb类似

axis2五种创建服务方式的比较

实现方式

创建方式

应用文档对象模型解析(消息绑定)

   应用(数据绑定框架)解析

 (xml to DO) 可插入的数据绑定

POJOs

pojo结合rpc模式

AXIOM

     POJOs

     POJO+RPC

 优点:自己写客户端,容易出错,不用熟悉WSDL。

 缺点:用此方法进行调试不容易

AXIOM

axiom api从底层写

AXIOM

 优点:可以进行高效的 SOAP 消息处理

 缺点:全部自己实现,不现实。

ADB

从wsdl生成

相应框架,

然后填写相

应逻辑

AXIOM

      ADB

开发符合软件工程的过程,先写设计,定接口(写WSDL)然后再实现。用WSDL生成代码,不用关心底层的调用。

XMLBeans

AXIOM

      XMLBean(BEA)

JiBX

AXIOM

       JiBX

 

ADB需要用Axis2提供的WSDL2Java生成Stub,然后调用的时候隐藏全部细节,调用方式很简单,和JDK6原生提供的方式很像。
ADB,首先使用命令行生成wsdl对应的Java Stub和Callback文件wsdl2java -uri http://localhost:8080/axis2/services/StockQuoteService?wsdl

AXIOM不需要wsdl2java,完全用axiom的类,封装不够好。

axis2 - 五种创建WebService方式比较

其中前面两种都是从基本的代码开始写起的.后面三种是从WSDL生成代码框架.
1:Deploying POJOs (Plain Old Java Object)
JavaBean类需满足JavaBean规范,如采用标准的setter/getter方法设置成员变量.POJO只是普通的java类.可以认为,JavaBean类都是是POJO,但POJO类未必是JavaBean! 

2:Building the service using AXIOM
     需要我们在代码中,获取XML利用STAX进行获取相关返回值,和创建消息等.是一个比较底层的创建方式.比POJOS复杂. 
     SAX实际上是定义了一个拉式(pull)的xml解析器。 一般的解析xml是通过DOM或SAX形式。 
     DOM的问题是需要一次性读入整个XML,对于大型的xml效率低。STAX是基于事件, 当读取到文档的某个位置会触发到某个事件。而这个读取过程是不受控的, 就是必须一次读完(对这个不熟悉)。这就是所谓推(push)式的。
     STAX也是类似于SAX的事件,但是是由client的next()来控制指针的前进, 是把文件的内容pull出来的。这大大增强了客户端的控制能力,例如写入和修改节点。 
     SAX:Simple API for XMLStAX(Streaming API for XML)是标准的XML处理API,它能够从应用程序的stream对象解析XML数据或把XML数据转换成stream对象。STAX是一个用Java实现的XML拉式解析器 

3:Generating the service using ADB
(Axis2 Databinding Framework )
 
4:Generating the service using XMLBeans
XMLBean是Apache的一个开源项目,如果有一个类似的工具能够实现将对XML的读写转成对JavaBean的操作,将会简化XML的读写,即使对XML不熟悉的开发人员也能方便地读写XML. 这个工具就是XMLBean. 
 
5:Generating the service using JiBX 
JiBX是一个为Java提供的XML数据绑定框架。它可以和现存的类一起运行,使用一个灵活的映射定义文件来决定如何将数据对象转换成XML
其中前面两种都是从基本的代码开始写起的.后面三种是从WSDL生成代码框架.


         
即把整个文件推给client。  


      XMLBean是Apache的一个开源项目,以如果有一个类似的工具能够实现将对XML的读写转成对JavaBean的操作,将会简化XML的读写,即使对XML不熟悉的开发人员也能方便地读写XML. 这个工具就是XMLBean. 

当然,这几种方式都可以通过axis2 eclipse plugin 来自动生成

关于javabean规范

(1)JavaBean 类必须是一个公共类,并将其访问属性设置为 public
(2)JavaBean 类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器,此构造器也应该通过调用各个特性的设置方法来设置特性的缺省值。
(3)一个javaBean类不应有公共实例变量,类变量都为private
(4)持有值应该通过一组存取方法(getXxx 和 setXxx)来访问:对于每个特性,应该有一个带匹配公用 getter 和 setter 方法的专用实例变量。
0 0