Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評(píng)論 :: 0 Trackbacks
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(19)

          隨筆分類(107)

          隨筆檔案(141)

          文章分類(284)

          文章檔案(342)

          相冊

          收藏夾(58)

          家裝

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          看一個(gè)簡單的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. }  

          這是一個(gè)簡單的web service,和寫一個(gè)類沒有任何不同。持有一個(gè)map對象,getPrice方法,通過傳入字符串,得到對應(yīng)的金額,update方法則是添加了一個(gè)字符串-金額的組合,它對應(yīng)的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>  

          這個(gè)服務(wù)很好理解。注意RPCInOnlyMessageReceiver和RPCMessageRecevier,前者是“只進(jìn)”的方法,后者是“可進(jìn)可出”的方法,分別對應(yīng)了getPrice(有參數(shù),有返回)和update(有參數(shù),無返回)方法。

          從現(xiàn)在開始就要了解AXIOM了

          1、將上面的服務(wù)類轉(zhuǎn)成用AXIOM來實(shí)現(xiàn),看看發(fā)生了什么

          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. }  

          天!代碼瞬間被膨脹了,參數(shù)都被OMElement代替了,這究竟發(fā)生了什么(請參看2:services.xml發(fā)生了什么),Axis2使用的是AXIOM(AXIs Object Model,一種基于StAX API的類DOM結(jié)構(gòu))。使用了AXIOM,就規(guī)定了服務(wù)所定義的方法中的參數(shù)必須是OMElement類型,所以我們看到參數(shù)的類型都是OMElement了。而方法內(nèi)代碼膨脹也就不足為奇了。

          2、看看services.xml又發(fā)生了什么變化

          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發(fā)生了變化,操作被明確地定義了出來,并定義了操作所對應(yīng)地MessageReceiver,如getPrice對應(yīng)的是RawXMLINOutMessageReceiver,而update方法對應(yīng)的成了RawXMLINOnlyMessageReceiver。

          這就是使用AXIOM發(fā)布的方式。對于AXIOM的理解將繼續(xù)更新。接下來應(yīng)該是真正理解AXIOM,包括它的性能,以及客戶端如何調(diào)用了。

           

          posted on 2007-11-21 18:05 禮物 閱讀(1977) 評(píng)論(0)  編輯  收藏 所屬分類: web service
          主站蜘蛛池模板: 扬中市| 大足县| 光泽县| 东乌珠穆沁旗| 乌拉特前旗| 广河县| 霞浦县| 荥阳市| 城步| 大洼县| 砀山县| 安福县| 龙山县| 武冈市| 湖南省| 厦门市| 万源市| 临高县| 长顺县| 墨脱县| 封丘县| 奉节县| 盘山县| 尖扎县| 邓州市| 镇安县| 如皋市| 屯门区| 龙门县| 屏东市| 青神县| 都安| 蓬莱市| 县级市| 合肥市| 松滋市| 望谟县| 长顺县| 富顺县| 乐业县| 横山县|