java webservice 传输文件(一)

2014-11-24 09:56:29 · 作者: · 浏览: 5

阅读本文前您需要以下的知识和工具:

JavaTM Web Services Developer Pack 1.1,并且会使用初步使用
Apache axis1.1
初步了解JAX-RPC编程方法
SAAJ、JAXM编程的基本技能
有图像处理的一般知识
本文的参考资料见 参考资料
本文的全部代码在这里 下载
BOLB、CLOB数据传输方法
在SOAP消息中,复杂的数据类型包括记录、对象和结构等,还包括图像、声音等多媒体数据。在记录、结构的数据,可以利用XML本身的机制进行表示,比如要表示一些查询的图书的信息,可以使用以下的方法进行表示:
例程1 在SOAP消息中表示复杂的数据
J2EE Web 服务开发 电子工业出版社 xxxxx 计算机 xxxxxxxxx xxxxxx xxxxx 另一个例子: 3 4

除了使用上述的方式传输外,还可以使用序列化对象的方式。我们知道,Java中的序列化对象可以在网络上传输、保存。具体的过程是把这些数据保存在可序列化的Java对象中,然后把此对象序列化传输到对方,对方对此序列化对象进行"解冻",然后获得要传输的数据。相对于直接用XML表示数据,这种方式比较消耗系统资源。
SOAP消息基于XML技术,XML在表示文本方面有很大的便利性,但是如果要在XML中表示图像、声音等多媒体数据(这里指把图像、声音等数据包含在同一个XML文件中,而不是使用外部实体),那么就不是那么简单了。理论上,你也可以把要传输的BLOB、CLOB数据保存在序列化的Java对象中,然后以序列化的Java对象为载体进行传输。但是这些一种非常的低效的方法!
要在SOAP中传输BLOB数据,通常有以下两种方法:
使用BASE64编码,把要传输的数据直接作为SOAP Body中的一部分
作为MIME附件,附加在SOAP消息上
对于CLOB数据,不需要使用BASE64编码,可以直接作为SOAP Body的一部分或者作为MIME附件传输。
本文将使用以上两种方式,以图像传输为例子讨论在SOAP消息中传输BLOB、CLOB数据的方法。首先我们看怎么使用BASE64编码来传输图形。
回页首
使用BASE64编码传输BLOB数据
使用BASE64编码来传输BLOB数据的基本过程是:
在服务端读取目标BLOB数据保存在byte[]中;
使用BASE64Encoder(编码器,如sun.misc.BASE64Encoder)把byte[]编码成String;
当客户端发出请求时,就返回这个String;
客户端从SOAP消息中读取这个String;
使用BASE64Decode(解码器,如sun.misc.BASE64Decoder)把String解码成byte[];
对byte[]进行处理(如果时图像,就把它还原成图像;如果是声音,将把它还原成声音)
下面我们结合图形传输来看具体的编程实现。在这里我们使用JAX-RPC的方式,您需要有Apache axis引擎。
首先是确定服务端的接口,这里定义了一个方法:getImage(String imageName)。如例程2所示。
例程2 JAX-RPC服务端接口
package com.hellking.webservice; public interface ImageServiceInterface extends java.rmi.Remote { public java.lang.String getImage(java.lang.String in0) throws java.rmi.RemoteException; }

注意getImage方法返回的数据类型,它是String,也就是通过BASE64编码后的String。
使用这个接口生成WSDL文件,可以使用下面的方法:
SET AXIS_HOME= set CLASSPATH=%CLASSPATH%; %AXIS_HOME%/axis-1_1/lib/axis.jar; %AXIS_HOME%/axis-1_1/lib/jaxrpc.jar; %AXIS_HOME%/axis-1_1/lib/saaj.jar; %AXIS_HOME%/axis-1_1/lib/commons-logging.jar; %AXIS_HOME%/axis-1_1/lib/commons-discovery.jar; %AXIS_HOME%/axis-1_1/lib/wsdl4j.jar;. java org.apache.axis.wsdl.Java2WSDL -o wp.wsdl http://localhost:8080/axis/services/ImageService" -n "urn:ImageService" -p"com.hellking.webservice" "urn:ImageService" com.hellking.webservice.ImageServiceInterface

以上方法将生成一个名为wp.wsdl的WSDL文件,生成了WSDL文件后,就可以使用WSDL2Java生成JAX-RPC的框架,如下所示:
java org.apache.axis.wsdl.WSDL2Java -o . -d Session -s -S true -Nurn:ImageService com.hellking.webservice wp.wsdl

这个框架中,有一个名为ImageServiceSoapBindingImpl的类,我们要在里面增加实现方法。
修改后的ImageServiceSoapBindingImpl如例程3所示。
例程3 JAX-RPC服务端实现类
package com.hellking.webservice; import java.io.*; public class ImageServiceSoapBindingImpl implements com.hellking.webservice.ImageServiceInterface{ public java.lang.String getImage(java.lang.String in0) throws java.rmi.RemoteException { String ret=new String(); try { byte[] bytes=new byte[1024000];//小于1M InputStream in=ImageServiceSoapBindingImpl.class.getResourceAsStream(in0); in.read(bytes); ret=new sun.misc.BASE64Encoder().encode(bytes); //具体的编码方法 in.close(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(java.io.IOException ex) { ex.printStackTrace(); } return ret; } }

在上面的程序中,