- 浏览: 650644 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (213)
- JAVA (53)
- Tomcat (14)
- EXTJS专栏 (2)
- 数据库 (23)
- JavaScript (13)
- jQuery (11)
- 需求分析 (2)
- css (1)
- 手机 (1)
- php (7)
- 生活 (1)
- ssh (11)
- JFReeChart (2)
- Delphi (1)
- junit (0)
- liunx (10)
- 项目管理 (11)
- 文件下载 (1)
- Eclipse (2)
- jsp (2)
- 外挂、游戏 (1)
- 面试题 (8)
- 性能测试 (2)
- apache (1)
- MyBatis (1)
- Webservice (2)
- ant (1)
- IDEA (2)
- log4j (1)
- 小程序 (1)
最新评论
-
hll127:
请问service这个方法里为什么要while(true)啊? ...
jsp页面静态化例子 -
tarena1:
Spring 源码解读 推荐流程 -
konglx:
springaop_springmvc 写道可以参考最新的文档 ...
Web项目添加Maven支持步骤 -
springaop_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Web项目添加Maven支持步骤 -
9976:
很好,谢谢
Spring 源码解读 推荐流程
在SOAP消息中传输BLOB和CLOB数据![]() |
![]() |
本文是J2EE Web服务开发系列文章的第五篇。将介绍在SOAP消息中传输BOLB(Binary Large Objects,大型二进制对象)和CLOB(Character Large Objects,字符大对象)数据的方法,然后为以图像传输为例子讨论BLOB、CLOB数据传输的编程实现方法。<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--> 阅读本文前您需要以下的知识和工具:
本文的参考资料见 参考资料 本文的全部代码在这里 下载
在SOAP消息中,复杂的数据类型包括记录、对象和结构等,还包括图像、声音等多媒体数据。在记录、结构的数据,可以利用XML本身的机制进行表示,比如要表示一些查询的图书的信息,可以使用以下的方法进行表示: 例程1 在SOAP消息中表示复杂的数据
除了使用上述的方式传输外,还可以使用序列化对象的方式。我们知道,Java中的序列化对象可以在网络上传输、保存。具体的过程是把这些数据保存在可序列化的Java对象中,然后把此对象序列化传输到对方,对方对此序列化对象进行"解冻",然后获得要传输的数据。相对于直接用XML表示数据,这种方式比较消耗系统资源。 SOAP消息基于XML技术,XML在表示文本方面有很大的便利性,但是如果要在XML中表示图像、声音等多媒体数据(这里指把图像、声音等数据包含在同一个XML文件中,而不是使用外部实体),那么就不是那么简单了。理论上,你也可以把要传输的BLOB、CLOB数据保存在序列化的Java对象中,然后以序列化的Java对象为载体进行传输。但是这些一种非常的低效的方法! 要在SOAP中传输BLOB数据,通常有以下两种方法:
对于CLOB数据,不需要使用BASE64编码,可以直接作为SOAP Body的一部分或者作为MIME附件传输。 本文将使用以上两种方式,以图像传输为例子讨论在SOAP消息中传输BLOB、CLOB数据的方法。首先我们看怎么使用BASE64编码来传输图形。
使用BASE64编码来传输BLOB数据的基本过程是:
下面我们结合图形传输来看具体的编程实现。在这里我们使用JAX-RPC的方式,您需要有Apache axis引擎。 首先是确定服务端的接口,这里定义了一个方法:getImage(String imageName)。如例程2所示。 例程2 JAX-RPC服务端接口
注意getImage方法返回的数据类型,它是String,也就是通过BASE64编码后的String。 使用这个接口生成WSDL文件,可以使用下面的方法:
以上方法将生成一个名为wp.wsdl的WSDL文件,生成了WSDL文件后,就可以使用WSDL2Java生成JAX-RPC的框架,如下所示:
这个框架中,有一个名为ImageServiceSoapBindingImpl的类,我们要在里面增加实现方法。 修改后的ImageServiceSoapBindingImpl如例程3所示。 例程3 JAX-RPC服务端实现类
在上面的程序中,byte[] bytes=new byte[1024000]表示要传输的图像内容小于1M,你可以根据具体情况设置,ImageServiceSoapBindingImpl.class.getResourceAsStream(in0)是获得图像文件的输入流,in0是文件名,如test.jpg。这个程序中最关键的部分是:
它把byte[]编码成目标String。 下面的工作就是编译这些代码,然后部署。您可以使用下面的方式进行部署:
使用这中方式部署时,需要保证Apache axis引擎处于运行状态。如果这个方式部署不成功,也可以直接把编译好的代码拷贝到目标应用中,如:
接下来编辑%TOMCAT_HOME%/webapps/axis/WEB-INF/server-config.wsdd文件,在某个"</service>"后加入以下内容: 例程4 手工部署JAX-RPC应用
然后重新启动Apache axis引擎。可以使用下面的方法在浏览器里验证ImageService是否已经成功部署:
这个地址您需要根据具体的情况更改。 如果成功部署,将在浏览器里返回以下的内容: 例程5 调用ImageService返回的消息
注意getImageReturn之间的数据是经过BASE64后的数据,xsi:type="xsd:string"表示它的数据类型是String。 下面来看怎么在客户端对SOAP消息进行处理。 例程6 处理SOAP 经过BASE64编码后的消息
解码的方法是编码的逆过程,同样很简单。
把JAX-RPC调用结果解码成byte[];img = new ImageIcon(bytes)使用解码后的byte[]来构建一个ImageIcon。 最后看一下GUI程序怎么使用Image结果。 例程7 在GUI客户端使用BASE64解码后的Image
ImageClient是客户端GUI程序的框架,前面的GetImageByString继承了它。GetImageByString的目的是获得Image,ImageClient的目的是显示Image。GetImageByString运行的结果如图1所示。 ![]() 注意:运行此程序需要保证服务器端有对应的图像文件,比如test.jpg。 对于不是图像的BLOB数据,您可以通过特定的方式处理,比如保存到文件中。 例程8 保存结果
需要指出的是,不同的BLOB数据,在保存时要对格式进行不同的处理,如果使用上面的方法保存图片,将不能得到正确的结果,需要进行额外的处理。具体的处理方式,已经是本文的题外话了。本案例的详细代码您可以从这里 下载。 下面我们讨论使用附件的形式在SOAP中传输BLOB数据。
在SOAP消息中,允许我们像邮件一样发送附件。附件由另一份文档或者份图像内容组成。一般而言,附件应该采用文本或者二进制数据格式来表示。在英特网上,GIF和JPEG数据格式是图形传输的事实标准。SOAP消息允许带有一个或者多个MIME格式的附件。常用的MIME格式有:
下面是一个带有普通文档文本的SOAP消息的一部分。 例程9 带有附件的SOAP消息
上面的黑体字是具体的附件的内容。它的Content-Type是text/plain,id是hello。 SAAJ(SOAP with Attachments API for Java)为发送带附件的SOAP消息提供了编程接口。在编程中,我们使用SOAPMessage对象来创建AttachmentPart(SOAP 附件)对象,如下:
每个AttachmentPart对象有一个或者多个headers和它相关联。Content-Type是Header中必须的元素,其它的元素如:Content-Id,Content-Location是Header中可选的元素。如果要创建一个简单的文本附件,可以使用下面的方式。 例程10创建一个简单的带文本的SOAP附件
上面创建的附件的MIME类型是text/plain。如果要创建一个图形的MIME附件,可以使用下面的方法。 例程11 创建一个图形的MIME附件
也许你觉得这样创建图形附件比较麻烦,下面有一种相对容易的创建方法。 例程12另一个创建一个图形的MIME附件的方法
这里使用了DataHandler对象,它是JavaBean Activation Framework (JAF)的一部分,使用它来创建SOAP附件相对直接,首先创建一个URL,这个URL表示了图像文件存储的位置,然后使用这个URL来创建一个DataHandler对象,接下来就使用这个DataHandler来创建SOAP附件了。 接下来我们来编写一个具体的例子飧隼雍颓懊娴睦右谎彩窃赟OAP消息中传输一个图像文件,不同的是使用附件的方式。 这里的附件端采用了JAXM Servlet,关于JAXM编程的请参考此系列文章的第一篇(用JAXM开发Web服务)。服务端的代码如下: 例程13 SOAP消息发送服务端
当然,除了使用DataHandler来创建SOAP消息外,还可以按照前面介绍的使用基本的IO的方式来创建。 下面来看客户端的代码。如例程14所示。
(对于上面这段程序,请原谅我使用了一个特别庞大的getImageFromWebservice方法,并且使用了一个超级长的try{}语句,因为我实在没有时间来把它写得漂亮一点了^_^) 客户端的执行过程是这样的:
由于一个SOAP消息中可能有多个附件,那么returnedSOAPMessage.getAttachments()方法获得的可能是一个Iterator,所以要遍历这个Iterator对SOAP消息的附件进行处理。attachment.getDataHandler().getInputStream()获得了附件的输入流,DecodeImage是从这个输入流进行获得输入,然后把它们解码成Image。这里的解码方式和BASE64解码方式稍有不同,BASE64解码方式是把String类型的对象解码成byte[],具体我们使用了sun.misc.BASE64Decoder类的decodeBuffer方法;这里的解码是把一个输入流中的数据解码成BufferedImage。 当然,这里举例的是图像的处理,如果是别的格式数据,您同样可以进行其它的处理。由于篇幅的限制,在这里就不在赘述了。你同样可以运行GetImageByAttachmentClient来测试运行的效果。需要指出的是,使用这种方式来传输图像时效率比前一种方法好,响应速度(启动客户端到在客户端打印出图像的时间)大概是使用BASE64编码速度的一倍(我的机器环境是:WinXP,AMD Athlon XP 16000+,512M内存,Tomcat 4.03),您可以在您的机器上测试,如果您的测试结果比我的相差很多,您可以通过email告诉我,到时我们可以深入讨论这个效率问题。 运行代码说明: 运行前,需要安装JWSDP1.1,您可以从http://java.sun.com/webservices下载。然后把代码(axis目录)拷贝到%JWSDP_HOME%/webapps/目录下,启动Tomcat即可。主程序在axis/WEB-INF/classes/目录下,分别是GetImageByString.java和GetImageByAttachmentClient.java。
我们以图像数据的传输为例子,讨论了BOLB数据在SOAP消息中的表示、传输问题,如果是声音、多媒体等数据,也可以这样传输;对于CLOB数据的传输,它比BLOB数据更简单,不需要编码就可以在SOAP Body中表示、传输,同时也可以作为附件来传输。
|
- src.zip (2.3 MB)
- 下载次数: 28
发表评论
-
tomcat7下对HTTPS的部署配置
2018-11-09 15:33 7741、申请CA证书,可以在腾讯云或者阿里云申请到免费的CA ... -
IDEA切换 svn 问题
2017-11-27 09:21 4941今天项目,本来以为就几分钟的事没想到,还出现报错了,错误日记 ... -
log4j cfx 接口请求、返回信息 日志文件分离
2017-06-28 15:04 2133log4j.rootLogger=info,stdout, ... -
junit 启动报错:java.lang.NoClassDefFoundError
2013-04-17 19:31 1649junit 启动报错:java.lang.NoClassDe ... -
Java中抽象类和接口的区别
2013-04-16 12:12 1006小结 1.abstract class 在 Java ... -
web.xml中servlet, bean, filter, listenr 加载顺序汇总
2013-03-28 16:17 1524web.xml中servlet, bean, filter, ... -
深入Java虚拟机JVM类加载初始化学习笔记
2013-03-26 20:39 12211. Classloader的作用,概括来说就是将编译后的c ... -
http代理出错Proxy Error
2013-03-22 09:15 1629最近项目突然访问几下次报: Proxy Error ... -
通过javamelody监控web应用的性能指标
2013-03-04 12:00 17531、问题背景 为了提升应用的性能我们可能需要做很多分析和 ... -
javamelody监控
2013-03-04 11:50 1489. 将 javamelody-1.42.0.war 文件部署 ... -
myeclipse安装svn插件的肯定可行的方法
2012-12-18 21:26 9321、下载最新的SVN包:http://subclipse.ti ... -
WordTemplate 使用
2012-03-27 11:28 1211http://wiki.softartisans.com/di ... -
asyn4j 异步方法调用框架
2012-03-14 14:19 1945例子: 1.调用普通方法 主方法 ... -
asyn4j -- 异步方法调用框架
2012-03-14 14:15 01.3更新 优化代码 新增任务持久与恢复功能 ... -
JasperReport
2011-09-01 13:45 1262“在JRE 5以上的java环境中,java会自动加载$JAV ... -
解决Linux操作系统下AES解密失败的问题
2011-03-11 16:00 7032现象描述: windows上加解密正常,linu ... -
使用set+list进行过滤重复并排序
2011-02-28 11:30 1806有时要把有重复的数据用set去掉重复元素,但用set后又把元素 ... -
ssh 事务
2011-01-12 23:03 1180ssh在做事务提交时,不能直接用Sql语句进行insert i ... -
struts2与 json
2011-01-10 09:17 1210需要注意的是,如果用JSON插件把返回结果定为JSON。而JS ... -
struts2返回json数据问题
2011-01-06 20:58 1281最近同事反映struts2返回数据不了json数据,特意测试了 ...
相关推荐
它允许XML文档以原生XML格式存储在数据库中,或者作为BLOB、CLOB或BFILE对象存储。这使得XML数据可以高效地索引、查询和操作。 2. **XDB(XML Database)组件**:XDB是Oracle XML DB的核心,它包含一系列的存储过程...
pimpinella_3cd_01_0716
FIB English learning
X86-jq安装包
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
大圣挪车小程序1.3.5 前端
Manus.im 产品及开发团队研究报告.pdf
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
sun_3ck_01a_0918
下载 1. 单击“立即下载”,以下载该文件。 2. 出现“文件下载”窗口后,单击“保存”,以将文件保存到硬盘。 安装 1. 浏览至文件下载目标位置并双击新下载的文件。 2. 仔细阅读对话窗口中显示的发布信息。 3. 下载并安装对话窗口中标识的任何必备项,然后再继续。 4. 单击“Install”(安装)按钮。 5. 按照其余提示执行更新。 安装 1. 将解压的文件复制到可访问Windows的介质。 2. 将系统重新引导至Windows操作系统。 3. 打开“服务器管理器”->“设备管理器”->“存储控制器”,然后单击“PERC控制器”。 5. 单击“更新驱动程序软件”,并按照提示更新驱动程序。 4. 重新引导系统以使更改生效。
支持所有操作系统一键安装。
matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
swanson_01_1106
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
sun_3ck_01_0919
各城市方言距离数据-中山大学岭南学院产业与区域经济研究中心 方言距离是指两种或多种方言之间的相似程度或差异程度。参考中山大学岭南学院产业与区域经济研究中心的刘毓芸等(2015)文献。他们基于方言树图,并参考《汉语方言大词典》和《中国语言地图集》对方言的划分,将汉语方言从宽泛到具体分为以下几个层级:汉语→方言大区→方言区→方言片。为了量化县与县之间的方言差异,他们采用了一种赋值方法: 若它们分属不同方言大区,则距离为3。: 若两个县同属一个方言片,则它们之间的方言距离为0; 若两个县属于同一方言区但不同方言片,则距离为1; 若它们属于同一方言大区但不同方言区,则距离为2; 方言距离是一个反映方言之间相似程度或差异程度的重要指标,它在语音识别、方言研究等领域具有广泛的应用价值。 参考文献:[1]刘毓芸, 徐现祥, 肖泽凯. 2015. 劳动力跨方言流动的倒U型模式[J]. 经济研究, 50(10): 134-146+162. 指标 语系、语族、方言大区、方言区/语支、方言片/语种、Supergroup、Dialect、group、Sub-dialect、groupPref_1、Pref_2、DiaDist、PrefCode_1、PrefCode_2等等。
基于PCA算法的人脸识别MATLAB源码