众所周知,在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
contentTypeString用来指定发送到web浏览器的流的MIME类型
contentLengthString流的长度,以比特位单位(浏览器展示下载进度条)
contentDispositionString用来指定文件名称以及客户端打开文件的方式(默认是用内嵌方式打开,一般来说可以指定attachment;filename="document.pdf")
inputNameString用来指定Action链中,InputStream属性名,需要记住的是这个属性是用来作为文件下载的流的来源,默认值为inputStream
bufferSize用来指定从输入到输出中,缓冲区的大小
allowCachingboolean如果将它设为false,它会将响应头的pragma和cache-control的content属性设置为no-cache来阻止客户端缓存内容,默认值为true
contentCharSetString如果给这个属性设置一个字符串,那么‘;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实现文件下载功能”的示例中,我们将深入探讨如何利用Struts2框架来实现在web应用中让用户下载文件的功能。 首先,我们需要理解文件下载的基本原理。在Web应用中,当用户点击一个链接或提交一个表单...
在Struts2中,文件上传和下载是常见的功能需求,特别是在处理用户交互和数据交换时。这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件...
从给定的文件信息来看,标题“struts2中文学习文档”和描述“struts2的根本webwork2”表明这是一份关于Struts2框架的学习资料,特别强调了Struts2与WebWork2的关系。Struts2是Apache Struts的一个版本,它是一个用于...
本篇文章将详细探讨如何在Struts2框架下实现文件的上传与下载。 首先,我们需要了解Struts2中的文件上传机制。Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在...
在Struts2中处理文件下载是常见的需求,比如用户请求下载服务器上的文件,如PDF、图片或其他类型的文档。本案例"Struts2之struts012"将深入探讨如何在Struts2中实现文件下载的功能。 首先,我们需要创建一个Action...
struts2官方文档
struts2中实现文件上传 struts2中实现CRUD struts2中的OGNL struts2的新表单标志的使用 struts2与AJAX一 struts2与AJAX二 struts2与AJAX三 struts2中用Spring实现IOC struts2中的零配置与IOC struts2介绍之使用连接...
这个“Struts2接口文档”是开发者的重要参考资料,提供了关于Struts2框架内各个组件、类库以及接口的详细说明,帮助开发者深入理解框架的内部工作原理并有效地使用其功能。 Struts2的核心组件包括Action、Result、...
总之,这个项目实例为使用Struts2和Uploadify实现带进度条的多文件上传及下载功能提供了一个基础模板,对于学习和实践此类功能的开发者来说是一个有价值的参考。通过深入研究和理解这个项目的代码,可以提升对Struts...
在这个特定的项目中,我们关注的是"struts2文件上传下载"的功能,这涉及到用户通过Web界面上传文件到服务器,以及从服务器下载文件到用户的设备。 文件上传是Web应用中的常见需求,例如用户可能需要提交图片、文档...
这个API帮助文档是开发者在使用Struts2框架时的重要参考资料,它详细阐述了框架的各种组件、类库和方法,有助于理解并有效利用Struts2的功能。 1. **Struts2核心组件** - `struts2-core`:这是Struts2框架的核心...
在下载并解压"struts2所有jar包"后,开发者需要将lib目录下的所有jar文件添加到项目构建路径中,确保运行时可以找到所有依赖。对于Maven或Gradle用户,可以通过在pom.xml或build.gradle文件中指定相应的依赖项,实现...
4. **结果类型(Result Types)**:Struts2支持多种结果类型,如`dispatcher`(默认,将结果转发到JSP页面)、`stream`(用于文件下载)、`redirect`(重定向URL)等,可以根据不同的需求选择合适的结果类型。...
通过上述步骤,我们就可以在Struts2框架下实现文件流方式的下载功能,无论是Excel、TXT还是图片,都能有效地直接返回给浏览器,让客户端进行下载。这种方式既节省了服务器资源,也提高了用户体验。在实际项目中,...
"Struts2.0中文教程.chm"文件很可能是官方文档的中文版,它将涵盖Struts2的基础概念、配置、控制器、模型、视图、拦截器、异常处理、国际化、测试等方面的内容。这份文档将帮助初学者快速上手,同时也为有经验的...
"struts2 jar"文件包含了Struts2框架的核心库,可能包括struts2-core、struts2-convention、struts2-json-plugin等依赖,这些是开发Struts2应用必不可少的组件。 "Struts2"可能是项目实例代码,包括Action类、视图...
在Struts中实现文件下载是一项常见的功能,尤其在处理用户请求获取服务器上的静态或动态资源时。这篇博文将深入探讨如何在Struts框架下实现文件下载的功能。 首先,我们需要了解文件下载的基本原理。当用户点击下载...
网上很多有关struts2的api文档都是不全的。我经过精心整理出的struts2api文档,非常齐全。
这个开发者文档API提供了全面的指南,帮助开发者深入理解并有效地利用Struts2框架来开发高效、可维护的Web应用。以下是Struts2 API中的关键知识点: 1. **Action接口**:这是Struts2的核心组件,它定义了处理用户...