- 浏览: 1591269 次
- 性别:
- 来自: 吉林
文章分类
- 全部博客 (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 2339转自:http://yjhexy.iteye.com/ ... -
Velocity简介和Velocity与Jsp、Freemarker的对比(java常用的三种表现层技术)
2014-02-19 17:09 1447Velocity 是一个基于java ... -
学习Struts2 jQuery Plugin 3.0(转)(此外还有struts-jquery-grid-tags, showcase等)
2014-01-14 20:04 1373from:http://blog.csdn.net/ld_f ... -
KindEditor上传图片问题
2013-03-19 15:24 3412转自:http://www.cnblogs.com/jav ... -
使用SVN检出Struts Spring Hibernate源码
2013-02-05 16:50 1364Spring Spring源码是由springframewo ... -
Servlet与Struts action线程安全问题分析
2012-08-23 10:22 1184Servlet/JSP技术和ASP、PHP等相比,由于其多线程 ... -
Struts2上传文件过大的反馈处理
2012-08-23 09:42 2385问题描述:前段时间在struts2下做文件上传,当上传大文件时 ... -
Struts2的addActionError() 与addFieldError ()
2012-08-23 09:41 1098addActionError() 与addFieldError ... -
struts2中<s:property value="xx"/>的工作原理
2012-08-20 10:18 1717使用struts2标签的jsp页面中<s:propert ... -
struts2的线程安全(好好看看)(在理解不扎实与测试下自己砸了理解的真理)
2012-08-08 15:57 2949转自:http://japi.iteye.com/blog/4 ... -
struts2下利用json进行文件上传和下载遇到的一些问题(暂时未明白)
2012-07-16 16:52 1322上传文件时:利用jquery的ajaxfileupload异步 ... -
struts2文件上传(单个文件和多个文件)
2012-07-16 16:38 19701. 文件上传的原理: 表单元素的encty ... -
探究Struts2运行机制:StrutsPrepareAndExecuteFilter 源码剖析 (转)
2012-07-13 15:22 1210作者:niumd blog:http://ari.i ... -
Struts2的StrutsPrepareAndExecutefilter与FilterDispatcher
2012-07-13 15:18 988FilterDispatcher是早期struts2的过滤器, ... -
OGNL遍历list和map以及访问四个范围的属性值
2012-07-11 17:23 2350转自:http://blog.csdn.net/a9529 ... -
struts2的result为chain的跳转问题(参数设置)
2012-07-09 14:59 2637本文章非原创,本文章抄录于http://blog.sina.c ... -
struts2拦截器(转)
2012-07-01 13:52 1213转自:http://www.blogjava.ne ... -
struts2工作原理(转)
2012-07-01 13:45 1275读者如果曾经学习 过S ... -
Struts2返回JSON数据的具体应用范例(转)
2012-06-29 09:20 1408早在我刚学Struts2之初 ... -
从源代码角度看Struts2返回JSON数据的原理(转)
2012-06-28 23:30 2082前面一篇文章其实只是介绍了如何在Struts2中返回JSON数 ...
相关推荐
在Struts配置文件中,我们需要将这个Action与URL映射,以便用户可以通过特定的URL触发文件下载: ```xml <param name="contentType">application/octet-stream <param name="inputName">file ...
4. **文件下载**: Struts2提供了一种简单的方式处理文件下载。在Action类中,你可以创建一个方法返回文件流。使用`response.setHeader()`设置HTTP响应头,如`Content-Disposition`来指定文件名,以及`Content-Type`...
Struts2是一个强大的Java web应用程序框架,它提供了一种组织和构建MVC(模型-视图-控制器)架构的方式。在Struts2中处理文件下载是常见的需求,比如用户请求下载服务器上的文件,如PDF、图片或其他类型的文档。本...
本文将深入探讨“Struts2文件下载的参数”这一主题,包括如何设置和使用这些参数来实现安全、高效的文件下载服务。 首先,我们需要了解Struts2中的Action类。Action类是处理用户请求的核心,它通过配置在struts.xml...
在这个特定的项目中,我们关注的是"struts2文件上传下载"的功能,这涉及到用户通过Web界面上传文件到服务器,以及从服务器下载文件到用户的设备。 文件上传是Web应用中的常见需求,例如用户可能需要提交图片、文档...
Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括文件上传和下载。在Struts2中处理文件上传和下载是常见的需求,对于构建交互式的Web应用来说至关重要。以下将详细介绍Struts2中如何实现这两个...
在Struts2中,文件上传和下载是常见的功能需求,主要用于处理用户在Web表单中提交的文件,如图片、文档等。下面将详细介绍Struts2中文件上传和下载的实现方法。 ### 1. 文件上传 #### 1.1 配置Struts2 首先,我们...
2. **设置响应头**:在Action中,通过Servlet的`response`对象设置响应头,包括`Content-Type`(文件类型)、`Content-Disposition`(定义文件名和下载方式)等。 3. **输出文件**:使用`response.getOutputStream...
在"28_Struts2ImgCode"这个文件名中,虽然没有实际的文件内容,但我们可以推测它可能包含了与Struts2和图像验证码相关的代码示例。在HTTPS环境中,如果涉及到图片验证码,需要注意的是,验证码图片也需要通过HTTPS...
在标题提到的场景中,开发者可能遇到了在使用Myeclipse 6.5集成开发环境,JDK1.6和Tomcat 6.0服务器环境下,通过Struts2进行文件下载时,中文文件名显示为乱码的问题。 中文乱码是由于字符编码不一致导致的,尤其是...
在Struts2中,文件的上传和下载是常见的功能需求,这对于处理用户交互和数据交换至关重要。本篇文章将深入探讨Struts2中如何实现文件的上传和下载。 首先,我们来了解文件上传的基本流程。在Struts2中,文件上传...
在Struts2中,文件上传和下载是常见的功能,尤其在处理用户交互和数据交换时非常有用。下面将详细介绍如何在Struts2中实现文件的上传和下载。 一、文件上传 1. **配置Struts2核心过滤器**:首先,确保在web.xml中...
在实际项目中,文件上传和下载功能是必不可少的,本实例将详细讲解如何在Struts2框架下实现单个文件及多个文件的上传与下载。 首先,我们需要在Struts2的配置文件(struts.xml)中添加相关的Action配置,以便处理文件...
在Struts2中,虽然request、response和session被隐藏起来,但是提供了多种便捷的方式来获取这些对象,使得开发者可以在自定义的方法中灵活地使用它们。通过使用Struts2提供的接口、注解或ActionContext,开发者能够...
Struts2通过拦截器(Interceptor)和配置文件实现了灵活的功能扩展,其中配置文件用于定义控制器、拦截器、结果类型等组件,是框架运行的核心。 ### 问题背景:中文乱码成因分析 在Struts2框架中,中文乱码问题...
1. **配置Action**:在Struts2的配置文件(struts.xml)中,定义一个专门处理文件下载请求的Action。这个Action通常会有一个返回值类型为“stream”的结果,指示Struts2以流的形式处理响应。 2. **Action逻辑**:在...
Struts2是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中,提供了丰富的功能,包括文件的上传和下载。在本项目中,我们关注的是如何使用Struts2来实现实时的文件交互操作,即文件的上传与...
在处理文件上传和下载时,Struts2可能会遇到一个常见的问题,即中文文件名的乱码问题。这是因为不同的系统和软件对字符编码的支持不同,尤其是涉及到网络传输时,编码的兼容性尤为重要。 在“struts2 中文文件名...
4. **Action配置**:在Struts2的配置文件中,需要为下载操作配置相应的Action和结果。 **三、整合Struts与Hibernate** 1. **持久化文件信息**:为了实现动态下载,可能需要将文件信息(如文件名、上传时间、描述等...
2. **配置文件**:通常为struts.xml,用于定义Action、Result和拦截器等配置,指导Struts2如何处理请求。 3. **拦截器**:在Action调用前后执行的代码段,可以实现日志记录、权限检查、事务管理等功能。 4. **OGNL...