众所周知,在struts.xml中,每个action元素内,可以有一个或多个的result子元素,然后我们可以通过在Action类的execute方法的返回值与result元素的name属性进行匹配,然后找到对应的物理视图,实际上result元素除了name属性以外,还有type属性,由于不同的type属性,struts2会调用不同的处理类来处理请求和响应,因此可以通过指定不同的类型来指定struts2架构以不同的动作、方式进行请求、响应处理,先来看看struts-default.xml里面的result片段;

<result-types><result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/><result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/><result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/><result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/><result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/><result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/><result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/><result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/><result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/><result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /><result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" />
</result-types>

通过上述片段,我们可以知道,struts2默认以请求转发的方式响应客户请求;这时候,大家注意到我们的下载不也正是需要在响应的时候需要以流的方式处理嘛,针对下载这一点,struts2专门提供了一个stream的结果类型来专门处理下载;

由于stream结果类型的处理类是ora.apache.struts2.dispatcher.StreamResult,咱们先来看一下这个类内部有哪些参数以及每个参数的作用

StreamResult'Parameters
contentType String 用来指定发送到web浏览器的流的MIME类型
contentLength String 流的长度,以比特位单位(浏览器展示下载进度条)
contentDisposition String 用来指定文件名称以及客户端打开文件的方式(默认是用内嵌方式打开,一般来说可以指定attachment;filename="document.pdf")
inputName String 用来指定Action链中,InputStream属性名,需要记住的是这个属性是用来作为文件下载的流的来源,默认值为inputStream
bufferSize   用来指定从输入到输出中,缓冲区的大小
allowCaching boolean 如果将它设为false,它会将响应头的pragma和cache-control的content属性设置为no-cache来阻止客户端缓存内容,默认值为true
contentCharSet String 如果给这个属性设置一个字符串,那么‘;charset=value’将会被添加到响应头的content-type中

好的,来看配置

