天天看點

WebService(4)-AXIS進階特性 傳送檔案

(1) WebService伺服器端方法、
public String transfer(DataHandler handler,String fileName){
  File file = new File(fileName);
  int flag = 0;
  if(handler==null || fileName == null || "".equals(fileName)){
   return "failure";
  }
  InputStream input = null;
  FileOutputStream fos = null;
  try {
   input = handler.getInputStream();
   fos = new FileOutputStream(file);
   byte[] buffer = new byte[1024];
   while (input.read(buffer)!=-1){
    fos.write(buffer);
   }
  } catch(Exception ex){
   ex.printStackTrace();
  } finally{
   if(input !=null){
    try {
     input.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   if(fos !=null) {
    try {
     fos.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
  return "file trasfer success"+file.getAbsolutePath();
 } 
(2) server-config.wsdd檔案配置
<deployment xmlns="​​​http://xml.apache.org/axis/wsdd/​​​"
 xmlns:java="​​​http://xml.apache.org/axis/wsdd/providers/java​​​">
 <handler name="URLMapper"
  type="java:org.apache.axis.handlers.http.URLMapper" />
 <handler name="wsTestHandler"
  type="java:cn.com.chenlly.ssh.webservice.axis.WSTestServiceHandle">
  <parameter name="status" value="success" />
 </handler>
 <!-- 自定義服務 -->
 <service name="ws" provider="java:RPC">
  <parameter name="className"
   value="cn.com.chenlly.ssh.webservice.axis.WSTestServiceImpl" />
  <parameter name="allowedMethods" value="*" />
  <parameter name="scope" value="request" />  <responseFlow>
   <handler type="wsTestHandler" />
  </responseFlow>  <requestFlow>
   <handler type="wsTestHandler" />
  </requestFlow>
  <!-- 傳送複雜對象 -->
  <beanMapping qname="myNSD:Address"
   xmlns:myNSD="urn:AddressManager"
   languageSpecificType="java:cn.com.chenlly.ssh.webservice.axis.Address">
  </beanMapping>
  <!-- 檔案傳輸配置 -->
  <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> <transport name="http">
  <requestFlow>
   <handler type="URLMapper" />
  </requestFlow>
 </transport>
</deployment>
注意:可以通過使用<operation>标簽指定關于服務的特殊操作的中繼資料。這可以将方法的java參數名和特定的XML名進行映射,
為參數指定特定的模式,并将特定的XML名字映射到特定的操作。例如
<operation name="method">
</operation>  
(3) 用戶端
public class WSTestServiceClient {
 public static void main(String[] args) {
  Service service = new Service();
  try {
   //把用戶端c 盤下的一個檔案通過webService儲存到伺服器上去
   String fileName = "D:/sample.txt";  
   DataHandler dh=new DataHandler(new FileDataSource(fileName)); 
   Call call = (Call) service.createCall();
   String url = "​​​http://192.168.1.98:8082/SSHProject/services/ws?wsdl​​​";
   call.setTargetEndpointAddress(new java.net.URL(url));
   call.setOperationName(new QName(url,"transfer"));
   QName qn=new QName("​​​http://fileTransfer.sample​​​", "DataHandler");   
   call.registerTypeMapping(dh.getClass(), qn,JAFDataHandlerSerializerFactory.class,JAFDataHandlerDeserializerFactory.class);   
   call.addParameter("s1",qn,ParameterMode.IN);   
   call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN);   
   call.setReturnClass(String.class);   
   String ret=(String)call.invoke(new Object[] {dh,"d:/service.txt"});   
   System.out.println("transfer success....");   
   System.out.println(ret);  
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}