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文件,在某个""后加入以下内容:
例程4 手工部署JAX-RPC应用
然后重新启动Apache axis引擎。可以使用下面的方法在浏览器里验证ImageService是否已经成功部署:
http://localhost:8080/axis/services/ImageService wsdl&method=getImage&name=test.jpg
这个地址您需要根据具体的情况更改。
如果成功部署,将在浏览器里返回以下的内容:
例程5 调用ImageService返回的消息
< xml version="1.0" encoding="UTF-8" >
注意getImageReturn之间的数据是经过BASE64后的数据,xsi:type="xsd:string"表示它的数据类型是String。
下面来看怎么在客户端对SOAP消息进行处理。
例程6 处理SOAP 经过BASE64编码后的消息
package com.hellking.webservice; import java.awt.*; import javax.swing.ImageIcon; import javax.swing.JFrame; public class GetImageByString extends ImageClient { public Image getImageFromWebservice() { ImageIcon img=null ; com.hellking.webservice.ImageServiceInterface service; try { service = new com.hellking.webservice.ImageServiceInterfaceServiceLocator().getImageService(); String result=service.getImage("test.jpg"); byte[] bytes = new sun.misc.BASE64Decoder().decodeBuffer(result); img = new ImageIcon(bytes); } catch (Exception re) { re.printStackTrace(); } return img.getImage(); } public static void main(String[] args) { new GetImageByString(); } }
解码的方法是编码的逆过程,同样很简单。
byte[] bytes = new sun.misc.BASE64Decoder().decodeBuffer(result)
把JAX-RPC调用结果解码成byte[];img = new ImageIcon(bytes)使用解码后的byte[]来构建一个ImageIcon。
最后看一下GUI程序怎么使用Image结果。
例程7 在GUI客户端使用BASE64解码后的Image
package com.hellking.webservice; import java.awt.*; import javax.swing.ImageIcon; import javax.swing.JFrame; public abstract class ImageClient extends JFrame { public ImageClient() { super("test image transport"); setSize(800, 600); setVisible(true); } public abstract Image getImageFromWebservice(); public void paint(Graphics g) { super.paint(g); Image img = getImageFromWebservice(); g.drawImage(img,0,0,null); } }
ImageClient是客户端GUI程序的框架,前面的GetImageByString继承了它。GetImageByString的目的是获得Image,ImageClient的目的是显示Image。GetImageByString运行的结果如图1所示。

注意:运行此程序需要保证服务器端有对应的图像文件,比如test.jpg。
对于不是图像的BLOB数据,您可以通过特定的方式处理,比如保存到文件中。
例程8 保存结果
PrintWriter out1=null; try { out1=new PrintWriter(new BufferedWriter(new FileWriter("re.out"))); } catch(Exception e) { e.printStackTrace(); } try { int i=0; while(true) out1.print(bytes[i++]); } catch(Exception e) { e.printStackTrace()