Java WS和二进制数据传送

2008-02-23 09:34:51来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

(一) 有关介绍

二进制数据在WS中传送,可以有两种方式:

1 把数据直接作为XML文档中某元素的字节流,作为XML解析器要解析的一部分,很明显这种方式比较低效.

2 二进制数据作为附件,作为带外(out of band)数据随同XML发送, 提高了效率.目前这类处理有几个规范:

DIME(直接 Internet 消息封装),这个数据包装格式及其处理,只有微软在支持.

http://www.microsoft.com/china/msdn/archives/library/dnwebsrv/html/DIMEWSAttch.asp

http://www.zdnet.com.cn/developer/code/story/0,3800066897,39358789,00.htm

MTOM(SOAP 消息传输优化机制)和XOP(二进制 XML 优化封装);

在Sun规范JAX-RPC1.1中,要求使用SwA(SOAP with Attachments) 支持附件,为此Sun提供了SOAP with Attachments API for Java,带附件的SoapAPI(SAAJ),早期它和jaxm合在一起的,现在已经独立开来形成了soap包,这个API专门用来处理Soap附件的所有操作.

JAXRPC 1.1 规范定义了MIME类型到Java类型的影射.

MIME Type
Java Typeimage/gifjava.awt.Imageimage/jpegjava.awt.Imagetext/plainjava.lang.Stringmultipart/*javax.mail.internet.MimeMultiparttext/xml or application/xmljavax.xml.transform.Source

JAXRPC 1.1 规范定义了这种情况:当绑定到上表中没有定义的类型影射或者是绑定到备用MIME类型时,它应该影射到 javax.activation.DataHandler.

wscompile工具中的选项-f:<features>用于类型影射的项:datahandleronly,该项指明总是把附件影射到DataHandler类型.

(二) 编写例子应用

文件清单

SEI接口类IImage.java,实现SEI接口的类IIMageImpl.java,描述文件信息的值类型类FileInfo.java,Web应用部署描述文件web.xml,WS发布配置文件jaxrpc-ri.xml,WS编译配置文件config-interface.xml,构建客户端桩的config-wsdl.xml,构建文件build.xml

客户端测试类:MainBrowser.java,ImageListProvider.java和ImageLabelProvider.java,测试使用了SWT和JFace,请适当配置你的Eclipse环境,引入适当的库.

这个例子是从SEI开始,绑定样式为 RPC.

IImage.java清单:

package com.bin;

import java.rmi.Remote;
import java.rmi.RemoteException;
import javax.activation.*;
import javax.xml.soap.*;
import java.util.*;
public interface IImage extends Remote {

public DataHandler fetchImg(String sn) throws RemoteException;

public ArrayList fetchImgs(String[] sn) throws RemoteException;

public SOAPMessage construcMsg(String[] fn) throws RemoteException;

public ArrayList fetchFileList() throws java.rmi.RemoteException;

public FileInfo getFileList(String fn) throws java.rmi.RemoteException;
}

实现类 ImageImpl.java清单:

package com.bin;

import javax.xml.soap.*;
import java.net.*;
import java.util.*;
import java.io.*;
import javax.activation.*;
import java.rmi.*;
import java.awt.*;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.server.*;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.rpc.handler.MessageContext;
import javax.Servlet.ServletContext;
import com.sun.xml.rpc.server.*;

public class ImageImpl implements IImage, ServiceLifecycle {

ServletEndpointContext servletEndpointContext = null;

String binarypath = "";

ArrayList al;

ServletContext servletContext = null;

public void init(Object p0) throws ServiceException {
// Some logic to do upon service creation
servletEndpointContext = (ServletEndpointContext) p0;
servletContext = servletEndpointContext.getServletContext();
binarypath = servletContext.getInitParameter("BinaryPath");
}

public void destroy() {
// Some logic to do on service destruction - e.g. clean up JDBC
servletEndpointContext = null;
servletContext = null;
}

public ArrayList fetchFileList() throws RemoteException {
File file = new File(this.binarypath);
//System.out.println(this.binarypath);
if (al == null)
al = new ArrayList();
File[] c = file.listFiles();
for (int i = 0; i < c.length; i ) {
FileInfo fi = new FileInfo();
fi.setIsdir(c[i].isDirectory());
fi.setFilename(c[i].getName());
fi.setFilelength(c[i].length());
fi.setFilepath(c[i].getAbsolutePath());
fi.setCreatedate(new Date(c[i].lastModified()));
al.add(fi);
}
return al;
}

public DataHandler fetchImg(String sn) throws RemoteException {
File file = new File(sn);
DataHandler dataHandler = null;
try {
URL url = new URL(file.toURL().toString());
dataHandler = new DataHandler(url);
} catch (Exception ex) {
System.out.println(ex);
throw new RemoteException(ex.getMessage());
}
return dataHandler;
}

public ArrayList fetchImgs(String[] fn) throws RemoteException {
ArrayList al = new ArrayList();
try {
for (int i = 0; i < fn.length; i ) {
File file = new File(fn[i]);
// Create attachment part for image

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:使用Apache POI和Java获得Excel文件内容,无须MS-Office ActiveX

下一篇:Digester in Tomcat