持之以恒

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

          這幾天貌似戰(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中提供了遠程傳輸對象的方法,通過那些方法我們同樣可以隨心的傳遞自己的對象。

           

          我們先從傳遞一個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傳進和傳出。這個變量用來區(qū)別傳進和傳出的差別。解釋完我們來看下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的代碼很簡單,就不解釋了。慣例,我們來編寫發(fā)布文件。

          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>這個節(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. 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())

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

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

           

          事實上Axis除了可以傳輸JavaBean之外還可以傳輸一些自定義的類型。比如List、Map和時間日期類型。Axis也為他們提供了專門的SerializerFactory和DeserializerFactory。這些工廠類會產(chǎn)生串行化工具去序列化相應(yīng)的對象。更多的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



          小白
          主站蜘蛛池模板: 吐鲁番市| 广宗县| 茶陵县| 左贡县| 柞水县| 丹东市| 安岳县| 科技| 永登县| 漳州市| 宝兴县| 大宁县| 长乐市| 师宗县| 崇文区| 三江| 隆德县| 文安县| 宁夏| 哈尔滨市| 聊城市| 博兴县| 德化县| 阿合奇县| 甘德县| 东莞市| 含山县| 行唐县| 平度市| 哈巴河县| 义乌市| 苍溪县| 嘉荫县| 莱阳市| 台江县| 阿克陶县| 丰原市| 普兰店市| 伊川县| 大竹县| 老河口市|