看一個簡單的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,包括它的性能,以及客戶端如何調用了。