- 浏览: 1560396 次
- 性别:
- 来自: 吉林
文章分类
- 全部博客 (624)
- C/C++ (33)
- Java (181)
- 网络相关 (7)
- 我爱篮球 (3)
- 也爱足球 (4)
- 杂谈 (1)
- 系统架构 (3)
- Web Service (14)
- Framework (3)
- 系统命令 (8)
- 管理平台相关 (8)
- 其它 (35)
- Websphere (1)
- Struts2 (24)
- Hibernate (16)
- Spring (23)
- javascript (20)
- jquery (23)
- html/css/div (28)
- 数据库 (40)
- JavaWeb (27)
- 设计模式 (2)
- 文档编写 (3)
- SVN (5)
- Ant (1)
- Maven (13)
- 软件项目管理 (8)
- AOP (1)
- kindeditor (1)
- JSON (2)
- Servlt/JSP (4)
- WordXML (2)
- XML (12)
- 面试相关 (7)
- Tomcat (11)
- 性能与调优 (29)
- 职业发展 (2)
- 操作系统 (7)
- AJAX (2)
- DWR (1)
- Eclipse (12)
- 持续集成 (3)
- 批处理命令 (1)
- Mozilla Rhino (2)
- 新鲜技术 (18)
- Apache mina (2)
- 底层技术 (18)
- Linux (22)
- 新鲜技术,IT历史 (1)
- 敏捷开发 (1)
- 版本控制 (5)
- 较火技术 (7)
- 集群 (2)
- Web前端 (13)
- 报表工具 (3)
- 网站架构 (5)
- 大数据 (8)
- 分布式存储 (5)
- 云计算 (8)
- TCP/IP协议 (1)
- 负载均衡 (3)
- 硬件 (1)
- 表现层技术 (3)
- Velocity (3)
- jvm (6)
- 并发编程 (10)
- hadoop (8)
- 数据结构和算法 (12)
- 计算机原理 (1)
- 测试驱动开发-TDD (3)
- 开发技巧 (1)
- 分词器 (1)
- 项目构建工具 (2)
- JMX (4)
- RMI (1)
- 测试技术 (22)
- 网络完全 (1)
- Git (4)
- apache开源包 (4)
- Java常用 (1)
- mock (2)
- OSGi (2)
- MongoDB (1)
- JBPM (1)
- Storm (3)
- mysql (2)
- telnet (1)
- 正则表达式 (1)
- bootstrap (4)
- Apache ActiveMQ (1)
- redis (9)
- Nginx (2)
- rsync+inotify文件同步 (2)
- testng (1)
- 原型设计工具 (1)
- 工程能力 (1)
- 风险控制 (3)
- ibatis (1)
- 分布式 (4)
- 安全技术 (1)
- 计算机基础 (4)
- 消息中间件 (1)
- UML (2)
最新评论
-
u012236967:
java命令执行jar包(里面的main函数)的方式(包括依赖其它的jar包问题) -
世界尽头没有你:
Selenium自动化测试从入门到精通(Java版)百度网盘地 ...
自动化测试工具 Selenium WebDriver 入门教程(针对主流浏览器) -
小小西芹菜:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
dwr实现Reverse Ajax推送技术的三种方式 -
hellozhouqiao:
楼主,请教一点问题.现在我们需要在excel 的页脚里面加上图 ...
FreeMaker + xml 导出word(处理目录,图片和页眉页脚问题) -
乱在长安:
使用Timer会有各种各样的问题好嘛?!书上推荐使用Sched ...
DelayQueue (ScheduledThreadPoolExecutor调度的实现)
若是使用类似Servlet方式下载,可以通过ServletActionContext帮助类或者ServletResponseAware接口获得response,然后再按照设置response的头和流的方式即可完成下载,但是Action的方法必须返回null,意思是脱离struts2的管理,必须这样做,否则将会报getOutputStream已经被调用的异常.
错误如下:
报错:
java.lang.IllegalStateException: getOutputStream() has already been called for
this response的错误.
Struts方法之间调用引起的。
因为:每个方法都返回的是一个ActionForward对象,而response是ActionForward对象参数,所以就会使response冲突!
故,将最后的return "SUCCESS"改为 return null .不将其交由sturts管理.
技术要点
本节代码详细说明文件下载功能的开发流程,介绍知识点如下:
DownloadAction文件下载功能开发。
struts.xml中DownloadAction配置,以及支持文件名为中文字符的文件下载。
下载文件流程展示。
演示代码
上传成功页面,这里笔者让其在每个上传文件后提供“下载”链接。
- <!------------------------文件名:result.jsp------------------->
- <%@taglib prefix="s" uri="/struts-tags"%>
- <body>
- 上传文件:
- <table>
- <!-- 循环显示上传成功文件名 -->
- <s:iterator value="fileFileName" status="fn">
- <tr>
- <td>
- <!-- 上传成功文件名 -->
- <s:property />
- </td>
- <td>
- <!-- 下载文件链接内容为定义的下载Action -->
- <!-- 下载文件名作为链接参数fileName值,用OGNL表达式表达 -->
- <a href="<s:url value='download.action'>
- <s:param name='fileName'
- value='fileFileName[#fn.getIndex()]'/>
- </s:url>">下载</a>
- </td>
- </tr>
- </s:iterator>
- </table>
- </body>
<!------------------------文件名:result.jsp-------------------> <%@taglib prefix="s" uri="/struts-tags"%> <body> 上传文件: <table> <!-- 循环显示上传成功文件名 --> <s:iterator value="fileFileName" status="fn"> <tr> <td> <!-- 上传成功文件名 --> <s:property /> </td> <td> <!-- 下载文件链接内容为定义的下载Action --> <!-- 下载文件名作为链接参数fileName值,用OGNL表达式表达 --> <a href="<s:url value='download.action'> <s:param name='fileName' value='fileFileName[#fn.getIndex()]'/> </s:url>">下载</a> </td> </tr> </s:iterator> </table> </body>
DownLoadAction类代码
- <!------------文件名:DownLoadAction.java ------------------>
- import java.io.InputStream;
- import java.io.UnsupportedEncodingException;
- import org.apache.struts2.ServletActionContext;
- import com.opensymphony.xwork2.ActionSupport;
- public class DownLoadAction extends ActionSupport {
- //下载文件原始存放路径
- private final static String DOWNLOADFILEPATH="/upload/";
- //文件名参数变量
- private String fileName;
- public String getFileName() {
- return fileName;
- }
- public void setFileName(String fileName) {
- this.fileName = fileName;
- }
- //从下载文件原始存放路径读取得到文件输出流
- public InputStream getDownloadFile() {
- return
- ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName);
- }
- //如果下载文件名为中文,进行字符编码转换
- public String getDownloadChineseFileName() {
- String downloadChineseFileName = fileName;
- try {
- downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1");
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- return downloadChineseFileName;
- }
- public String execute() {
- return SUCCESS;
- }
- }
<!------------文件名:DownLoadAction.java ------------------> import java.io.InputStream; import java.io.UnsupportedEncodingException; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownLoadAction extends ActionSupport { //下载文件原始存放路径 private final static String DOWNLOADFILEPATH="/upload/"; //文件名参数变量 private String fileName; public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } //从下载文件原始存放路径读取得到文件输出流 public InputStream getDownloadFile() { return ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName); } //如果下载文件名为中文,进行字符编码转换 public String getDownloadChineseFileName() { String downloadChineseFileName = fileName; try { downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return downloadChineseFileName; } public String execute() { return SUCCESS; } }
struts.xml配置文件中有关文件下载的配置:
- <!------------------文件名:struts.xml----------------->
- <struts>
- <!-- 下载文件的Action定义 -->
- <action name="download" class="action.DownLoadAction">
- <!-- 设置文件名参数,由页面上传入 -->
- <param name="fileName"></param>
- <result name="success" type="stream">
- <!-- 下载文件类型定义 -->
- <param name="contentType">text/plain</param>
- <!-- 下载文件处理方法 -->
- <param name="contentDisposition">
- attachment;filename="${downloadChineseFileName}"
- </param>
- <!-- 下载文件输出流定义 -->
- <param name="inputName">downloadFile</param>
- </result>
- </action>
- </struts>
<!------------------文件名:struts.xml-----------------> <struts> <!-- 下载文件的Action定义 --> <action name="download" class="action.DownLoadAction"> <!-- 设置文件名参数,由页面上传入 --> <param name="fileName"></param> <result name="success" type="stream"> <!-- 下载文件类型定义 --> <param name="contentType">text/plain</param> <!-- 下载文件处理方法 --> <param name="contentDisposition"> attachment;filename="${downloadChineseFileName}" </param> <!-- 下载文件输出流定义 --> <param name="inputName">downloadFile</param> </result> </action> </struts>
(1):文件开始下载页面如图4.12所示。
图4.12 文件下载
(2):单击“下载”链接,比如点“下载文件1.txt”文件右边“下载”链接,出现对话框如图4.13所示。
图4.13 下载文件处理方式
(3):单击“保存”按钮后选择下载文件存放路径,如图4.14所示。
图4.14 下载文件选择存放路径
代码解释
(1)在result.jsp中通过iterator标签和url标签定义了“fileFileName”的循环显示以及链接。其中有关“status”和OGNL表达式笔者会在之后章节里具体介绍,这里只是让读者知道是如何使用标签显示图4.12显示的内容。特别指出<param>标签为downloadAction定义了一个参数,该参数名为“fileName”,因为在4.4.1小节中笔者定义的“fileFileName”是个List类型的数据集合,因此利用OGNL表达式将文件名作为“fileName”参数值传入downloadAction中。
(2)DownLoadAction文件中先定义了常量DOWNLOADFILEPATH,它是下载文件在服务器存放的路径名,也就是4.4.1小节中上传文件在服务器存放的路径名。
定义好DOWNLOADFILEPATH后,在定义DownLoadAction的属性变量。因为在result.jsp中定义了参数“fileName”,则它作为DownLoadAction的属性变量,需要定义相应的getter、setter方法。
然后定义了getDownloadFile方法,它返回的是一个文件流,表明将被下载文件转换为输出流,方便下载。利用Struts2自带的“ServletActionContext”类的API把下载文件存放路径作为方法参数,读取下载文件,将其转换为文件流。
还有一个getDownloadChineseFileName方法,该方法主要作用是将文件名为中文字符的文件进行文件名的字符编码集合转换。因为在Web系统中由JSP等视图页面传入的变量值,特别是中文字符的变量。缺省的字符编码集合都是“ISO8859-1”,因此利用Java的字符串类的API,将字符编码转成开发需要的字符编码集。防止中文字符乱码问题发生。
(3)struts.xml中定义了名为“download”的Action。其中它自己的参数“fileName”因为在这里它的值会从JSP页面上传入,所以这里只是定义,没有具体给它赋任何值
在<result>标签中定义了type属性,值为“stream”。如果是下载文件功能开发,DownLoadAction一定要设置type属性,而且值为“stream”。这是因为在Struts2自带的xml配置文件为struts-default.xml中有关于“stream”的result返回类型的定义,代码如下:
这里Struts2定义了result返回类型为“stream”,这个result类型主要是处理文件的输入和输出流时候需要使用的。因为下载文件就是把文件转换成输入输出流,将其从一个文件路径放到另外一个文件路径中去。所以肯定要设置这个result类型的。
“contentType”、“contentDisposition”、“inputName”都是这个result的属性。“contentType”就是文件类型。这里因为下载的文件是文本文件,因此设定的值为文本文件类型,具体各个文件类型如何定义,4.4.1小节已经介绍过,这里不再做说明。“contentDisposition”是指定下载文件处理方式,如图4.13就是处理方式的效果。特别指出如果“contentDisposition”定义的值把前面的“attachment”去掉,则下载方式不是以附件方式下载,如果单击“下载”链接,则会把下载文件的内容显示在浏览器中。读者可以去试验一下。这里有个“${downloadChineseFileName}”,这就是在DownLoadAction中定义getDownloadChineseFileName方法的目的,${downloadChineseFileName}是OGNL的表达式,它显示了“downloadChineseFileName”变量的具体值,因为在DownLoadAction中定义getDownloadChineseFileName方法,则把已经转换成符合需要字符编码集的下载文件名作为下载文件方式对话框中显示的名称,不会造成任何乱码问题。“inputName”是最关键的一个属性,也是一定要定义的属性,“inputName”参数中定义的值“downloadFile”就是DownLoadAction中getDownloadFile方法返回的文件流名字。在Struts2中Acion用前缀名为get的方法得到各种属性的值,这些属性有些是在Action中定义,有些就像本示例在配置文件中利用OGNL表达式或直接定义。
(4)开始进行文件下载功能展示,按照如上记述的步骤执行即可。笔者将两个文本文件上传上去,然后在上传成功页面对具体的文件进行下载。在图4.13中单击“保存”按钮就显示图4.14,选择在本机上存放下载文件的路径即可完成下载文件功能。
发表评论
-
Struts2与Velocity整合
2014-02-19 17:13 2292转自:http://yjhexy.iteye.com/ ... -
Velocity简介和Velocity与Jsp、Freemarker的对比(java常用的三种表现层技术)
2014-02-19 17:09 1408Velocity 是一个基于java ... -
学习Struts2 jQuery Plugin 3.0(转)(此外还有struts-jquery-grid-tags, showcase等)
2014-01-14 20:04 1327from:http://blog.csdn.net/ld_f ... -
KindEditor上传图片问题
2013-03-19 15:24 3351转自:http://www.cnblogs.com/jav ... -
使用SVN检出Struts Spring Hibernate源码
2013-02-05 16:50 1321Spring Spring源码是由springframewo ... -
Servlet与Struts action线程安全问题分析
2012-08-23 10:22 1146Servlet/JSP技术和ASP、PHP等相比,由于其多线程 ... -
Struts2上传文件过大的反馈处理
2012-08-23 09:42 2357问题描述:前段时间在struts2下做文件上传,当上传大文件时 ... -
Struts2的addActionError() 与addFieldError ()
2012-08-23 09:41 1065addActionError() 与addFieldError ... -
struts2中<s:property value="xx"/>的工作原理
2012-08-20 10:18 1679使用struts2标签的jsp页面中<s:propert ... -
struts2的线程安全(好好看看)(在理解不扎实与测试下自己砸了理解的真理)
2012-08-08 15:57 2909转自:http://japi.iteye.com/blog/4 ... -
struts2下利用json进行文件上传和下载遇到的一些问题(暂时未明白)
2012-07-16 16:52 1280上传文件时:利用jquery的ajaxfileupload异步 ... -
struts2文件上传(单个文件和多个文件)
2012-07-16 16:38 19291. 文件上传的原理: 表单元素的encty ... -
探究Struts2运行机制:StrutsPrepareAndExecuteFilter 源码剖析 (转)
2012-07-13 15:22 1180作者:niumd blog:http://ari.i ... -
Struts2的StrutsPrepareAndExecutefilter与FilterDispatcher
2012-07-13 15:18 947FilterDispatcher是早期struts2的过滤器, ... -
OGNL遍历list和map以及访问四个范围的属性值
2012-07-11 17:23 2291转自:http://blog.csdn.net/a9529 ... -
struts2的result为chain的跳转问题(参数设置)
2012-07-09 14:59 2593本文章非原创,本文章抄录于http://blog.sina.c ... -
struts2拦截器(转)
2012-07-01 13:52 1175转自:http://www.blogjava.ne ... -
struts2工作原理(转)
2012-07-01 13:45 1235读者如果曾经学习 过S ... -
Struts2返回JSON数据的具体应用范例(转)
2012-06-29 09:20 1369早在我刚学Struts2之初 ... -
从源代码角度看Struts2返回JSON数据的原理(转)
2012-06-28 23:30 2029前面一篇文章其实只是介绍了如何在Struts2中返回JSON数 ...
相关推荐
struts1中使用request、response都是方法自带的,而struts2中的request、response、session都被隐藏的了,该带代码文档会清晰的让你明白struts2中request、response在自定义方法中如何随意使用
1.struts2 带进度条文件上传 源码 2.源码中有lib 下载后部署马上就能用 3.代码中有详细的注释信息 4.对关键点有详细的解释说明 5.如果谁用起来觉得有问题可在评论留言,留联系方式,我会联系你的 6.非常感谢原创作者...
struts2获取response的方法
Struts2在Action中获得Response对象的四种方法
Struts2中获得Request,Response的几种方法,有代码作为参考。
Struts2与Ajax 的实现原理,于Servlet+Ajax原理是一致的,都是通过后台的response.getWriter().print("");把数据传输给前台的。 前台Ajax格式如下(需要导入ajax库,比如:jquery-1.11.3.js) 格式: $(function()...
有关struts2下载组件的具体介绍我就在此略过了,看此文的同志想必大多是碰到这样让人很是不爽的问题。 下面就将该问题的最终解决办法介绍如下。 问题概要: 在struts2中使用result里type="stream"的结果类型时,...
Struts2的Action中获得request response session几种方法
struts2执行顺序,清楚描述从处理请求到返回response的整个流程
一个Demo告诉你struts2如何创建 request response session application
web中使用POI导入导出EXCEL文件的例子 struts1.x的例子,struts2.x可以参考自己修改 1.action的写法 import java.io.*; import java.sql.*; import java.util.ArrayList; import javax.servlet....
NULL 博文链接:https://zhouhaitao.iteye.com/blog/1126042
RequestMap,SessionMap,ApplicationMap, AttributeMap. struts提供两种方式访问session,request ,response,ActionContext 使用。 获得作用域及参数响应对象及三种符号说明
摘要视图订阅分类:java_web学习第四天(request和response的学习)Java输入输出流java压缩多个文件并且返回流示例Java中IO流文件读
Struts2教程:获得HttpServletResponse对象
系统的基本业务流程是: 在表示层中,首先通过JSP页面实现交互界面,负责传送请求(Request)和接收响应(Response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action...
在struts里的实现dtree通用树型结构 可以看看 不错的!
在通常的web开发中Request和Response对象比较常见,但在Struts2框架中由于Action能与JSP页面进行数据交互,所以通常都不会用到这两个对象。如果想在Struts2程序中用到这两个对象,也有解决方法 Struts2的Action并未...
本文重点给大家介绍AjaxFileUpload+Struts2实现多文件上传功能,具体实现代码大家参考下本文。 单文件和多文件的实现区别主要修改两点, 一是插件ajaxfileupload.js里接收file文件ID的方式 二是后台action是数组形式...