(一) 有关介绍二进制数据在WS中传送,可以有两种方式:1 把数据直接作为xml文档中某元素的字节流,作为XML解析器要解析的一部分,很明显这种方式比较低效.2 二进制数据作为附件,作为带外(out of band)数据随同XML发送, 提高了效率.目前这类处理有几个规范:DIME(直接 Internet 消息封装),这个数据包装格式及其处理,只有微软在支持.WSattch.asp" />http://www.microsoft.com/china/msdn/archives/library/dnwebsrv/html/DIMEWSAttch.asphttp://www.zdnet.com.cn/developer/code/story/0,3800066897,39358789,00.htmMTOM(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.sourceJAXRPC 1.1 规范定义了这种情况:当绑定到上表中没有定义的类型影射或者是绑定到备用MIME类型时,它应该影射到 Javax.activation.DataHandler.WScompile工具中的选项-f:
用于类型影射的项: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客户端测试类:MainBro
WSer.
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) thro
WS RemoteException;public ArrayList fetchImgs(String[] sn) thro
WS RemoteException;public SOAPMessage construcMsg(String[] fn) thro
WS RemoteException;public ArrayList fetchFileList() thro
WS
Java.rmi.RemoteException;public FileInfo getFileList(String fn) thro
WS
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) thro
WS ServiceException {// Some logic to do upon service creationservletEndpointContext = (ServletEndpointContext) p0;servletContext = servletEndpointContext.getServletContext();binarypath = servletContext.getInitParameter("BinaryPath");}public void destroy() {// Some logic to do on service destruction - e.g. clean up JDBCservletEndpointContext = null;servletContext = null;}public ArrayList fetchFileList() thro
WS 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) thro
WS 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) thro
WS RemoteException {ArrayList al = new ArrayList();try {for (int i = 0; i < fn.length; i++) {File file = new File(fn[i]);// Create attachment part for imageURL url = new URL(file.toURL().toString());DataHandler dataHandler = new DataHandler(url);al.add(dataHandler);}} catch (Exception ex) {System.out.println(ex);throw new RemoteException(ex.getMessage());}return al;}public SOAPMessage construcMsg(String[] fn) thro
WS RemoteException {FileReader fr = null;BufferedReader br = null;String line = "";SOAPMessage message = null;try {// Create message factoryMessageFactory messageFactory = MessageFactory.newInstance();// Create a messagemessage = messageFactory.createMessage();// Get the SOAP header and body from the message// and remove the headerSOAPHeader header = message.getSOAPHeader();SOAPBody body = message.getSOAPBody();header.detachNode();for (int i = 0; i < fn.length; i++) {File file = new File(fn[i]);// Create attachment part for imageURL url = new URL(file.toURL().toString());DataHandler dataHandler = new DataHandler(url);AttachmentPart attachment2 = message.createAttachmentPart(dataHandler);attachment2.setContentId(file.getName());message.addAttachmentPart(attachment2);}} catch (IOException e) {System.out.println("I/O exception: " + e.toString());throw new RemoteException(e.getMessage());} catch (Exception ex) {ex.printStackTrace();throw new RemoteException(ex.getMessage());}return message;}public FileInfo getFileList(String fn) thro
WS RemoteException {// TODO Auto-generated method stubFile file = new File(fn);FileInfo fi = new FileInfo();fi.setFilename(file.getName());fi.setFilelength(file.length());fi.setFilepath(file.getAbsolutePath());fi.setCreatedate(new Date(file.lastModified()));return fi;}}FileInfo.
Java清单:package com.bin;import
Java.util.Date;/*** 这是一个值类型,既然是值类型,它满足:1 必须有缺省构造器. 2 必须没有实现Remote(直接的或是间接的). 3属性类型必须是JAX-RPC支持的类型.*/public class FileInfo {private String filename;private String filepath;private long filelength;private Date createdate;private boolean isdir = false;public FileInfo() {}public Date getCreatedate() {return createdate;}public void setCreatedate(Date createdate) {this.createdate = createdate;}public long getFilelength() {return filelength;}public void setFilelength(long filelength) {this.filelength = filelength;}public String getFilename() {return filename;}public void setFilename(String filename) {this.filename = filename;}public String getFilepath() {return filepath;}public void setFilepath(String filepath) {this.filepath = filepath;}public String toString() {return this.filename + this.getFilepath() + this.getFilelength();}public boolean isIsdir() {return isdir;}public void setIsdir(boolean isdir) {this.isdir = isdir;}}web.xml清单:
Java.sun.com/xml/ns/j2ee" />http://
Java.sun.com/xml/ns/j2ee"xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="
Java.sun.com/xml/ns/j2ee" />http://
Java.sun.com/xml/ns/j2ee
Java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" />http://
Java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">
BinaryPath
更改成你的本地文件路径
index.htm
index.jsp
index.j
WS
config-interface.xml清单:
Java.sun.com/xml/ns/jax-rpc/ri/config" />http://
Java.sun.com/xml/ns/jax-rpc/ri/config">
config-
WSdl.xml清单:
Java.sun.com/xml/ns/jax-rpc/ri/config" />http://
Java.sun.com/xml/ns/jax-rpc/ri/config"><
WSdl location="
WSdl" />http://localhost:8080/skysoft/binary?
WSDL"packageName="com.binary" />
jaxrpc-ri.xml清单:
Java.sun.com/xml/ns/jax-rpc/ri/dd" />http://
Java.sun.com/xml/ns/jax-rpc/ri/dd"version="1.0"targetNamespaceBase="
Java.sun.com/xml/ns/jax-rpc/
WSi/
WSdl" />http://
Java.sun.com/xml/ns/jax-rpc/
WSi/
WSdl"typeNamespaceBase="
Java.sun.com/xml/ns/jax-rpc/
WSi/types" />http://
Java.sun.com/xml/ns/jax-rpc/
WSi/types"urlPatternBase="/
WS">
构建文件build.xml:依次运行build,create-war,deploy,genstaticstub等任务,这样本例中的
WS所需要的文件全部生成.
WSdp-1.5/jaxrpc/lib">
WSdp-1.6/jaxrpc/lib">
Java WS和二进制数据传送
最新推荐文章于 2024-02-02 11:12:58 发布
<script type="text/javascript">
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>