java webservice 传输文件
阅读本文前您需要以下的知识和工具:
JavaTM Web Services Developer Pack 1.1,并且会使用初步使用
Apache axis1.1
初步了解JAX-RPC编程方法
SAAJ、JAXM编程的基本技能
有图像处理的一般知识
本文的参考资料见 参考资料
本文的全部代码在这里 下载
BOLB、CLOB数据传输方法
在SOAP消息中,复杂的数据类型包括记录、对象和结构等,还包括图像、声音等多媒体数据。在记录、结构的数据,可以利用XML本身的机制进行表示,比如要表示一些查询的图书的信息,可以使用以下的方法进行表示:
例程1 在SOAP消息中表示复杂的数据
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <soap-env:Header/> <soap-env:Body> <books:GetAllBooks xmlns:books="http://hellking.webservice.com"> <books:book id="isbn-34-234-xxxx-34"> <books:name>J2EE Web 服务开发 </books:name> <books:publisher> 电子工业出版社 </books:publisher> <books:price> xxxxx </books:price> <books:category>计算机</books:category> <books:description> xxxxxxxxx </books:description> <books:author> xxxxxx </books:author> <books:author> xxxxx </books:author> </books:book> <books:bookid="242334"> … </books:book> </books:GetAllBooks> </soap-env:Body> </soap-env:Envelope> 另一个例子: <myFavoriteNumbers SOAP-ENC:arrayType="xsd:int[2]"> <number>3</number> <number>4</number> </myFavoriteNumbers>
除了使用上述的方式传输外,还可以使用序列化对象的方式。我们知道,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 inte易做图ce ImageServiceInte易做图ce 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=<axis安装目录> 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.ImageServiceInte易做图ce
以上方法将生成一个名为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.ImageServiceInte易做图ce{ 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; } }
在上面的程序中,byte[] bytes=new byte[1024000]表示要传输的图像内容小于1M,你可以根据具体情况设置,ImageServiceSoapBindingImpl.class.getResourceAsStream(in0)是获得图像文件的输入流,in0是文件名,如test.jpg。这个程序中最关键的部分是:
new sun.misc.BASE64Encoder().encode(bytes);
它把byte[]编码成目标String。
下面的工作就是编译这些代码,然后部署。您可以使用下面的方式进行部署:
java org.apache.axis.client.AdminClient deploy.wsdd
使用这中方式部署时,需要保证Apache axis引擎处于运行状态。如果这个方式部署不成功,也可以直接把编译好的代码拷贝到目标应用中,如:
%TOMCAT_HOME%/webapps/axis/WEB-INF/classes/
接下来编辑%TOMCAT_HOME%/webapps/axis/WEB-INF/server-config.wsdd文件,在某个"</service>"后加入以下内容:
例程4 手工部署JAX-RPC应用
<service name="ImageService" provider="java:RPC"> <parameter name="allowedMethods" value="*"/> <parameter name="wsdlPortType" value="ImageServiceInte易做图ce"/> <parameter name="wsdlServicePort" value="ImageService"/> <parameter name="className" value="com.hellking.webservice.ImageServiceSoapBindingSkeleton"/> <parameter name="scope" value="Session"/> <parameter name="wsdlTargetNamespace" value="urn:ImageService"/> <parameter name="wsdlServiceElement" value="ImageServiceInte易做图ceService"/> </service>
然后重新启动Apache axis引擎。可以使用下面的方法在浏览器里验证ImageService是否已经成功部署:
http://localhost:8080/axis/services/ImageService?wsdl&method=getImage&name=test.jp
补充:软件开发 , Java ,