(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();
}
}
}