<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 64,  comments - 9,  trackbacks - 0

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

    關鍵字: webservice axis transfer javabean serialize

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

     

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

     

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

    Java代碼 復制代碼
    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個屬性都很清楚,要解釋一下最后一個。因為這個JavaBean被傳遞到Service端處理之后要接著被傳回,用來示例webservce傳進和傳出。這個變量用來區(qū)別傳進和傳出的差別。解釋完我們來看下service

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

     

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

    Java代碼 復制代碼
    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())  

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

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

     

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

     

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

    Xml代碼 復制代碼
    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指定的是反串行化類。最后一個指定的編碼方式。其實對于typeMapping來說beanMapping只不過是他的一個簡化版而已。因為beanMapping的串行化和反串行化工廠類都是固定的,而編碼方式也是固定的。

     

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

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

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


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

    常用鏈接

    留言簿

    隨筆檔案

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品专区在线观看| 黄色网站软件app在线观看免费| 亚洲免费在线视频播放| 亚洲av综合色区| a级毛片免费完整视频| 久久夜色精品国产噜噜亚洲AV| 免费视频一区二区| 亚洲视频国产精品| 在线观看亚洲免费视频| 处破女第一次亚洲18分钟| 婷婷亚洲天堂影院| 日韩电影免费在线观看中文字幕| 亚洲综合亚洲国产尤物| 在线免费观看视频你懂的| 日韩少妇内射免费播放| 亚洲中文字幕无码中文字在线| 免费在线看污视频| 在线播放国产不卡免费视频| 久久久久久久久无码精品亚洲日韩| 亚洲三级在线免费观看| 韩国日本好看电影免费看| 一级成人a免费视频| 亚洲六月丁香六月婷婷蜜芽| 免费一级毛片不卡不收费| 国内少妇偷人精品视频免费| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 免费阿v网站在线观看g| 在线观看亚洲精品专区| 久久99国产亚洲精品观看| 国内一级一级毛片a免费| 福利免费观看午夜体检区| 一本一道dvd在线观看免费视频| 羞羞漫画小舞被黄漫免费| 亚洲经典在线中文字幕| 午夜影视日本亚洲欧洲精品一区| 久久精品国产亚洲网站| 日韩免费一级毛片| 免费播放春色aⅴ视频| 亚洲午夜福利精品久久| 免费高清在线影片一区| 日本一道本高清免费|