其实有很多人都写过关于struts2下载问题的帖子或博文,但感觉说的不是很系统和清楚,所以笔者就自己的理解来总结一下自己对这个下载方法的理解和应用。

首先,struts2上传和下载比用原始的方法简便很多,所以它比较受亲睐,但要理解好了才能应用;

其次,它表面上看起来很简单但实际上里面的逻辑关系和参数关系比较复杂;

第三,很多人都写过这个代码但是很多时候会报错,如下图:

报着个错就是没有真正理解配置文件中路径问题,这个错误本身不是找不到输入流"targetFile"而是输入流没有找到你规定的要下载的文件,输入流就空(我在下面的Action代码中有判断输入流是否为空的if...else...语句)。

先来看看代码,边看边解释吧。

1.JSP代码:

<a href="DownLoadAction.action">Excel下载</a>

JSP显示效果如下图:

2.DownLoadAction代码:

先把几个参数或方法的作用介绍一下吧:

Sting inputPath(参数):这个是下载文件的全路径(包含名称),即从什么地方下载什么文件和下载的是那个文件;

InputStream  getTarGetFile()(方法):这个方法是为下载文件提供输入流,看其返回值就知道了,就是以流的形式读取文件,也可以说是下载文件的源;

注:要想真正体会这个参数和这个方法的作用和意义,还是看看配置文件后理解的更透彻。

