Axis2:快速了解AXIOM

看一个简单的Web Service

java 代码
  1. package org.jivaro.sq;   
  2.   
  3. import java.util.HashMap;   
  4.   
  5. public class StockQuoteService {   
  6.     private HashMap map = new HashMap();   
  7.        
  8.     public double getPrice(String symbol) {   
  9.         System.out.println("Parameter Symbole : " + symbol);   
  10.         Double price = (Double) map.get(symbol);   
  11.         if(price != null) {   
  12.             return price.doubleValue();   
  13.         }   
  14.         return 42.00;   
  15.     }   
  16.        
  17.     public void update(String symbol, double price) {   
  18.         map.put(symbol, price);   
  19.     }   
  20. }  

这是一个简单的web service,和写一个类没有任何不同。持有一个map对象,getPrice方法,通过传入字符串,得到对应的金额,update方法则是添加了一个字符串-金额的组合,它对应的services.xml如下:

xml 代码
  1. <service name="StockQuoteService" scope="application">  
  2.     <description>  
  3.         Stock Quote Sample Service   
  4.     description>  
  5.     <messageReceivers>  
  6.         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>  
  7.         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>  
  8.     messageReceivers>  
  9.     <parameter name="ServiceClass">  
  10.         org.jivaro.sq.StockQuoteService   
  11.     parameter>  
  12. service>  

这个服务很好理解。注意RPCInOnlyMessageReceiver和RPCMessageRecevier,前者是“只进”的方法,后者是“可进可出”的方法,分别对应了getPrice(有参数,有返回)和update(有参数,无返回)方法。

从现在开始就要了解AXIOM了

1、将上面的服务类转成用AXIOM来实现,看看发生了什么

java 代码
  1. package org.jivaro.sq;   
  2.   
  3. import javax.xml.stream.XMLStreamException;   
  4. import org.apache.axiom.om.OMAbstractFactory;   
  5. import org.apache.axiom.om.OMElement;   
  6. import org.apache.axiom.om.OMFactory;   
  7. import org.apache.axiom.om.OMNamespace;   
  8.   
  9. import java.util.HashMap;   
  10.   
  11. public class StockQuoteAxiomService {   
  12.     private HashMap map = new HashMap();   
  13.        
  14.     public OMElement getPrice(OMElement element) throws XMLStreamException {   
  15.         element.build();   
  16.         element.detach();   
  17.            
  18.         OMElement symboleElement = element.getFirstElement();   
  19.         String symbol = symboleElement.getText();   
  20.            
  21.         String returnText = "42";   
  22.         Double price = (Double) map.get(symbol);   
  23.            
  24.         if(price != null) {   
  25.             returnText = "" + price.doubleValue();   
  26.         }   
  27.            
  28.         OMFactory fac = OMAbstractFactory.getOMFactory();   
  29.         OMNamespace omNs = fac.createOMNamespace("http://sq.jivaro.org""tns");   
  30.         OMElement method = fac.createOMElement("getPriceResponse", omNs);   
  31.         OMElement value = fac.createOMElement("price", omNs);   
  32.         value.addChild(fac.createOMText(value, returnText));   
  33.         method.addChild(value);   
  34.            
  35.         return method;   
  36.     }   
  37.        
  38.     public void update(OMElement element) throws XMLStreamException {   
  39.         element.build();   
  40.         element.detach();   
  41.            
  42.         OMElement symbolElement = element.getFirstElement();   
  43.         String symbol = symbolElement.getText();   
  44.            
  45.         OMElement priceElement = (OMElement)symbolElement.getNextOMSibling();   
  46.         String price = priceElement.getText();   
  47.            
  48.         map.put(symbol, new Double(price));   
  49.     }   
  50. }  

天!代码瞬间被膨胀了,参数都被OMElement代替了,这究竟发生了什么(请参看2:services.xml发生了什么),Axis2使用的是AXIOM(AXIs Object Model,一种基于StAX API的类DOM结构)。使用了AXIOM,就规定了服务所定义的方法中的参数必须是OMElement类型,所以我们看到参数的类型都是OMElement了。而方法内代码膨胀也就不足为奇了。

2、看看services.xml又发生了什么变化

xml 代码
  1. <service name="StockQuoteService" scope="application">  
  2.     <description>  
  3.         Stock Quote Service   
  4.     description>  
  5.     <operation name="getPrice">  
  6.         <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>  
  7.     operation>  
  8.     <operation name="update">  
  9.         <messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>  
  10.     operation>  
  11.     <parameter name="ServiceClass">org.jivaro.sq.StockQuoteAxiomServiceparameter>  
  12. service>  

services.xml发生了变化,操作被明确地定义了出来,并定义了操作所对应地MessageReceiver,如getPrice对应的<messagereceiver></messagereceiver>是RawXMLINOutMessageReceiver,而update方法对应的<messagereceiver></messagereceiver>成了RawXMLINOnlyMessageReceiver。

这就是使用AXIOM发布的方式。对于AXIOM的理解将继续更新。接下来应该是真正理解AXIOM,包括它的性能,以及客户端如何调用了。

你可能感兴趣的:(apache,xml,Web)