持之以恒

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

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

           

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

           

          我們先從傳遞一個(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的代碼很簡(jiǎn)單,就不解釋了。慣例,我們來編寫發(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指定的是你傳遞的對(duì)象類型。第一個(gè)屬性的本地部分和第二個(gè)節(jié)點(diǎn)你自定義的命名空間會(huì)組成一個(gè)新的QName,并將你要傳輸?shù)膶?duì)象mapping是上去。

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

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

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

           

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

           

          對(duì)于自定義序列化,Axis也提供了相對(duì)性的配置節(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í)對(duì)于typeMapping來說beanMapping只不過是他的一個(gè)簡(jiǎn)化版而已。因?yàn)閎eanMapping的串行化和反串行化工廠類都是固定的,而編碼方式也是固定的。

           

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



          小白
          主站蜘蛛池模板: 康保县| 莱阳市| 天镇县| 赤峰市| 郓城县| 封丘县| 西城区| 昌平区| 万载县| 泾川县| 台安县| 两当县| 桃源县| 个旧市| 开封县| 中江县| 冕宁县| 治多县| 桦川县| 朝阳县| 海兴县| 临安市| 鸡西市| 江源县| 寿光市| 宿松县| 垦利县| 中西区| 宾川县| 青川县| 深州市| 那坡县| 胶南市| 汾阳市| 海淀区| 石楼县| 交城县| 金乡县| 沙坪坝区| 潞城市| 乐清市|