package action;import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;public class DownLoadAction extends ActionSupport {private String inputPath;// 依赖注入该属性值的setter方法public void setInputPath(String value) {inputPath = value;}//让Action获得targetFile属性,即输入流public InputStream getTargetFile() throws Exception {System.out.println("执行到这儿了吗?");if (ServletActionContext.getServletContext().getResourceAsStream(inputPath) == null) {System.out.println("路径:"+inputPath);System.out.println("输入流为空");} else {System.out.println("输入流不为空");}return ServletActionContext.getServletContext().getResourceAsStream(inputPath);}//让execute()方法来执行Action@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.out.println("这个方法应该执行了!");return "success";}}

3.*struts.xml配置文件代码(重要)

<action name="DownLoadAction" class="action.DownLoadAction"><param name="inputPath">\test.xls</param><result name="success" type="stream"><param name="contentType">application/vnd.ms-excel</param><param name="inputName">targetFile</param><param name="contentDisposition">filename="linux.xls"</param><param name="bufferSize">1024</param></result></action>

看这代码来逐行解释其含义:

<param name="inputPath">\test.xls</param>:这一行是告诉Action下载文件的路径,这个"\test.xls",不是随便的路径,是有要求的;

这个路径的真实含义:H:\MyEclipse  9\.metadata\.me_tcat\webapps\excel\test.xls,

解释下:MyEclipse  9是我的myeclipse的工作空间名称;

在其下有个.metadata文件夹;

再下一层有个.me_tcat\webapps;

而excel是我的项目的名称;

test.xls就是要下载的文件。

其实,这个路径就是javaweb项目在Tomcat下加载后"webapps\项目名称\要下载的文件名称"(我用的是myeclipse自带的Tomcat)。

<result name="success" type="stream">:这一行,name属性没什么好说的,至于type属性如果不懂得可以上百度上看看,struts2 Action配置相关文章,这里也不多说了。
<param name="contentType">application/vnd.ms-excel</param>:这一行也很重要,contentType属性标识要下载的文件的类型,下载的时候是以流的形式下载的,这个属性可以让Action知道下载后把这个文件写成什么类型的文件。

这个要是不了解不多的,可以参照http://baike.baidu.com/view/1547292.htm看看下面的常用类型。

<param name="inputName">targetFile</param>:这一行是和Action中的那个getTargetFile()方法相对应,就是告诉Action一个输入流,让Action知道从哪儿读取文件流。
<param name="contentDisposition">filename="linux.xls"</param>:这一行中contentDisposition属性有一下作用:

Content-disposition头提供给浏览器确定HTTP响应内容的信息。当浏览器读到这些头信息后,它能确定:
A. HTTP响应包含一个文件;
B. 包含在响应中的文件名; 
C. 该文件是显示在浏览器主窗口中还是要用外部的应用查看;

这个属性可以不配置,也可以配置成"attachment"和"inline",配置成前者后servlet就指示浏览器把文件当成附件处理,而配置成后者servlet就指示浏览器把文件"内嵌"显示文件。

这个要是不了解不多的,可以参照http://wfwkiss.iteye.com/blog/528410看看详细的说明和解释。

<param name="bufferSize">1024</param>:这一行就很简单了,就是以字节为单位规定缓冲区的大小。
      好了,用了一个小时来总结这些,一方面是把自己学习过的知识有个总结,另一方面是可以帮助到那些对这些问题还不是很懂的朋友们,都1:30了,在不睡明天又起不了了。

大家晚安!

Struts2下载问题再探相关推荐

  1. 再探C#类与结构体究竟谁快——考虑栈变量、栈分配、64位整数、密封类

    上次我对C#类与结构体做了一次速度评测(http://blog.csdn.net/zyl910/article/details/6788417).经过一段时间思索,发现还可以进一步探讨-- 第一.栈变 ...

  2. 【CTF大赛】2021 DASCTF July cybercms 一探再探

    引言 在前不久结束的 2021 DASCTF July X CBCTF 4th 比赛中,有一道名为 cybercms 的 web 题目. 预期解是从后台登录处进行 SQL 注入写入一句话木马,然而咱在 ...

  3. SAP MM 工序委外场景再探 – 相关采购申请单据中的总账科目确定

    SAP MM 工序委外场景再探 – 相关采购申请单据中的总账科目确定 如下的采购申请,是工序委外场景的采购申请, 它在工单1000030 Release的时候被自动触发. 问题是:这个PR上的总账科目 ...

  4. 【Vue.js 牛刀小试】:第九章 - 组件基础再探(data、props)

    系列目录地址 一.基础知识概览 第一章 - 一些基础概念(posted at 2018-10-31) 第二章 - 常见的指令的使用(posted at 2018-11-01) 第三章 - 事件修饰符的 ...

  5. RxSwift学习--核心逻辑再探

    前言 通过上一篇内容RxSwift学习--核心逻辑初探,对RxSwift有了些初步的认知,下面通过源码来看一下RxSwift到底有多骚 RxSwift核心逻辑再探 先把上篇中的例子代码搬过来: //第 ...

  6. 联发科mtk手机处理器怎么样_5G手机价格将再探新低!联发科天玑700芯片发布:入门级5G处理器...

    ↑↑↑点击上方蓝字订阅每日最新国产手机资讯 今年5G手机的普及之所以能进展的如此迅速,联发科在5G芯片领域的的活跃功不可没.今天一早,联发科发布的全新的天玑700移动平台,标志着5G手机的价格将进一步 ...

  7. C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员

    文章目录 构造函数再探 以下代码共调用多少次拷贝构造函数 委托构造函数 概念 形式 匿名对象 友元 友元的声明 友元类 令成员函数作为友元 函数重载和友元 注意 内部类 特性 类的const成员 可变 ...

  8. 函数重载、引用再探、内联函数

    文章目录 函数重载 为什么C++支持重载,C语言不支持呢? extern "C" 引用再探 引用的特性 引用的使用场景 引用和指针 引用和指针的不同点: 内联函数 什么是内联函数? ...

  9. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

  10. C++之再探参数绑定bind、bind1st、bind2nd、placeholders占位符

    相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essential C++>笔记之设计一个泛型算法(二) 相关 ...

最新文章

  1. java 三个参数的运算符,java – 三个参数运算符:局部变量可能尚未初始化
  2. 实时流处理框架Storm、Spark Streaming、Samza、Flink,孰优孰劣?!
  3. select里加链接
  4. NetSuite二次开发服务改变中小企业发展困境!
  5. (65)Vue-cli介绍
  6. php 错误提示模板,php 关闭错误提示方法总结与性能分析
  7. java注解 python装饰器_python装饰器
  8. 自适应共振理论网络 ART
  9. mysql复制表原理_MySQL 主从复制原理与实践详解
  10. ValueError: This model has not yet been built. Build the model first by calling `build()` or calling
  11. spring和mybatis整合代码
  12. 最新高品质+武汉城区建筑物范围面shp格式+小区大厦学校医院占地面积
  13. 【Python】Numpy生成等差数组
  14. 无线网和网吧服务器,网吧网络使用无线局域网的几个优势所在
  15. 学科基本结构理论-布鲁纳学习理论
  16. 工作三年程序员收入到底多高?透露收入:网友:哇,真的好高呀!
  17. 4款国产实用软件,只因功能强大,常被误认为是外国人开发的
  18. 有哪些可助力英文学术论文写作的在线网站、工具或软件?
  19. 企业IT咨询和信息化规划方法
  20. Ubuntu下解压rar文件的方法

热门文章

  1. 福利 | 这些网站有免费代理IP!
  2. 毕业论文页码格式制作
  3. 学前端进度慢怎么办?前端学不懂怎么办?
  4. Mac怎么方便看节假日安排,添加中国法定节假日安排
  5. 2017年节假日放假安排来了!
  6. linux系统底层,干货|七点,用计算机底层知识教你安装Linux系统!
  7. 马云:未来制造业要的不是石油 最大的能源是数据
  8. 实用的网页模板(一)
  9. 什么是表压?什么是绝压?表压和绝压什么关系?
  10. 非常详细的范式讲解(1NF/2NF/3NF/BCNF)