struts2的下载功能实现流程包括三个方面,jsp页面,xml配置文件,Action类。
首先我前台页面效果如下:
发送请求通过form表单的形式,文件名称及文件类型存储在hidden类型的input标签里,“下载文档”超链接也包含在form表单之中,点击超链接在downFile方法中提交表单请求。
代码:
<form id="${guide.bhc101}" action="ggcx/download.html?currentPage=${currentPage}" method="post"> <input type="hidden" name='fileName' value='${guide.bhc102}'/> <input type="hidden" name='type' value="application/msword"/> <a style="cursor: pointer;color: red;" onclick="javascript:queryGuide('${guide.bhc101}')">查看</a> <a style="cursor: pointer;color: red;" onclick="downloadFile('${guide.bhc101}')">下载文档</a> </form>
因为项目中文章对应的下载文档命名格式是标题.doc或者标题.docx的word文档,所以fileName的value值保存的是文章的标题,type的value值则是"application/msword",这是doc格式在程序的表示字符串。
列举一下主流格式文件在程序中对应的字符串:
到了这里,有一点需要说明一下,其实单纯使用a标签发送请求也是可以实现的,但是如果a标签的href属性中带有中文那么后台接收会产生中文乱码,所以在这里我使用form表单的形式来发送请求,保证后台 能接收到正确的中文。如果有更好的方法也请和我说一下,谢谢!
接下来,就要处理struts2的配置文件:
<action name="download" class="admin.action.DownLoadAction" method="checkFile"> <!--设置找不到文件情况的请求转发--> <result name="fileNotFound" type="chain"> <param name="actionName">jgcspublic</param> <param name="namespace">/ggcx</param> </result> <!--设置响应类型为stream--> <result name="success" type="stream"> <param name="contentType">${type}</param> <!--设置下载文件的名字 ,attachment表示弹出对话框提示下载--> <param name="contentDisposition">attachment;filename=${fileName}</param> <!--设置Action中输出流的函数--> <param name="inputName">guideFile</param> </result> </action>
"fileNotFound"的result 表示找不到文件的处理方法,通过chain模式转发ggcx包下的jgcspublic请求。
"success"的result则表示执行下载文件的方法。
contentType:文件的类型
contentDirposition:文件名称
inputName:返回输出流的方法名,则在Action中方法名命名应是getGuideFile()
发送请求后的第一步会调用checkFile方法,来检查标题.doc的文件是否存在,如果不存在会再检查标题.docx的文件是否存在。
如果存在返回"success",然后就是自动转到inputName属性指定的方法即是将下载文件转成Stream流回给页面的方法。
如果不存在文件,则转发jgcspublic请求,这是查询列表的请求,因为在前台form表单请求时我已经带上了当前页的值,通过chain的方式能保留传递的参数 ,于是当jgcspublic 请求完成时还能回到点击下载时的页面。
DownLoadAction类的代码:
public class DownLoadAction extends ActionSupport { private String fileName; private String type; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getFileName() { try{ ServletActionContext.getResponse().setHeader("charset","ISO8859-1"); return new String(this.fileName.getBytes(), "ISO8859-1"); } catch (UnsupportedEncodingException e) { return "获取文件名出现了错误!"; } } public void setFileName(String fileName) { this.fileName = fileName; } public String checkFile(){ String path = ServletActionContext.getServletContext().getRealPath("/download/guide/"+fileName + ".doc"); File file = new File(path); if(file.exists()){ return SUCCESS; } else{ type = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; path = path.substring(0, path.length()-4) + ".docx"; file = new File(path); if(file.exists()){ return SUCCESS; } } return "fileNotFound"; } public InputStream getGuideFile(){ if(type.equals("application/msword")){ return ServletActionContext.getServletContext().getResourceAsStream("/download/guide/"+ fileName + ".doc"); } else{ return ServletActionContext.getServletContext().getResourceAsStream("/download/guide/"+ fileName + ".docx"); } } }
需要注意的是在getFileName()方法还要进行一定的处理,必须要修改响应的编码格式,以保证文件名回到页面时还是正确中文 ,不然还会是一串乱码的哦。
正确的下载页面:
其实实现struts2的下载功能并不难,关键在于保证中文从前台传到后台 和从后台传到前台的正确性,以及找不到文件情况下的请求转发。整个流程保持合理的逻辑处理就行,希望这篇文章对学习struts2下载的朋友有所帮助,分享互勉!
相关推荐
Properties 文件文中乱码问题解决是指在使用 Struts 框架进行国际化操作时,对于中文资源文件的处理问题。在 Properties 文件中,中文字符可能会变成乱码,这是因为 Eclipse 中的 Properties 资源文件的编码默认...
解决 Struts 中 ApplicationResources.properties 文件不支持中文问题需要使用 Properties Editor 工具,该工具可以正确地处理中文字符,使得 Struts 框架中的资源文件可以正确地显示中文字符。
Struts2+hibernate+spring实现多文件的上传与下载功能,主要包括:上传、下载、删除 1.能够对多个文件进行上传(可以选择上传文件个数,也即上传文件个数不定) 2.Struts2进行下载处理,能对上传的所有文件进行...
在 Struts2 中使用 Velocity 模板引擎,可以通过在配置文件中指定 result 的 type 属性为 velocity,然后将的 location 属性指定到一个以 vm 结尾的资源上就可以了! Velocity 模板引擎的使用中需要注意以下几点: ...
(2)项目是否为utf-8格式(同时看看的源代码文件中,中文是否乱码)。 (3)JSP页面是否是utf-8 格式。 (4)在web.xml 是否配置了编码过滤器。 (5)数据源配置的url(?useUnicode=true&characterEncoding=UTF-8),...
本例主要反映 strust2 不能显示datetimepicker日期的问题。 案例简单明了,亲测可用。 在struts2中,不能显示datetimepicker日期的问题: 原因:struts2.1.6 把struts2.0中的和ajax相关的,如datetimepicker,tree,...
(2)项目是否为utf-8格式(同时看看的源代码文件中,中文是否乱码)。 (3)JSP页面是否是utf-8 格式。 (4)在web.xml 是否配置了编码过滤器。 (5)数据源配置的url(?useUnicode=true&characterEncoding=UTF-8),...
(2)项目是否为utf-8格式(同时看看的源代码文件中,中文是否乱码)。 (3)JSP页面是否是utf-8 格式。 (4)在web.xml 是否配置了编码过滤器。 (5)数据源配置的url(?useUnicode=true&characterEncoding=UTF-8),...
文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...
4.5.3 获取不到表单中的所有信息 4.6 精彩回顾 第5章 Web应用的缔造者 ——Servlet技术 5.1 本章学习任务 5.1.1 本章知识体系 5.1.2 实例开发任务 5.2 与时俱进——了解Servlet技术 5.2.1 初步认识Servlet 5.2.2 ...
7. 中文乱码问题:可以使用 UTF-8 编码格式来解决中文乱码问题。如果使用 GBK 编码格式,需要设置 weblogic.xml 中的编码格式。 8. weblogic.xml 文件:weblogic.xml 文件位于项目工程的 WEB-INF 目录下,与 web....
基于工具使用 SQL 插入中文有乱码问题,设置客户端字符集 gb2312 配置 环境变量 NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK 弹窗了,就表示成功了! 工具补充: Navicat Premium 安装和使用 ...
在线阅读 一、 功能所需工具 下载工具 ...Jodconverter-2.2.1.jar不出现TXT乱码问题,但是不支持office2007格式的文件转换。 Flexpaper不支持中文路径 中文名称的文件转换成了汉语拼音.swf 参考资料 ...
JspRun!- 最棒的免费的开源Java社区软件系统 JspRun!论坛软件系统简介 ...5、增加了商品发布功能(包括财付通功能、积分充值功能及相关的论坛交易功能) 6、增加了注册时用户名中如含有'号则屏蔽该用户名
JspRun!- 最棒的免费的开源Java社区软件系统 JspRun!论坛软件系统简介 ...5、增加了商品发布功能(包括财付通功能、积分充值功能及相关的论坛交易功能) 6、增加了注册时用户名中如含有'号则屏蔽该用户名
(2)项目是否为utf-8格式(同时看看的源代码文件中,中文是否乱码)。 (3)JSP页面是否是utf-8 格式。 (4)在web.xml 是否配置了编码过滤器。 (5)数据源配置的url(?useUnicode=true&characterEncoding=UTF-8),...
12、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 60 13、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类...
尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。 其他测试可以通过参考...