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

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

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

    持之以恒

    記錄本
    posts - 4, comments - 32, trackbacks - 0, articles - 74
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

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

     

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

     

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

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

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

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

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

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

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

    發布這個webservice,編寫測試代碼

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

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

    會發現在tomcat控制臺和本地控制臺都會輸出測試結果,值得注意的是checked這個屬性在傳入之前是false屬性,傳入之后我們改變了他的屬性變為true。返回之后在本地控制臺打印出來也為true。

     

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

     

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

    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



    小白
    主站蜘蛛池模板: 美女的胸又黄又www网站免费| 久久亚洲精品中文字幕无码 | 国产成人精品免费视频大| 国产亚洲成归v人片在线观看| 乱爱性全过程免费视频| www.亚洲精品| 精品熟女少妇aⅴ免费久久| 亚洲精品美女久久久久99小说| 特级毛片免费播放| 久久精品国产亚洲Aⅴ香蕉| xxxxxx日本处大片免费看| 国产精品亚洲产品一区二区三区| 亚洲免费视频一区二区三区| 最新国产AV无码专区亚洲 | 日本免费人成网ww555在线| 亚洲成a人片在线观看日本 | 中文字幕av无码无卡免费| 亚洲中文字幕无码mv| 国产成人免费全部网站| 成av免费大片黄在线观看| 亚洲av成人无码久久精品| 国产四虎免费精品视频| 久久亚洲AV成人无码国产电影 | 97在线视频免费| 亚洲人配人种jizz| 免费国产a国产片高清网站| 一级毛片**免费看试看20分钟 | 在线视频亚洲一区| 亚洲开心婷婷中文字幕| 5g影院5g天天爽永久免费影院| 亚洲ts人妖网站| 亚洲欧洲久久久精品| 久久A级毛片免费观看| 亚洲欧美国产日韩av野草社区| 亚洲精品NV久久久久久久久久| 在线看片免费人成视频播| 亚洲国产美女精品久久| 亚洲人成无码网WWW| 1000部拍拍拍18勿入免费视频软件 | 免费观看激色视频网站bd| 国产精品亚洲专区一区|