posts - 64,  comments - 9,  trackbacks - 0

          利用AXIS開發(fā)Webservice(三) —— 如何傳遞JavaBean和你的對象

          關(guān)鍵字: webservice axis transfer javabean serialize

          這幾天貌似戰(zhàn)斗力無窮,趁著有精力就多更新兩篇。隨著對Axis的研究加深,越感覺webservice是個很好玩的東西。這篇說一下如何傳遞一個JavaBean和你自己的一個special Object。

           

          在第一篇介紹Axis的文章里,我們做了一個簡單的webservice,我們client side傳遞了String和int類型的數(shù)據(jù)給service object。Service處理之后返回處理結(jié)果給Client。對于大多數(shù)需求,那個demo顯然已經(jīng)足夠應(yīng)付了。但是如果client端需要傳輸一個對象給server,那么那個demo就顯得力不從心了。Axis中提供了遠(yuǎn)程傳輸對象的方法,通過那些方法我們同樣可以隨心的傳遞自己的對象。

           

          我們先從傳遞一個JavaBean開始,首先編寫一個JavaBean。

          Java代碼 復(fù)制代碼
          1. package com.chnic.bean;   
          2.   
          3. public class OrderBean {   
          4.     private String name;   
          5.     private int age;   
          6.     private String[] items;   
          7.     private int[] price;   
          8.     private boolean checked;   
          9.        
          10.     public OrderBean() {   
          11.     }   
          12.     public int getAge() {   
          13.         return age;   
          14.     }   
          15.     public void setAge(int age) {   
          16.         this.age = age;   
          17.     }   
          18.     public boolean isChecked() {   
          19.         return checked;   
          20.     }   
          21.     public void setChecked(boolean checked) {   
          22.         this.checked = checked;   
          23.     }   
          24.     public String[] getItems() {   
          25.         return items;   
          26.     }   
          27.     public void setItems(String[] items) {   
          28.         this.items = items;   
          29.     }   
          30.     public String getName() {   
          31.         return name;   
          32.     }   
          33.     public void setName(String name) {   
          34.         this.name = name;   
          35.     }   
          36.     public int[] getPrice() {   
          37.         return price;   
          38.     }   
          39.     public void setPrice(int[] price) {   
          40.         this.price = price;   
          41.     }   
          42. }  

          這個JavaBean的前4個屬性都很清楚,要解釋一下最后一個。因?yàn)檫@個JavaBean被傳遞到Service端處理之后要接著被傳回,用來示例webservce傳進(jìn)和傳出。這個變量用來區(qū)別傳進(jìn)和傳出的差別。解釋完我們來看下service

          Java代碼 復(fù)制代碼
          1. package com.chnic.webservice;   
          2.   
          3. import com.chnic.bean.OrderBean;   
          4.   
          5. public class AnalyzeOrder {   
          6.        
          7.     public AnalyzeOrder(){     
          8.     }   
          9.        
          10.     public OrderBean process(OrderBean order){   
          11.         order.setChecked(true);   
          12.         System.out.println("name: " + order.getName() + " age: " + order.getAge());   
          13.         for(int i=0; i<order.getItems().length; i++)   
          14.             System.out.println("Item " + (i+1) + order.getItems()[i] +    
          15.                     " and price is " + order.getPrice()[i]);   
          16.         return order;   
          17.     }   
          18. }  

           Service Object的代碼很簡單,就不解釋了。慣例,我們來編寫發(fā)布文件。

          Xml代碼 復(fù)制代碼
          1. <deployment xmlns="http://xml.apache.org/axis/wsdd/"    
          2.     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
          3.        
          4.     <service name="CheckOrder" provider="java:RPC">  
          5.         <parameter name="className" value="com.chnic.webservice.AnalyzeOrder"/>  
          6.         <parameter name="allowedMethods" value="process"/>  
          7.         <beanMapping qname="myNS:Order" xmlns:myNS="urn:AnalyzeOrder"    
          8.             languageSpecificType="java:com.chnic.bean.OrderBean"/>  
          9.     </service>  
          10. </deployment>  

           唯一不同的就是多了<beabMapping>這個節(jié)點(diǎn)。qname 表示 XML 規(guī)范中定義的限定名稱,他由名稱空間 URI、本地部分和前綴組成。除了本地部分其他都不是必須的另外QName是不可變的。xmlns后面的myNS是必須的。具體根據(jù)前面所指定的qname來決定。之后可以隨意命名一個namespace。最后的languageSpecificType指定的是你傳遞的對象類型。第一個屬性的本地部分和第二個節(jié)點(diǎn)你自定義的命名空間會組成一個新的QName,并將你要傳輸?shù)膶ο髆apping是上去。

           

          發(fā)布這個webservice,編寫測試代碼

          Java代碼 復(fù)制代碼
          1. String targetEendPoint = "http://localhost:8080/axis/services/CheckOrder";     
          2.            
          3. OrderBean order = new OrderBean();   
          4. order.setName("Beckham");   
          5. order.setAge(32);   
          6. String [] items = new String[] { "Ipod""ThinkPad" };   
          7. int [] price = new int [] { 9995000 };   
          8. order.setItems(items);   
          9. order.setPrice(price);   
          10. order.setChecked(false);   
          11.            
          12. System.out.println(order.isChecked());   
          13.            
          14. Service  service = new Service();   
          15. Call call = (Call) service.createCall();   
          16. QName qn = new QName("urn:AnalyzeOrder""Order" );   
          17. call.registerTypeMapping(OrderBean.class, qn,   
          18.    new org.apache.axis.encoding.ser.BeanSerializerFactory(OrderBean.class, qn),           
          19.    new org.apache.axis.encoding.ser.BeanDeserializerFactory(OrderBean.class, qn));   
          20.            
          21. call.setTargetEndpointAddress( new java.net.URL(targetEendPoint) );   
          22. call.setOperationName( new QName("CheckOrder""process") );   
          23. call.addParameter( "arg1", qn, ParameterMode.IN );   
          24. call.setReturnClass(OrderBean.class);   
          25.            
          26. OrderBean result = (OrderBean) call.invoke( new Object[] {order} );   
          27.            
          28. System.out.println("Success...");   
          29. System.out.println(result.isChecked())  

           從控制臺輸出一些信息以便測試,里面大多代碼都應(yīng)該見過。new QName和之后的registerTypeMapping方法也是在實(shí)現(xiàn)我上面那段黑體字的內(nèi)容。之后注冊完參數(shù)和返回值類型運(yùn)行。

          會發(fā)現(xiàn)在tomcat控制臺和本地控制臺都會輸出測試結(jié)果,值得注意的是checked這個屬性在傳入之前是false屬性,傳入之后我們改變了他的屬性變?yōu)閠rue。返回之后在本地控制臺打印出來也為true。

           

          事實(shí)上Axis除了可以傳輸JavaBean之外還可以傳輸一些自定義的類型。比如List、Map和時間日期類型。Axis也為他們提供了專門的SerializerFactory和DeserializerFactory。這些工廠類會產(chǎn)生串行化工具去序列化相應(yīng)的對象。更多的Factory Object可以在org.apache.axis.encoding.ser下面找到。

           

          對于自定義序列化,Axis也提供了相對性的配置節(jié)點(diǎn)。具體配置如下:

          Xml代碼 復(fù)制代碼
          1. <typeMapping qname="ns:local" xmlns:ns="someNamespace"  
          2.              languageSpecificType="java:my.java.thingy"  
          3.              serializer="my.java.Serializer"  
          4.              deserializer="my.java.DeserializerFactory"  
          5.             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>  

          typeMapping的前三個屬性和上面講的beanMapping都一樣。不一樣的是后三個。serializer指定的是串行化類,dserializer指定的是反串行化類。最后一個指定的編碼方式。其實(shí)對于typeMapping來說beanMapping只不過是他的一個簡化版而已。因?yàn)閎eanMapping的串行化和反串行化工廠類都是固定的,而編碼方式也是固定的。

           

          因?yàn)閠ypemapping和beanMapping很相似,在這里就不再寫demo了。 有些人也許會問,既然能串行化對象那能不能“串行化”文件呢?這個問題留著下次再說吧。今天米動力了。confused

          posted on 2009-07-03 18:42 super_nini 閱讀(808) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2009年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 万州区| 耒阳市| 本溪市| 卢龙县| 延长县| 五河县| 贡觉县| 无锡市| 临漳县| 始兴县| 新沂市| 赣榆县| 合山市| 民乐县| 安康市| 广平县| 定州市| 科尔| 渭南市| 天等县| 遂宁市| 慈利县| 遂平县| 天台县| 乐东| 浮梁县| 嘉峪关市| 吴川市| 三河市| 年辖:市辖区| 深州市| 湖北省| 武强县| 武冈市| 双柏县| 奉贤区| 花垣县| 那坡县| 台北县| 搜索| 杭锦旗|