Webservice+axisファイル転送


AXISによるファイル転送
Javaコード
  • package com.chnic.webservice;   
  •   
  • import java.io.File;   
  • import java.io.FileOutputStream;   
  • import java.io.IOException;   
  • import java.io.InputStream;   
  •   
  • import javax.activation.DataHandler;   
  •   
  • public class FileTransfer {   
  •   
  •     public FileTransfer(){   
  •            
  •      }   
  •        
  •     public String transfer(DataHandler handler, String fileName){   
  •          String fullPath = "C:/"+ fileName;   
  •          File file = new File(fullPath);   
  •         int flag = 0;   
  •         if(handler == null)   
  •             return "failure";   
  •         if(fileName == null)   
  •             return "failure";   
  •            
  •         try {   
  •              InputStream input = handler.getInputStream();   
  •              FileOutputStream fos = new FileOutputStream(file);   
  •             byte[] buffer=new byte[4096];   
  •             while((flag=input.read(buffer))!=-1){   
  •                  fos.write(buffer,0,flag);   
  •              }   
  •              input.close();   
  •              fos.close();   
  •          } catch (IOException e) {   
  •              e.printStackTrace();   
  •             return "failure";   
  •          }   
  •         return "Success";   
  •      }   
  • }  
  • package com.chnic.webservice;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.activation.DataHandler;
    
    public class FileTransfer {
    
     public FileTransfer(){
      
     }
     
     public String transfer(DataHandler handler, String fileName){
      String fullPath = "C:/" + fileName;
      File file = new File(fullPath);
      int flag = 0;
      if(handler == null)
       return "failure";
      if(fileName == null)
       return "failure";
      
      try {
       InputStream input = handler.getInputStream();
       FileOutputStream fos = new FileOutputStream(file);
       byte[] buffer=new byte[4096];
       while((flag=input.read(buffer))!=-1){
        fos.write(buffer,0,flag);
       }
       input.close();
       fos.close();
      } catch (IOException e) {
       e.printStackTrace();
       return "failure";
      }
      return "Success";
     }
    }

     
    Transferメソッドはサービス側がクライアントからファイルを受け取るメソッドで,メソッドには2つのパラメータがあり,1つ目はDataHandlerである.このクラスは,専用のシーケンス化クラスによってファイルをシーケンス化するコンベアと見なすことができる.このクラスの具体的な方法はSUNのAPIドキュメントを調べることができます.2番目のパラメータはString文字列で、パラメータ名がわかり、ファイル名が渡されます.
     
    この方法はDataHandlerから入力ストリームを得て、このストリームからデータを読み出して新しいファイルに書きます.これらは基本的なJava I/O操作です.あまり難しくないはずです.サーバーコードの編集が終わったらdeployです.wsddはファイルをパブリッシュします.
     
    Xmlコード
  •     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
  •        
  •       
  •           
  •           
  •           
  •            
  •         
  •                    qname="operNS:transfer"  
  •                    xmlns:operNS="file"  
  •                    returnQName="fileSend"  
  •                    returnType="rtns:string"  
  •                    xmlns:rtns="http://www.w3.org/2001/XMLSchema">  
  •                       
  •             
  •                        xmlns:tns="http://www.w3.org/2001/XMLSchema"/>  
  •             
  •                        xmlns:tns="http://www.w3.org/2001/XMLSchema"/>  
  •           
  •            
  •         
  •           languageSpecificType="java:javax.activation.DataHandler"  
  •           serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"  
  •           deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"  
  •           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>  
  •       
  •   
  • <deployment xmlns="http://xml.apache.org/axis/wsdd/" 
     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
        
        <service name="FileTransfer" provider="java:RPC">
            <parameter name="className" value="com.chnic.webservice.FileTransfer"/>
            <parameter name="allowedMethods" value="transfer"/>
            <parameter name="scope" value="session"/>
            
            <operation name="transfer"
                 qname="operNS:transfer"
                 xmlns:operNS="file"
                 returnQName="fileSend" 
                 returnType="rtns:string" 
                 xmlns:rtns="http://www.w3.org/2001/XMLSchema">
                 
            <parameter name="handler" type="tns:string" 
                 xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
            <parameter name="fileName" type="myns:DataHandler" 
                 xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
         </operation>
         
            <typeMapping qname="myns:DataHandler" xmlns:myns="http://fileTransfer.sample"
              languageSpecificType="java:javax.activation.DataHandler"
              serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"
              deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
              encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </service>
    </deployment>

     
    このプロファイルもあまり紹介されていませんが、前のいくつかの要素についての紹介ははっきりしています.ここでorgを述べる必要があります.apache.axis.encoding.ser.JAFDataHandlerSerializerFactoryというクラスです.前にオブジェクトをシーケンス化するときに異なるオブジェクトをシーケンス化するには異なるファクトリクラスが必要であり、同じようにファイルをシーケンス化するときにこのファクトリクラスを使用します.すべてを作成し、tomcatを起動してサービスをリリースします.
     
    サーバ側のコードの作成が完了し、クライアントコードの番になりました.簡単なsampleなので、Cディスクのルートディレクトリの1つのファイルをwebwerviceでCディスクに保存することも簡単です.もちろんファイル名はもう1つ使います.次はクライアントコードです.
     
    Javaコード
  • String fileName = "C:/sample.txt";   
  • DataHandler dh=new DataHandler(new FileDataSource(fileName));   
  • String endpoint="http://localhost:8080/axis/services/FileTransfer";   
  •   
  • Service service=new Service();   
  • Call call=(Call) service.createCall();   
  • call.setTargetEndpointAddress(new java.net.URL(endpoint));   
  • call.setOperationName(new QName(endpoint, "transfer"));   
  • QName qnameattachment=new QName("http://fileTransfer.sample",   
  •         "myns:DataHandler");   
  •   
  • call.registerTypeMapping(dh.getClass(),   
  •          qnameattachment,   
  •          JAFDataHandlerSerializerFactory.class,   
  •          JAFDataHandlerDeserializerFactory.class);   
  •   
  • call.addParameter("s1",qnameattachment,ParameterMode.IN);   
  • call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN);   
  • call.setReturnClass(String.class);   
  • String ret=(String)call.invoke(new Object[] {dh,"aaaaaa.txt"});   
  • System.out.println("transfer success....");   
  • System.out.println(ret);  
  • String fileName = "C:/sample.txt";
      DataHandler dh=new DataHandler(new FileDataSource(fileName));
      String endpoint="http://localhost:8080/axis/services/FileTransfer";
      
      Service service=new Service();
      Call call=(Call) service.createCall();
      call.setTargetEndpointAddress(new java.net.URL(endpoint));
      call.setOperationName(new QName(endpoint, "transfer"));
      QName qnameattachment=new QName("http://fileTransfer.sample",
        "myns:DataHandler");
      
      call.registerTypeMapping(dh.getClass(),
        qnameattachment,
        JAFDataHandlerSerializerFactory.class,
        JAFDataHandlerDeserializerFactory.class);
      
      call.addParameter("s1",qnameattachment,ParameterMode.IN);
      call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN);
      call.setReturnClass(String.class);
      String ret=(String)call.invoke(new Object[] {dh,"aaaaaa.txt"});
      System.out.println("transfer success....");
      System.out.println(ret);

     
    クライアントはDataHandlerでソースファイルを取得し,その後DataHandlerを登録し,2つの入力パラメータと1つの出力パラメータを登録する.を使用してインポートしたストロークVSラム速度のデータ点を示します.新しいファイルもCディスクの下にaaaaという名前です.txt.テスト世代を実行し、コンソールに2つの言葉を入力します.
    transfer success....Success
     
    テストに成功したことを説明して、Cディスクの上でaaaを見つけることができます.txtこのファイル.