趁著放假來(lái)更新一下博客,今天來(lái)介紹一下如何利用AXIS來(lái)傳遞文件。因?yàn)檫@已經(jīng)是關(guān)于AXIS的第五篇文章了,所以講的會(huì)比較快,有不明白的朋友可以翻翻前面的文章來(lái)參考一下。
直入主題,我們先來(lái)編寫(xiě)服務(wù)器代碼
- 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端接受客戶端傳來(lái)文件的方法,方法里面有兩個(gè)參數(shù),第一個(gè)是DataHandler。這個(gè)類可以看成是一個(gè)傳送器,通過(guò)專門(mén)的序列化類將文件序列化。這個(gè)類的具體方法可以查一下SUN的API文檔。第二個(gè)參數(shù)是一個(gè)String字符串,參數(shù)名就可以看出來(lái),傳遞的是文件名。
這個(gè)方法從DataHandler得到一個(gè)輸入流,從這個(gè)流里讀出數(shù)據(jù)然后寫(xiě)到一個(gè)新文件里。這些都是一些基本的Java I/O操作。應(yīng)該不會(huì)太難。服務(wù)器代碼編寫(xiě)完之后下來(lái)是deploy.wsdd發(fā)布文件。
- <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>
這個(gè)配置文件也不多介紹了,前幾篇關(guān)于這幾個(gè)元素的介紹已經(jīng)比較清楚了,在這里有必要提一下org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory 這個(gè)類。前面序列化對(duì)象的時(shí)候提到序列化不同對(duì)象的時(shí)候需要不同的工廠類,同樣在序列化文件的時(shí)候就要用這個(gè)工廠類。編寫(xiě)完一切,啟動(dòng)tomcat然后發(fā)布服務(wù)。
服務(wù)器端的代碼已經(jīng)編寫(xiě)完成了,現(xiàn)在輪到客戶端代碼。因?yàn)槭莻€(gè)簡(jiǎn)單的sample,所以做的事情也比較簡(jiǎn)單就是把C盤(pán)根目錄上的一個(gè)文件通過(guò)webwervice儲(chǔ)存到C盤(pán),當(dāng)然文件名要用另外一個(gè)。下面是客戶端代碼。
- 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);
客戶端通過(guò)DataHandler取得源文件,之后注冊(cè)DataHandler,注冊(cè)兩個(gè)輸入?yún)?shù)和一個(gè)輸出參數(shù)。之后傳入相關(guān)的參數(shù)。新文件也在C盤(pán)下面名字為aaaaa.txt。運(yùn)行測(cè)試代,控制臺(tái)打出兩句話。
transfer success....
Success
說(shuō)明測(cè)試成功,到C盤(pán)上也可以找到aaaaa.txt這個(gè)文件。
posted on 2009-07-03 18:47
super_nini 閱讀(485)
評(píng)論(0) 編輯 收藏