Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          我的代碼如下:
          這是發布到服務器上面的代碼:
          package   com;
          import   java.util.*;
          public   class   ArrayListService   {
          public   ArrayList   myAL(){
          ArrayList <String>   myAL   =   new   ArrayList <String> ();
          String   str=new   String( "這是一個WebService   Of   ArrayList   ! ");
          myAL.add(str);
          return   myAL;
          }}

          客戶端的代碼:
          package   com;
          import   org.apache.axis.client.Call;
          import   org.apache.axis.client.Service;
          import   java.util.*;

          public   class   ArrayListClient   {
          public   static   void   main(String[]   args)   {    
          try   {        
          String   wsdlUrl   =   "http://127.0.0.1:8080/axis/services/ArrayListService?wsdl ";        
               
          Service   service   =   new   Service();        
          Call   call   =   null;        
          call   =   (Call)   service.createCall();                

          call.setOperationName( "myAL ");        
          call.setTargetEndpointAddress(new   java.net.URL(wsdlUrl));          
          //ArrayList   al=(ArrayList)call.invoke(new   Object[]   {});
          call.invoke(new   Object[]   {});
          System.out.println( "請求信息: ");
          call.getMessageContext().getRequestMessage().writeTo(System.out);
          System.out.println( " ");
          System.out.println( "響應信息: ");
          call.getMessageContext().getResponseMessage().writeTo(System.out);
          System.out.println( " ");
          }  
          catch   (Exception   ex)   {         ex.printStackTrace();         }}}
          打印出來的請求和響應消息也正常。
          可是服務器返回的是一個ArrayList,當用這一句時“ArrayList   al=(ArrayList)call.invoke(new   Object[]   {});”就報錯:
          java.lang.ClassCastException:   [Ljava.lang.Object;
          at   com.ArrayListClient.main(ArrayListClient.java:17)
          這是什么原因啊,如何把響應消息里面的數據返回成ArrayList呢?

          注:server-config.wsdd
          <service   name= "ArrayListService "   provider= "java:RPC ">    
              <parameter   name= "className "   value= "com.ArrayListService "/>
              <parameter   name= "allowedMethods "   value= "* "/>
              <requestFlow>
              <handler   type= "loging "/>
              </requestFlow>
              <responseFlow>
              <handler   type= "loging "/>
              </responseFlow>
            </service>

          這是服務響應消息:
          <?xml   version= "1.0 "   encoding= "utf-8 "?>
          <soapenv:Envelope   xmlns:soapenv= "http://schemas.xmlsoap.org/soap/envelope/ "                     xmlns:xsd= "http://www.w3.org/2001/XMLSchema "  
                            xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance ">
          <soapenv:Body>
          <myALResponse   soapenv:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/ ">
          <myALReturn   href= "#id0 "/>
          </myALResponse>
          <multiRef   id= "id0 "   soapenc:root= "0 "   soapenv:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/ "                       soapenc:arrayType= "xsd:anyType[1] "   xsi:type= "soapenc:Array "                       xmlns:soapenc= "http://schemas.xmlsoap.org/soap/encoding/ ">
          <multiRef   xsi:type= "soapenc:string "> 这是一个WebService   Of   ArrayList   ! </multiRef>
          </multiRef>
          </soapenv:Body>
          </soapenv:Envelope>
          20 
          發表于:2007-01-10 17:29:401樓 得分:0
          arrayList   ,victor,set,map傳輸在j2ee   web   service標準里是有限制的   ,改用數組

          初步搞定:(服務如何發布就不詳細說了,網上很多)
          java程序用   Axis做服務時自定義類實體的傳送

          核心代碼:
          QName   qn   =   new   QName( "urn:BeanService ", "MyArryBean ");                                          
                                  call.registerTypeMapping(MyArryBean.class,   qn,
                                  new   BeanSerializerFactory(MyArryBean.class,   qn),
                                  new   BeanDeserializerFactory(MyArryBean.class,   qn));
          這是在客戶機端的代碼,用于注冊服務器上面的自定義類。然后就可以在客戶端實例化這個類來使用。(如果MyArryBean   與服

          務類不在同一個包里面,即服務需要用   import   來引用的話,這時就要用到   :包名.MyArryBean.class)

          在Axis服務端,注冊自定義對象的序列化/反序列化器
          服務器的server-config.wsdd:
          ...
          <service   name= "ArrayListService "   provider= "java:RPC ">    
              <parameter   name= "className "   value= "com.ArrayListService "/>
              <parameter   name= "allowedMethods "   value= "* "/>
              <beanMapping   languageSpecificType= "java:com.MyArryBean "   qname= "ns:MyArryBean "   xmlns:ns= "urn:BeanService "/>
              <requestFlow>
              <handler   type= "loging "/>
              </requestFlow>
              <responseFlow>
              <handler   type= "loging "/>
              </responseFlow>
            </service>
          ...

          服務器上面的自定義類(這個類要被傳遞給客戶端):MyArryBean.java
          package   com;
          import   java.io.Serializable;

          public   class   MyArryBean   implements   Serializable{
          private   static   final   long   serialVersionUID   =   -6414428095965735488L;
          private   String   str= " ";
          public   MyArryBean(){}
          public   void   setBean(String   str){this.str=str;}
          public   String   getBean(){return   this.str;}
          }

          服務器上面的服務類:ArrayListService.java
          package   com;

          public   class   ArrayListService   {
          //這里返回的是一個int數組
          public   int[]   myAL(){
          int   myAL[]   =   new   int[5];
          for(   int   i=0;i <5;i++){
          myAL[i]=i;
          }
          return   myAL;
          }
          //這里返回的是一個自定義對象
          public   MyArryBean   myAB(String   myStr){
          MyArryBean   _myArryB=new   MyArryBean();
          _myArryB.setBean(myStr);
          return   _myArryB;
          }
          }  

          客戶端代碼:ArrayListClient.java
          package   com;
          import   org.apache.axis.client.Call;
          import   org.apache.axis.client.Service;
          import   org.apache.axis.encoding.ser.BeanDeserializerFactory;
          import   org.apache.axis.encoding.ser.BeanSerializerFactory;
          import   javax.xml.namespace.QName;

          public   class   ArrayListClient   {
          public   static   void   main(String[]   args)   {    
          try   {        
          String   wsdlUrl   =   "http://127.0.0.1:8080/axis/services/ArrayListService?wsdl ";        
          String   nameSpaceUri   =   "http://localhost:8080/axis/services/ArrayListService ";

          Service   service   =   new   Service();        
          Call   call   =   null;        
          call   =   (Call)   service.createCall();        

                                  //注冊MyArryBean的序列化類型
                                  QName   qn   =   new   QName( "urn:BeanService ", "MyArryBean ");                                          
                                  call.registerTypeMapping(MyArryBean.class,   qn,
                                  new   BeanSerializerFactory(MyArryBean.class,   qn),
                                  new   BeanDeserializerFactory(MyArryBean.class,   qn));
                                 
                                  //這里取得的是一個服務器int數組
          call.setOperationName( "myAL ");        
          call.setTargetEndpointAddress(new   java.net.URL(wsdlUrl));          
          int[]   _resp   =   (int[])call.invoke(new   java.lang.Object[]   {});
                  for   (int   i=0;i <5;i++){
          System.out.println( "int數組: "+_resp[i]);
          }
           
                                  //這里取得的是一個服務器自定義對象
                  //這里實例化服務器上面的映射的自定義類
                  MyArryBean   CmyAB=new   MyArryBean();
                  CmyAB.setBean( "這是的客戶端實例化服務器的類!yes ");
                  System.out.println( "return   value   is   "   +   CmyAB.getBean());
                  QName   getmyABQn   =   new   QName(nameSpaceUri,   "myAB ");
                  call.setOperationName(getmyABQn);                                          
                                  call.setTargetEndpointAddress(new   java.net.URL(wsdlUrl));
                                  CmyAB   =   (MyArryBean)   call.invoke(new   Object[]   {   "這是調用服務器的類!web "   });
                                  System.out.println( "return   value   is   "   +   CmyAB.getBean());  
                 
                  System.out.println( "請求信息: ");
          call.getMessageContext().getRequestMessage().writeTo(System.out);
          System.out.println( " ");
          System.out.println( "響應信息: ");
          call.getMessageContext().getResponseMessage().writeTo(System.out);
          System.out.println( " ");
          }  
          catch   (Exception   ex)   {         ex.printStackTrace();         }}}


          運行結果:

          int數組:0
          int數組:1
          int數組:2
          int數組:3
          int數組:4
          return   value   is   這是的客戶端實例化服務器的類!yes
          return   value   is   這是調用服務器的類!web
          請求信息:
          <?xml   version= "1.0 "   encoding= "UTF-8 "?>
            <soapenv:Envelope   xmlns:soapenv= "http://schemas.xmlsoap.org/soap/envelope/ "                                                                          

            xmlns:xsd= "http://www.w3.org/2001/XMLSchema "  
                                                xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance ">
              <soapenv:Body>
                <ns1:myAB   soapenv:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/ "                            

          xmlns:ns1= "http://localhost:8080/axis/services/ArrayListService ">
                  <ns1:arg0   xsi:type= "soapenc:string "   xmlns:soapenc= "http://schemas.xmlsoap.org/soap/encoding/ ">
                    这是调用服务器的类!web
                  </ns1:arg0>
                </ns1:myAB>
              </soapenv:Body>
            </soapenv:Envelope>
          響應信息:
          <?xml   version= "1.0 "   encoding= "utf-8 "?>
          <soapenv:Envelope   xmlns:soapenv= "http://schemas.xmlsoap.org/soap/envelope/ "                                      

          xmlns:xsd= "http://www.w3.org/2001/XMLSchema "  
                                              xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance ">
            <soapenv:Body>
              <ns1:myABResponse   soapenv:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/ "                                          

          xmlns:ns1= "http://localhost:8080/axis/services/ArrayListService ">
                <myABReturn   href= "#id0 "/>
              </ns1:myABResponse>
              <multiRef   id= "id0 "   soapenc:root= "0 "   soapenv:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/ "                    

                xsi:type= "ns2:MyArryBean "   xmlns:soapenc= "http://schemas.xmlsoap.org/soap/encoding/ "                          

          xmlns:ns2= "urn:BeanService ">
                <bean   xsi:type= "soapenc:string ">
                  这是调用服务器的类!web
                </bean>
              </multiRef>
            </soapenv:Body>
          </soapenv:Envelope>

          發表于:2007-01-19 16:48:182樓 得分:0
          正解:
          這一版沒有把它寫成服務\客戶端的形式

          package   com;
          import   java.io.ByteArrayInputStream;
          import   java.io.ByteArrayOutputStream;
          import   java.io.IOException;
          import   java.io.ObjectInputStream;
          import   java.io.ObjectOutputStream;
          import   java.io.Serializable;
          import   java.util.*;

          public   class   ArrayListSerializ   implements   Serializable{
          /**
            *   此例是一個序列化/反序列化的方法   :
            *  
            *   主要思想是把一個對象寫入對象輸出流,然后把這個流里面的數據導入字節數組輸出流
            *   再把字節數組輸出流導入到字節數組。這時,由于byte[]數組是從ObjectOutputStream之后得來的,
            *   那么是不可以new   String(buff)的,因為其中包含了不可見字符,根本不是一個字符串。
            *   只能用sun.misc.BASE64Encoder把它翻譯成字符串形式。
            *   至此,這就完成了序列化成字符串行式的過程
            *  
            *   再通過sun.misc.BASE64Decoder().decodeBuffer把字符串轉換成一個byte[],
            *   然后通過其反思路完成反序列化過程
            */
          private   static   final   long   serialVersionUID   =   1L;
          private   static   void   myArrayListSerializer()
          {
          ArrayList <String>   myAL=new   ArrayList <String> ();
          myAL.add( "This   is   a   serial   programme.author:   張正明 ");
          System.out.println( "ArrayList 's   content:   "+myAL.get(0));
          //序列化使用的輸出流
          ObjectOutputStream   OOS=null;
          //序列化后數據流給ByteArrayOutputStream   來保存。
          //ByteArrayOutputStream   可轉成字符串或字節數組
          ByteArrayOutputStream   BAOS=new   ByteArrayOutputStream();
          //ByteArrayInputStream   可接收一個字節數組 "byte[] "。供反序列化做參數
          ByteArrayInputStream   BAIS=null;
          //反序列化使用的輸入流
          ObjectInputStream   OIS=null;
          try   {
          OOS=new   ObjectOutputStream(BAOS);
          OOS.writeObject(myAL);
          byte[]   buff=BAOS.toByteArray();

            /*由于byte[]數組是從ObjectOutputStream之后得來的,
              *那么是不可以new   String(buff)的,因為其中包含了不可見字符,根本不是一個字符串
              */
          System.out.println( "序列化成一個byte[]的字符串形式   : "+buff);
          //轉換成字符串
          sun.misc.BASE64Encoder   encoder   =   new   sun.misc.BASE64Encoder();
          String   Sstr   =   encoder.encode(buff);
          System.out.println( "序列化成一個字符串: "+Sstr);
          System.out.println( "檢查序列化成一個字符串和序列化成一個byte[]是否為同一個內容: "+
          Arrays.equals(buff,   new   sun.misc.BASE64Decoder().decodeBuffer(Sstr)));
          OOS.close();

                                  //   把字符串轉成一個byte[]
          byte[]   DSbuff=new   sun.misc.BASE64Decoder().decodeBuffer(Sstr);
          System.out.println( "反序列化成一個byte[]字符串形式   : "+DSbuff);
          //實現反序列化
          BAIS=new   ByteArrayInputStream(DSbuff);
          OIS=new   ObjectInputStream(BAIS);
          ArrayList   c=(ArrayList)(OIS.readObject());
          System.out.println( "反序列化后取提ArrayList的數據:   "+c.get(0));
          OIS.close();
          }  
          catch   (IOException   e)   {e.printStackTrace();}
          catch   (Exception   ex)   {System.out.println( "序列化時產生錯誤 ");}
          }
          public   static   void   main(String[]   args){
          myArrayListSerializer();
          }
          }
          posted on 2007-11-24 14:41 禮物 閱讀(3451) 評論(0)  編輯  收藏 所屬分類: webservice
          主站蜘蛛池模板: 兴安县| 丹棱县| 新宾| 宕昌县| 巧家县| 富锦市| 琼结县| 汾西县| 许昌市| 湛江市| 重庆市| 阳原县| 垦利县| 新兴县| 罗定市| 昌邑市| 隆回县| 垫江县| 驻马店市| 峡江县| 丰顺县| 东安县| 永定县| 北京市| 黄浦区| 青田县| 伽师县| 河池市| 衢州市| 贵定县| 邹城市| 宣化县| 金沙县| 洪洞县| 信阳市| 云龙县| 景东| 鹤岗市| 遂宁市| 织金县| 务川|