package com.struts2.controller;import java.io.File;
import java.io.InputStream;import javax.servlet.ServletContext;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class FileDownloadAction extends ActionSupport {// 文件的Mime类型private String contentType;// 文件的放置路径private String filePath;// 要下载的文件名称private String fileName;// 该属性设置与否都可以,但是比如提供get方法private InputStream fileInputStream;public InputStream getFileInputStream() {// 以及文件的mime类型以及创建流ServletContext context = ServletActionContext.getServletContext();String mimeType = context.getMimeType(context.getRealPath(filePath + "/" + fileName));setContentType(mimeType);return context.getResourceAsStream(filePath + "/" + fileName);}public void setFileName(String fileName) {this.fileName = fileName;}public String getFileName() {return fileName;}public void setFileInputStream(InputStream fileInputStream) {this.fileInputStream = fileInputStream;}public String getContentType() {return contentType;}public void setContentType(String contentType) {this.contentType = contentType;}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}}

struts.xml中的配置如下:

 <!-- 处理文件的下载请求 --><action name="download" class="com.struts2.controller.FileDownloadAction"><!-- 服务器端待下载文件的路径 --><param name="filePath">/0810</param><!-- 处理文件下载时,一定要将返回result的类型设置为stream --><result name="success" type="stream"><!-- 指定下载文件的MIME类型 --><param name="contentType">${contentType}</param><!-- 指定有当前Action 中的哪个方法返回数据流 --><param name="inputName">fileInputStream</param><!-- 指定文件下载时,浏览器处理文件的方式 --><param name="contentDisposition">attachment;filename="${fileName}"</param></result></action>

需要在WebRoot下面新建一个0810的文件夹,里面放置若干文件,然后在浏览器地址栏输入:

http://localhost:8080/struts2/download?fileName=0810文件夹的任意文件名,就可以实现一个简单下载了;

Struts2的下载机制并不复杂,关键点在于对Struts2处理文件下载时的思路,以及对于StreamResult的理解,搞清楚前因后果,思想理解好了,就没有什么太大问题!

Struts2之文件下载相关推荐

  1. Struts2实现文件下载功能

    最近项目中需要做一个开发平台,第一个功能就是实现文档对外提供下载功能,项目中用到的是Struts2框架,因此写了一个简单的ACTION在此记录学习. 第一步:首先需要新建一个ACTION: impor ...

  2. Struts2学习笔记(十七) 文件下载(File Download)

    前面我们刚刚学完文件上传,那么我们就接着来看和文件上传相对应的文件下载吧.对于文件上传而言,文件下载实现起来要简单的多.通常我们可以直接将一个超链接的地址指向我们想要给用户下载的资源即可.但是如果这些 ...

  3. java struts2 文件下载,Struts2文件下载

    一个简单的利用struts2做文件下载的demo-- 首先配好struts: web.xml xmlns="http://java.sun.com/xml/ns/j2ee" xml ...

  4. 【struts2+hibernate+spring项目实战】数据报表jxl及生成excel(ssh项目实战)

    一.数据报表jxl jxl是一款java读写office--Excel文件的工具.通过java程序进行Excel文件的读写操作. 操作Excel首先应该明确操作过程中java针对Excel文件的对象分 ...

  5. struts2教程--实现文件上传下载

    Struts2文件上传下载 一.Struts2文件上传 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 fileUpload拦截 ...

  6. struts2教程(8)--文件上传下载

    Struts2文件上传下载 一.Struts2文件上传 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 fileUpload拦截 ...

  7. Struts2 文件上传,下载,删除

    本文介绍了: 1.基于表单的文件上传 2.Struts 2 的文件下载 3.Struts2.文件上传 4.使用FileInputStream FileOutputStream文件流来上传 5.使用Fi ...

  8. nfine框架 上传文件_MVC之Struts2框架--你并不了解的高级应用

    <"爱读书"--给你讲技术>,我来看书,你来进步,让我们开始吧! 本书简介 书名为<轻量级JavaEE企业应用实战>,是本人在学习JavaEE框架的时候阅读 ...

  9. Struts2实现文件上传与下载

    Struts包+源码下载地址:点击打开链接   ,打不开,复制后面 http://struts.apache.org/download.cgi#struts223  ,历史版本:http://arch ...

最新文章

  1. linux刻录光盘空间不足,linux下刻录光盘所发生的问题及解决办法
  2. C++Tower of Hanoi汉诺塔的实现算法(附完整源码)
  3. 安装TokuDB引擎
  4. 使html表格可编辑状态,js+Html实现表格可编辑操作
  5. mysql语句中变量 c#_C#基础知识-您的第一个C#程序,类型和变量以及流控制语句...
  6. python处理json文件_python处理json文件
  7. 回填用土好还是砂石料好_养猪用颗粒料好还是自配料好?其实各有优劣,养猪人要会选择...
  8. spring eurake中使用IP注册
  9. 三维点云学习(2)下-Octree
  10. python画3d图-Python绘制3D图形
  11. android动画哪些,Android Animation动画(很详细)
  12. iOS资源汇总(长期更新)
  13. 服务器系统2003资源监视器在哪里,Win10资源监视器在哪 如何打开资源监视器
  14. b5纸尺寸_【收藏款】平面设计标准尺寸规范总结
  15. java 区分鼠标左键单击和双击
  16. 为什么中国软件不咋样
  17. 人工智能未来发展论文
  18. python控制步进电机驱动器_树莓派通过GPIO控制步进电机(python)
  19. C语言编程-百钱百鸡问题
  20. redis清空所有数据 php

热门文章

  1. Android 注解的使用与注意事项
  2. virtual box 针对Unable to load R3 module 解决方案
  3. 题目1417:变形金刚
  4. [SQL SERVER 2005]数据库差异备份及还原
  5. JavaScript表单序列化的方法详解
  6. Java == equal
  7. javascript两行代码按指定格式输出日期时间
  8. 初读JavaScript DOM编程艺术(一)
  9. css常用单位px、em、 rem 区别与各自的用法解析
  10. 初步了解react-babel-虚拟DOM-JSX-类组件-函数式组件