- 浏览: 171386 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (193)
- Axis2 (10)
- Andriod (2)
- Java (22)
- Eclipse (2)
- 程序人生 (3)
- Windows (1)
- Sql Server 2005/2008 (7)
- 健身 (2)
- Log4j (1)
- Ant (1)
- Fatjar (2)
- 国际化 (1)
- Linux (3)
- JDBC (1)
- Oracle (2)
- 各种报错 (4)
- SWT (5)
- Tomcat (2)
- 车辆管理 (1)
- SVN (2)
- Spring (5)
- 域名服务器 (0)
- HaoWaYa (1)
- FTP (1)
- 集散中心 (1)
- 专业知识 (1)
- 面试准备 (19)
- 设计模式 (22)
- Junit (1)
- 软件下载 (3)
- 深入理解Java虚拟机 (3)
- 数据结构 (4)
- 雅思 托福 (0)
- UML (1)
- Maven (1)
- CV (1)
- ServiceMix (1)
- 电子书 (5)
- Struts1/2 (4)
- DOM W3C DHTML (3)
- Jawr (1)
- LoadRunner (1)
- Java反编译 (0)
- 英语学习 (0)
- 技术书籍 (1)
- Cygwin (0)
- ibatis (1)
- 数据库 (1)
- jQuery (0)
- s (2)
- 源代码项目 (5)
- JSRs (0)
- JCP (0)
- XML (2)
- Dojo (3)
- Effective Java (1)
- 一站到底 (3)
- JavaScript (6)
- DB2 (1)
- 刷机 (1)
- 字符 (1)
- Dynamic Web Project (1)
- 股市日记 (1)
- 代码片段 (0)
- CSS (1)
- PDF (0)
- 英语口语 (1)
- 乒乓球 (1)
- 体检 (0)
- 送花 (0)
- 面试准备-再战江湖 (5)
- ddq (0)
- sss (0)
- ssssss (0)
- 2020面试 (0)
最新评论
-
samsongbest:
Copperfield 写道你的目标很远大,佩服~惭愧,都忘了 ...
人生目标 -
Copperfield:
你的目标很远大,佩服~
人生目标
本文来自百度文库 代码和配置文件都能调通,采用比较好的方式,自己不写了。
听说axis传输文件过5M就嗝屁。要用attachment形式传输,故研究之。
官方参考:http://axis.apache.org/axis2/java/core/docs/mtom-guide.html
1.工作环境
IDE: Eclipse 3.1.2
jdk: jdk1.5.0_04
Tomcat: apache-tomcat-5.0.28
AXIS2:1.0(war版本和bin版本)
2.实现
在Eclipse新建一个动态web工程,在WEB-INF\lib下加入axis2所需的jar包。
本例的是一个系统的用户上传下载图片格式文件的例子,每次上传出携带附件外,还包括文件名, 文件类型。此webservice实现的2个功能就是upload, download.
AXIS2的webservice发布的时候是打包成xxx.aar发布的,xxx.aar展开后的目录结构为
--
--META-INF
services.xml
--包含server端实现的class( 目录跟package是一样的结构)
3.服务器端FileTransferServer.java
package sample;
import org.apache.axiom.attachments.utils.IOUtils;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMText;
import org.apache.axis2.AxisFault;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Iterator;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
public class FileTransferServer {
public static final String TMP_PATH = "D:/temp";
public OMElement upload(OMElement element) throws Exception {
OMElement _fileContent = null;//文件内容
OMElement _fileName = null;//文件名
OMElement _fileType = null;//文件类型
System.out.println("The element for upload: " + element);
for (Iterator _iterator = element.getChildElements(); _iterator.hasNext();) {
OMElement _ele = (OMElement) _iterator.next();
if (_ele.getLocalName().equalsIgnoreCase("fileContent")) {
_fileContent = _ele;
}
if (_ele.getLocalName().equalsIgnoreCase("fileName")) {
_fileName = _ele;
}
if (_ele.getLocalName().equalsIgnoreCase("fileType")) {
_fileType = _ele;
}
}
if (_fileContent == null || _fileType == null) {
throw new AxisFault("Either Image or FileName is null");
}
OMText binaryNode = (OMText) _fileContent.getFirstOMChild();
String fileName = _fileName.getText();
String fileType = _fileType.getText();
String storeDir = TMP_PATH + "/" + "tempTest";
File dir = new File(storeDir);
if (!dir.exists()) {
dir.mkdir();
}
String filePath = storeDir + "/" + fileName + "." + fileType;
File uploadFile = new File(filePath);
if (uploadFile.exists()) {
filePath = storeDir + "/" + fileName + "(1)" + "." + fileType;
uploadFile = new File(filePath);
}
// Extracting the data and saving
DataHandler actualDH;
actualDH = (DataHandler) binaryNode.getDataHandler();
FileOutputStream imageOutStream = new FileOutputStream(uploadFile);
InputStream is = actualDH.getInputStream();
imageOutStream.write(IOUtils.getStreamAsByteArray(is));
// setting response
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace ns = fac.createOMNamespace("http://example.org/filedata",
"fd");
OMElement ele = fac.createOMElement("response", ns);
ele.setText("true");
return ele;
}
public OMElement download(OMElement element) throws Exception {
System.out.println("The element for download: " + element);
OMElement _userName = null;
OMElement _fileName = null;
OMElement _fileType = null;
for (Iterator _iterator = element.getChildElements(); _iterator
.hasNext();) {
OMElement _ele = (OMElement) _iterator.next();
if (_ele.getLocalName().equalsIgnoreCase("userName")) {
_userName = _ele;
}
if (_ele.getLocalName().equalsIgnoreCase("fileName")) {
_fileName = _ele;
}
if (_ele.getLocalName().equalsIgnoreCase("fileType")) {
_fileType = _ele;
}
}
String userName = _userName.getText();
String fileName = _fileName.getText();
String fileType = _fileType.getText();
String filePath = TMP_PATH + "/" + userName + "/" + fileName + "."
+ fileType;
System.out.println("The filePath for download: " + filePath);
FileDataSource dataSource = new FileDataSource(filePath);
DataHandler expectedDH = new DataHandler(dataSource);
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace ns = fac.createOMNamespace("http://example.org/filedata",
"fd");
OMText textData = fac.createOMText(expectedDH, true);
OMElement ele = fac.createOMElement("response", ns);
ele.addChild(textData);
return ele;
}
}
4.services.xml
<?xml version="1.0" encoding="UTF-8"?>
<service name="FileOperation">
<description>
This is a sample Web Service with two operations,echo and ping.
</description>
<parameter name="ServiceClass" locked="false">sample.FileTransferServer</parameter>
<operation name="upload">
<actionMapping>urn:upload</actionMapping>
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
<operation name="download">
<actionMapping>urn:download</actionMapping>
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
</service>
将这两个文件打包并部署到Tomcat上(略)。
5.测试
FileTransferClient.java
package sample;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import org.apache.axiom.attachments.utils.IOUtils;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMText;
import org.apache.axiom.soap.SOAP11Constants;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
public class FileTransferClient {
private static EndpointReference targetEPR =
new EndpointReference("http://127.0.0.1:8080/axis2/services/FileOperation");
public static boolean upload(String fileName, File file, String fileType) {
try {
OMElement data = buildUploadEnvelope(fileName, file, fileType);
Options options = buildOptions();
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
System.out.println("The data in method upload: "+data);
OMElement ome = sender.sendReceive(data);
System.out.println("Convert the data to element in method upload: "+ome);
String b = ome.getText();
return Boolean.parseBoolean(b);
}
catch(Exception e) {
e.printStackTrace();
}
return false;
}
public static boolean download(String userName, String fileName, String fileType) {
try {
OMElement data = buildDownloadEnvelope(userName, fileName, fileType);
Options options = buildOptions();
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
System.out.println("The data in method download: "+data);
OMElement ome = sender.sendReceive(data);
System.out.println("Convert the data to element in method download: "+ome);
OMText binaryNode = (OMText) ome.getFirstOMChild();
binaryNode.setOptimize(true); //必须加此句,否则会出现ContentID is null的异常!
DataHandler actualDH = (DataHandler) binaryNode.getDataHandler();
FileOutputStream imageOutStream = new FileOutputStream("D:/userTemp/xx.gif");
InputStream is = actualDH.getInputStream();
imageOutStream.write(IOUtils.getStreamAsByteArray(is));
return true;
}
catch(Exception e) {
e.printStackTrace();
}
return false;
}
private static OMElement buildUploadEnvelope(String fileName, File file, String fileType) {
DataHandler expectedDH;
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("http://example.org/filedata", "fd");
OMElement data = fac.createOMElement("upload", omNs);
OMElement fileContent = fac.createOMElement("fileContent", omNs);
FileDataSource dataSource = new FileDataSource(file);
expectedDH = new DataHandler(dataSource);
OMText textData = fac.createOMText(expectedDH, true);
fileContent.addChild(textData);
OMElement _fileName = fac.createOMElement("fileName", omNs);
_fileName.setText(fileName);
OMElement _fileType = fac.createOMElement("fileType", omNs);
_fileType.setText(fileType);
data.addChild(_fileName);
data.addChild(_fileType);
data.addChild(fileContent);
return data;
}
private static OMElement buildDownloadEnvelope(String userName, String fileName, String fileType) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("http://example.org/filedata", "fd");
OMElement data = fac.createOMElement("download", omNs);
OMElement _userName = fac.createOMElement("userName", omNs);
_userName.setText(userName);
OMElement _fileName = fac.createOMElement("fileName", omNs);
_fileName.setText(fileName);
OMElement _fileType=fac.createOMElement("fileType", omNs);
_fileType.setText(fileType);
data.addChild(_userName);
data.addChild(_fileName);
data.addChild(_fileType);
return data;
}
private static Options buildOptions() throws AxisFault {
Options options = new Options();
options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
options.setTo(targetEPR);
// enabling MTOM in the client side
options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
return options;
}
public static void main(String agrs[]) {
String file = "D:/userTemp/ya.gif";
String fn = "testUser";
String ft="gif";
boolean rtv = upload(fn,new File(file),ft);
System.out.println("is upload success: "+rtv);
String un="zj";
String downfn="1";
if(download(un,downfn,ft)){
System.out.println("download success.");
}
else System.out.println("download fail.");
System.out.println("Client main end.");
}
}
6.结果
察看soap消息,我们可以发现
<fd:upload xmlns:fd="http://example.org/filedata">
<fd:fileName>testUser</fd:fileName>
<fd:fileType>gif</fd:fileType>
<fd:fileContent>RHQMLJJ4/AMZkEBAEAOw(省略部分2进制代码)</fd:fileContent>
</fd:upload>
Convert the data to element in method upload:
<fd:response xmlns:fd=http://example.org/filedata xmlns:tns="http://ws.apache.org/axis2">true</fd:response>
The data in method download:
<fd:download xmlns:fd="http://example.org/filedata">
<fd:userName>zj</fd:userName>
<fd:fileName>1</fd:fileName>
<fd:fileType>gif</fd:fileType>
</fd:download>
Convert the data to element in method download:
<fd:response xmlns:fd="http://example.org/filedata" xmlns:tns="http://ws.apache.org/axis2">
eIqGRwjkQAAAOw==(省略部分2进制代码)
</fd:response>
7.代码分析
利用Axis2的Mtom发送附件应用了builder模式。要向一个webserive 发送请求,首先就要构建一个请求的Envelope,Axis2构建Envelope的时候是利用的Axis2的AXIOM api(就是axis2的java object和xml的映射处理机制),其编程模式和DOM差不多的.看这一段:
private static OMElement buildUploadEnvelope(String mailboxnum, short greetingType, File file, String FileType) {
DataHandler expectedDH;
OMFactory fac = OMAbstractFactory.getOMFactory();
...
return data;
}
这一段其实是构建的data对像是这样一段xml的java object代表:
<fd:upload xmlns:fd="http://example.org/filedata">
<fd:fileName>testUser</fd:fileName>
<fd:fileType>gif</fd:fileType>
<fd:fileContent>RHQMLJJ4/AMZkEBAEAOw(省略部分2进制代码)</fd:fileContent>
</fd:upload>
其中的Dwvc2VydmljZT4NCjwvZGVwbG95bWVudD4NCg0K是要传送的文件的内容代表,至于什么编码,我没有深究。注意这一句:
OMElement data = fac.createOMElement("upload", omNs);
这里的“upload”参数对应的是webservice的一个操作的名称,这个操作的名称是跟webservice的server端实现类的方法名和services.xml的所定义的
<operationname="upload">
<actionMapping>urn:upload</actionMapping>
<messageReceiverclass="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
要一致的。
再看看这一段,
private static Options buildOptions() {
Options options = new Options();
...
return options;
}
这里构建的Options对象,顾名思义就是调用webservice的相应的选项:比如这里就指定了Soap协议为1.1 版,指定了所请求的service 的EPR(就是地址),声明在client应用MTOM指定传输协议为HTTP。
构建好要传送的data和options后,所执行的代码为:
ServiceClient sender = new ServiceClient();
//设定选项
sender.setOptions(options);
//打印要传送的数据,为一段xml
System.out.println(data);
//传送数据,得到返回值
OMElement ome = sender.sendReceive(data);
//打印返回值,为一段xml
System.out.println(ome);
//析取返回值中的数据
String b = ome.getText();
//返回
return Boolean.parseBoolean(b);
可以发现,server端和client的中间传递数据都是通过 org.apache.axiom.om.OMElement对象的,这个对象是一段xml的java 对象映射。
- Fear_of_Attachments.pdf (18.5 KB)
- 下载次数: 42
- 使用Axis2传输附件.zip (4.1 KB)
- 下载次数: 102
发表评论
-
asdfasdfasdfasdf
2019-04-23 10:13 0asdfasdfdfdfdfdfdfdfdfdfdfdfdfd ... -
duizhentu1009
2016-10-09 17:23 468duizhentu1009 -
duizhentu
2016-10-04 14:48 32110yue -
html poc
2016-05-31 14:48 0<!DOCTYPE HTML><html l ... -
webex
2015-03-12 20:47 0https://citigroup.webex.com/cit ... -
excel by js data
2014-12-24 00:13 0excel by js data -
cv cv cv cv 2014
2014-12-21 19:56 0cv cv cv c v -
cvcvcvcvcvcvcv
2014-12-21 18:34 0cvcvcvcvcvcvcv -
美签 XP倪敏why
2014-12-08 20:22 05魔王勇者噢噢噢哦哦噢噢噢哦哦 -
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvssssssssssssssss
2014-12-07 11:25 0AA004LS6ZS -
底板生生世世是生生世世是
2014-11-21 17:10 0Song, Shijie Michael [ICG-IT ... -
CSC
2013-08-22 22:39 0Hi Philip, Sorry for my last ... -
test
2012-07-20 13:53 707testsssssssssssssss -
为什么要用webservice解理文章(转载)
2012-06-21 23:31 656http://www.blogjava.net/java-my ... -
WSDL2Java Reference
2011-11-24 17:06 866wsdl2java -uri PipeService9.x ... -
axis2集成到自己的项目中demo
2011-11-23 15:36 1405axis2集成到自己的项目中demo ... -
axis2 1.6.1 codegen java.lang.reflect.InvocationTargetException
2011-09-29 09:38 983http://loshamo.javaeye.com/blog ... -
Axis2教程 命令行发布,java2wsdl,wsdl2java
2011-10-19 10:39 1085Axis2 WebService 实现webservi ... -
Axis2 插件安装 如何在低版本eclipse使用axis2 1.6.1插件
2011-10-19 15:31 1218在eclipse-jee-galileo-SR1-win32上 ...
相关推荐
- **MTOM/SwA**: 支持大型二进制附件的高效传输。 - **JMS/ESB**: 可以与Java消息服务(JMS)或企业服务总线(ESB)集成,实现异步Web服务通信。 - **JAXB**: 使用Java Architecture for XML Binding(JAXB)进行XML...
本篇文章将聚焦于Axis2框架在服务器端进行Web服务开发的总结。 Axis2是Apache软件基金会的一个开源项目,它是用于构建高性能、灵活且可扩展的Web服务的下一代Web服务引擎。相比早期的Axis,Axis2提供了更强大的...
此外,Axis2支持MTOM(Message Transmission Optimization Mechanism)和SwA(Soap with Attachments),提高处理大型附件的效率。 8. **互操作性**:由于对Web服务标准的全面支持,Axis2与其他Web服务框架(如.NET...
- **MTOM**: 用于优化大附件传输,减少网络流量。 - **SwA (SOAP with Attachments)**: 同样处理消息中的附件,但不提供MTOM的性能优势。 - ** Rampart**: 提供SOAP消息的安全性,支持WS-Security规范。 - **AXIOM**...
1. **SOAP处理**:Axis2能够处理各种SOAP消息,支持SOAP 1.1和1.2规范,包括处理附件(MTOM和SwA)和WS-Addressing等扩展。 2. **模块化架构**:Axis2采用模块化设计,允许开发者按需选择和组合功能,比如安全、...
《Axis2 1.3 API帮助文档》是一个详细的指南,主要针对使用Axis2 1.3版本进行Web服务开发的开发者。Axis2是Apache软件基金会开发的一个强大的Web服务引擎,它提供了一种灵活且高性能的方式来实现和部署SOAP(简单...
6. **模块**: 可选功能模块,如MTOM(Message Transmission Optimization Mechanism)和SwA(SwaAttachment)支持,用于优化XML消息传输和处理附件。 使用Axis2,开发者可以轻松地创建服务端点,通过编写Java类来...
1. **MTOM(Message Transmission Optimization Mechanism)**:优化大附件传输,通过二进制传输提高性能。 2. **SwA(SOAP with Attachments)**:允许SOAP消息中携带附件。 3. **AXIOM(Abstraction eXtensible ...
2. axis2-adapters-1.6.2.jar:用于支持不同类型的适配器,如MTOM(消息传输优化机制)和SwA(附带附件)。 3. axis2-kernel-1.6.2.jar:Axis2的基本组件,负责服务的生命周期管理。 4. axis2-transport-...
- **MTOM/XOP**:优化大附件传输,提高性能。 - **异步处理**:支持异步调用和回调模式。 - **多协议支持**:除了HTTP,还支持SMTP、JMS等多种传输协议。 - **WS-*兼容性**:遵循WS-I(Web Services ...
标题“Axis 上传附件跟接收附件”涉及到的是在使用 Axis 框架进行 Web 服务交互时处理文件传输的问题。Axis 是一个流行的开源 Java SOAP 客户端和服务端实现,它允许开发人员创建和部署 Web 服务。在这个场景中,...
5. **丰富的库支持**:与Apache Rampart(安全性)、Apache Axis2/MTOM(高效传输大附件)等库紧密集成,提供了全面的Web服务功能。 6. **RESTful支持**:Axis2不仅限于SOAP,也支持RESTful风格的Web服务,符合现代...
2. **模块**:Axis2允许通过模块化方式添加特定功能,如数据绑定(如AXIS2_ADB、AXIS2.xmlbeans)、MTOM(消息传输优化机制)和SWA(SwA协议,用于在SOAP消息中传输附件)。 3. **服务部署文件**:Axis2支持服务部署...
标题中的"axis2_client_data_transfer_mode.rar_axis2"暗示了我们关注的是Axis2框架下的客户端数据传输模式。Axis2是Apache软件基金会开发的一个开放源代码Web服务引擎,它主要用于构建和部署Web服务。这个压缩包...
9. **axis2-saaj**: SAJ(SOAP with Attachments API for Java)是Java标准API,用于处理带有附件的SOAP消息。axis2-saaj库提供了对SAJ的实现,支持MIME类型的SOAP消息交换。 10. **axis2-kernel**: Axis2核心库,...