看一个简单的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,包括它的性能,以及客户端如何调用了。