趁著放假來更新一下博客,今天來介紹一下如何利用AXIS來傳遞文件。因為這已經是關于AXIS的第五篇文章了,所以講的會比較快,有不明白的朋友可以翻翻前面的文章來參考一下。
直入主題,我們先來編寫服務器代碼
- 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方法是service端接受客戶端傳來文件的方法,方法里面有兩個參數,第一個是DataHandler。這個類可以看成是一個傳送器,通過專門的序列化類將文件序列化。這個類的具體方法可以查一下SUN的API文檔。第二個參數是一個String字符串,參數名就可以看出來,傳遞的是文件名。
這個方法從DataHandler得到一個輸入流,從這個流里讀出數據然后寫到一個新文件里。這些都是一些基本的Java I/O操作。應該不會太難。服務器代碼編寫完之后下來是deploy.wsdd發布文件。
- <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>
<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盤根目錄上的一個文件通過webwervice儲存到C盤,當然文件名要用另外一個。下面是客戶端代碼。
- 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,注冊兩個輸入參數和一個輸出參數。之后傳入相關的參數。新文件也在C盤下面名字為aaaaa.txt。運行測試代,控制臺打出兩句話。
transfer success....
Success
說明測試成功,到C盤上也可以找到aaaaa.txt這個文件。
posted on 2009-07-03 18:47
super_nini 閱讀(478)
評論(0) 編輯 收藏