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

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

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

    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
    主站蜘蛛池模板: va天堂va亚洲va影视中文字幕| 亚洲日本精品一区二区 | 亚洲一区二区影院| 免费看黄的成人APP| 日本亚洲视频在线 | 小说专区亚洲春色校园| 色www永久免费视频| 亚洲高清毛片一区二区| 国产精品免费综合一区视频| 国产精品亚洲综合天堂夜夜| 亚洲成网777777国产精品| 日韩精品无码永久免费网站| 久久久久久A亚洲欧洲AV冫| 岛国岛国免费V片在线观看| 亚洲AV无码久久精品成人| 久久这里只精品99re免费| 亚洲精品影院久久久久久| 青青在线久青草免费观看| 色窝窝亚洲av网| 久久久久亚洲AV无码专区桃色| 182tv免费视频在线观看 | 亚洲AV无码成人专区片在线观看| 91人成网站色www免费下载| 亚洲成人激情小说| 亚洲国产成人a精品不卡在线| 久久精品无码专区免费| 亚洲黄色一级毛片| 免费一级成人毛片| 暖暖免费在线中文日本| 日本亚洲精品色婷婷在线影院| 国产免费131美女视频| 99在线视频免费观看| 亚洲AV色吊丝无码| 亚洲精品国产精品乱码不卞| 95免费观看体验区视频| 免费在线观看亚洲| 亚洲精品午夜久久久伊人| 成人亚洲网站www在线观看| 99久久国产免费-99久久国产免费| 亚洲精品无码少妇30P| 国产亚洲av片在线观看播放|