怎么用WebService传输XML文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用WebService传输XML文件相关的知识,希望对你有一定的参考价值。

WebService中文件传输
WebService处理传递普通的信息,还可以传输文件,下面介绍WebService是怎么完成文件传输的。
1、 首先编写服务器端上传文件的WebService方法

package com.hoo.service;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import javax.activation.DataHandler;

/**
* <b>function:</b>Axis WebService完成文件上传服务器端
* @author hoojo
* @createDate Dec 18, 2010 1:16:16 PM
* @file UploadFileService.java
* @package com.hoo.service
* @project AxisWebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class UploadFileService

/**
* <b>function:</b>传递文件
* @author hoojo
* @createDate Dec 18, 2010 1:27:58 PM
* @param handler DataHandler这个参数必须
* @param fileName 文件名称
* @return upload Info
*/
public String upload(DataHandler handler, String fileName)
if (fileName != null && !"".equals(fileName))
File file = new File(fileName);
if (handler != null)
InputStream is = null;
FileOutputStream fos = null;
try
is = handler.getInputStream();
fos = new FileOutputStream(file);
byte[] buff = new byte[1024 * 8];
int len = 0;
while ((len = is.read(buff)) > 0)
fos.write(buff, 0, len);

catch(FileNotFoundException e)
return "fileNotFound";
catch (Exception e)
return "upload File failure";
finally
try
if (fos != null)
fos.flush();
fos.close();

if (is != null)
is.close();

catch (Exception e)
e.printStackTrace();


return "file absolute path:" + file.getAbsolutePath();
else
return "handler is null";

else
return "fileName is null";




上传方法和我们以前在Web中上传唯一不同的就是参数一DataHandler,可以将这类看成文件传输器,他可以把文件序列化。然后通过DataHandler可以得到一个输入流InputStream,通过这个流可以读到文件的内容。其他的操作和普通上传类似。
2、 定制wsdd发布文件上传的WebService服务

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="UploadFile" provider="java:RPC">
<parameter name="className" value="com.hoo.service.UploadFileService" />
<parameter name="allowedMethods" value="*" />
<parameter name="scope" value="Session" />
<!-- 和服务器端上传文件的方法签名对应,参数也对应 -->
<operation name="upload" qname="operNS:upload" xmlns:operNS="upload" returnType="rns:string"
xmlns:rns="http://www.w3.org/2001/XMLSchema">
<parameter name="handler" type="ns:DataHandler" xmlns:ns="http://www.w3.org/2001/XMLSchema"/>
<parameter name="fileName" type="ns:string" xmlns:ns="http://www.w3.org/2001/XMLSchema"/>
</operation>
<typeMapping qname="hns:DataHandler" xmlns:hns="ns:FileUploadHandler"
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>

上面才xml节点元素在前面都见过了,说明下operation中的参数,注意要指定参数类型,特别是DataHandler的类型,然后就是typeMapping的serializer、deserializer的序列化和反序列化工厂类的配置。
3、 用dos命令发布当前WebService
C:\SoftWare\tomcat-5.0.28\tomcat-5.0.28\webapps\AxisWebService\WEB-INF>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/AxisWebService/services/AdminService deployUpload.wsdd
发布完成后,可以通过这个地址查看uploadFile这个service了
http://localhost:8080/AxisWebService/servlet/AxisServlet
4、 编写客户端代码

package com.hoo.client;

import java.rmi.RemoteException;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory;
import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory;

/**
* <b>function:</b>上传文件WebService客户端
*
* @author hoojo
* @createDate Dec 18, 2010 1:38:14 PM
* @file UploadFileClient.java
* @package com.hoo.client
* @project AxisWebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class UploadFileClient

public static void main(String[] args) throws ServiceException, RemoteException
String url = "http://localhost:8080/AxisWebService/services/UploadFile";
String fileName = "readMe.txt";
String path = System.getProperty("user.dir") + "\\WebRoot\\" + fileName;
System.out.println(path);

//这样就相当于构造了一个带文件路径的File了
DataHandler handler = new DataHandler(new FileDataSource(path));

Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);

/**
* 注册异常类信息和序列化类 ns:FileUploadHandler 和 wsdd 配置文件中的typeMapping中的xmlns:hns="ns:FileUploadHandler" 的对应 DataHandler
* 和 wsdd 配置文件中的typeMapping中的qname="hns:DataHandler"的DataHandler对应
*/
QName qn = new QName("ns:FileUploadHandler", "DataHandler");
call.registerTypeMapping(DataHandler.class, qn,
JAFDataHandlerSerializerFactory.class,
JAFDataHandlerDeserializerFactory.class);
call.setOperationName(new QName(url, "upload"));

//设置方法形参,注意的是参数1的type的DataHandler类型的,和上面的qn的类型是一样的
call.addParameter("handler", qn, ParameterMode.IN);
call.addParameter("fileName", XMLType.XSD_STRING, ParameterMode.IN);

//设置返回值类型,下面2种方法都可以
call.setReturnClass(String.class);
//call.setReturnType(XMLType.XSD_STRING);

String result = (String) call.invoke(new Object[] handler, "remote_server_readMe.txt" );
System.out.println(result);



至此,文件传输就完成了。怎么样,还不错吧!
如果你用myEclipse进行开发的话,运行时可能会出现以下的错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
原因是jar包版本不统一,解决方法如下:
删除Java EE 5 Libraries/javaee.jar/mail里的包有东西.
具体方法如下:
用rar打开X:/Program Files/MyEclipse 6.0/myeclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_6.0.1.zmyeclipse601200710/data/libraryset/EE_5/javaee.jar,然后删除mail,一切就ok了.
参考技术A 1.xml 本身不就是个文本吗,字符串参数就可以呀?
2.将xml文件中的内容通过base64编码后再作为byte[]参数进行传送。
3.还有一种方式是用 SAAJ ,将文件内容作为SOAP包中的附件形式传送。但这个好像不是webserviece了。

Java WebService 数据的传输

string acceptWeigh (string user, string password, byte[] XMLData) 前面是的用户的验证,当验证通过后 我们怎么将byte数组里的数据取出来放到数据库中去,数据对着多个字段, WebService是通过XML来传递的。

首先要确定传递过来的xmlData的编码,假设就是UTF-8吧
String xmlStr = new String(xmlData, "UTF-8");
转成字符串以后就创建xml文档了,然后解析标签入库就是
感觉你在接口里就应该把xmlData声明成字符串类型的
参考技术A webService是通过soap协议(简单对象访问协同)通信的,说白了就是通过http传送xml文本。webService定义了一个标准叫wsdl(web服务定义语言),其实就是xml文本,定义了你要访问对方服务器端的方法名称、参数名称、返回值信息,但是你要与服务器端通信就不许通过一个叫做axis的引擎,它负责将对象转解析xml文本传输给服务器端,到服务器又将xml转化成对象,因为不同平台对象之间是不认识的。
webService技术架构比较简单,所以学起来比较容易,就是传送的是xml文本,所以比较慢。
corba则就不同了,它是传送二进制,速度很快。但是编程模型太过于复杂,学习起来就相对困难了。corba是属于重量级的。

以上是关于怎么用WebService传输XML文件的主要内容,如果未能解决你的问题,请参考以下文章

请问达人,java 提供webservice接口,用XML传输数据,怎么实现?

java webservice 总结(学会读别人的webservice并且通过代理模式访问)

webservice怎么传送多个参数

Java WebService 数据的传输

webservice返回的xml怎么解析

webservice实用技术