<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 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

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

     

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

     

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

    Java代碼 復(fù)制代碼 收藏代碼
    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. }

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

    Java代碼 復(fù)制代碼 收藏代碼
    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的代碼很簡單,就不解釋了。慣例,我們來編寫發(fā)布文件。

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

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

    Java代碼 復(fù)制代碼 收藏代碼
    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())

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

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

     

    事實(shí)上Axis除了可以傳輸JavaBean之外還可以傳輸一些自定義的類型。比如List、Map和時(shí)間日期類型。Axis也為他們提供了專門的SerializerFactory和DeserializerFactory。這些工廠類會(huì)產(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的前三個(gè)屬性和上面講的beanMapping都一樣。不一樣的是后三個(gè)。serializer指定的是串行化類,dserializer指定的是反串行化類。最后一個(gè)指定的編碼方式。其實(shí)對于typeMapping來說beanMapping只不過是他的一個(gè)簡化版而已。因?yàn)閎eanMapping的串行化和反串行化工廠類都是固定的,而編碼方式也是固定的。

     

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



    小白
    主站蜘蛛池模板: 久久福利青草精品资源站免费 | 无人在线观看免费高清视频| 浮力影院亚洲国产第一页| 亚洲精品蜜夜内射| 成人人免费夜夜视频观看| 2020年亚洲天天爽天天噜| 免费精品国产自产拍在线观看图片| 久久青青草原亚洲av无码app| 久久99精品国产免费观看| 亚洲日韩图片专区第1页| 最近中文字幕电影大全免费版 | 国产亚洲精品无码拍拍拍色欲| 7m凹凸精品分类大全免费| 精品国产亚洲第一区二区三区| 国产传媒在线观看视频免费观看| 亚洲国产成人精品无码区花野真一 | 亚洲天堂男人天堂| 九月婷婷亚洲综合在线| 免费一级毛suv好看的国产网站| 免费v片视频在线观看视频| 免费看内射乌克兰女| 亚洲永久中文字幕在线| 午夜免费福利影院| 日日躁狠狠躁狠狠爱免费视频 | 亚洲精品二三区伊人久久| 国产成人综合亚洲AV第一页 | 污网站免费在线观看| 亚洲人成黄网在线观看| 成人永久免费高清| 精选影视免费在线 | 亚洲视频2020| 国产亚洲精品AA片在线观看不加载| 无码专区永久免费AV网站| 亚洲午夜免费视频| 色www永久免费网站| 亚洲最新在线视频| 免费大黄网站在线观| 成人毛片免费观看视频在线| www一区二区www免费| 亚洲国产高清视频在线观看| 国产亚洲福利精品一区|