看一个简单的Web Service
java 代码
    - package org.jivaro.sq;   
    
 -   
    
 - import java.util.HashMap;   
    
 -   
    
 - public class StockQuoteService {   
    
 -     private HashMap map = new HashMap();   
    
 -        
    
 -     public double getPrice(String symbol) {   
    
 -         System.out.println("Parameter Symbole : " + symbol);   
    
 -         Double price = (Double) map.get(symbol);   
    
 -         if(price != null) {   
    
 -             return price.doubleValue();   
    
 -         }   
    
 -         return 42.00;   
    
 -     }   
    
 -        
    
 -     public void update(String symbol, double price) {   
    
 -         map.put(symbol, price);   
    
 -     }   
    
 - }   
 
 
这是一个简单的web service,和写一个类没有任何不同。持有一个map对象,getPrice方法,通过传入字符串,得到对应的金额,update方法则是添加了一个字符串-金额的组合,它对应的services.xml如下:
xml 代码
    - <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">  
    
 -         org.jivaro.sq.StockQuoteService   
    
 -     parameter>   
    
 - service>   
 
 
这个服务很好理解。注意RPCInOnlyMessageReceiver和RPCMessageRecevier,前者是“只进”的方法,后者是“可进可出”的方法,分别对应了getPrice(有参数,有返回)和update(有参数,无返回)方法。
从现在开始就要了解AXIOM了
1、将上面的服务类转成用AXIOM来实现,看看发生了什么
java 代码
    - package org.jivaro.sq;   
    
 -   
    
 - import javax.xml.stream.XMLStreamException;   
    
 - import org.apache.axiom.om.OMAbstractFactory;   
    
 - import org.apache.axiom.om.OMElement;   
    
 - import org.apache.axiom.om.OMFactory;   
    
 - import org.apache.axiom.om.OMNamespace;   
    
 -   
    
 - import java.util.HashMap;   
    
 -   
    
 - public class StockQuoteAxiomService {   
    
 -     private HashMap map = new HashMap();   
    
 -        
    
 -     public OMElement getPrice(OMElement element) throws XMLStreamException {   
    
 -         element.build();   
    
 -         element.detach();   
    
 -            
    
 -         OMElement symboleElement = element.getFirstElement();   
    
 -         String symbol = symboleElement.getText();   
    
 -            
    
 -         String returnText = "42";   
    
 -         Double price = (Double) map.get(symbol);   
    
 -            
    
 -         if(price != null) {   
    
 -             returnText = "" + price.doubleValue();   
    
 -         }   
    
 -            
    
 -         OMFactory fac = OMAbstractFactory.getOMFactory();   
    
 -         OMNamespace omNs = fac.createOMNamespace("http://sq.jivaro.org", "tns");   
    
 -         OMElement method = fac.createOMElement("getPriceResponse", omNs);   
    
 -         OMElement value = fac.createOMElement("price", omNs);   
    
 -         value.addChild(fac.createOMText(value, returnText));   
    
 -         method.addChild(value);   
    
 -            
    
 -         return method;   
    
 -     }   
    
 -        
    
 -     public void update(OMElement element) throws XMLStreamException {   
    
 -         element.build();   
    
 -         element.detach();   
    
 -            
    
 -         OMElement symbolElement = element.getFirstElement();   
    
 -         String symbol = symbolElement.getText();   
    
 -            
    
 -         OMElement priceElement = (OMElement)symbolElement.getNextOMSibling();   
    
 -         String price = priceElement.getText();   
    
 -            
    
 -         map.put(symbol, new Double(price));   
    
 -     }   
    
 - }   
 
 
天!代码瞬间被膨胀了,参数都被OMElement代替了,这究竟发生了什么(请参看2:services.xml发生了什么),Axis2使用的是AXIOM(AXIs Object Model,一种基于StAX API的类DOM结构)。使用了AXIOM,就规定了服务所定义的方法中的参数必须是OMElement类型,所以我们看到参数的类型都是OMElement了。而方法内代码膨胀也就不足为奇了。
2、看看services.xml又发生了什么变化
xml 代码
    - <service name="StockQuoteService" scope="application">  
    
 -     <description>  
    
 -         Stock Quote Service   
    
 -     description>   
    
 -     <operation name="getPrice">  
    
 -         <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>  
    
 -     operation>   
    
 -     <operation name="update">  
    
 -         <messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>  
    
 -     operation>   
    
 -     <parameter name="ServiceClass">org.jivaro.sq.StockQuoteAxiomServiceparameter>   
    
 - service>   
 
 
services.xml发生了变化,操作被明确地定义了出来,并定义了操作所对应地MessageReceiver,如getPrice对应的是RawXMLINOutMessageReceiver,而update方法对应的成了RawXMLINOnlyMessageReceiver。
这就是使用AXIOM发布的方式。对于AXIOM的理解将继续更新。接下来应该是真正理解AXIOM,包括它的性能,以及客户端如何调用了。