- 浏览: 145564 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
zi_wu_xian:
docx格式的word文件虽然是zip格式的,也可以看到xml ...
用Java操作Office 2007 -
MyDreamNotDream:
看代码看到这里很不容易呢。
Java中HashMap的实现原理 -
四书五经:
to 楼上的 SonofGod :这个时候这样去获取:如果(值 ...
Java中HashMap的实现原理 -
SonofGod:
请问 楼主 在疑问3中。多个key的hash值一样的话,存储时 ...
Java中HashMap的实现原理 -
SonofGod:
请问 楼主 在疑问2中。多个可以的hash得到一样的hash值 ...
Java中HashMap的实现原理
文件下载给我们最直接的概念就是,给个文件链接点击就下载。似乎太简单,然而 Struts2 却把它作为一个独立的学问来对待,理由有四:
1. 文件名为中文时,直接点击下载,链接可能会走样(某些浏览器,URL 编码的问题),致使无法下载。
2. 不总是从下载实际的文件,文件内容有时候是动态生成的,如数据库中的内容。
3. 对于知名的文件类型不让浏览器直接打开,而是出现下载对话框保存文件。例如,要下载的文件是 .txt 的,可能直接就在浏览器中显示其内容。
4. 需要授权才能下载文件时
当然对于以上若干问题,Servlet/JSP 都能通过正确的 URL 编码,响应头设置、权限代码控制解决,只是 Struts2 让我们处理起来更方便了,内部原理自然是一样的。
先来看下 Servlet 如何实现文件下载的,直接见代码:
01.
PrintWriter out = response.getWriter();
02.
03.
//不管实际类型,待下载文件 ContentType 统一指定为 application/octet-stream
04.
response.setContentType(
"application/octet-stream"
);
05.
06.
//中文文件名必须转码为 ISO8859-1,否则为乱码
07.
String fileName =
new
String(
"文本文件.txt"
.getBytes(),
"ISO8859-1"
);
08.
09.
//作为附件下载,相应的 "inline;filename = "+fileName 是在线(浏览器中显示内容)打开
10.
response.setHeader(
"Content-Disposition"
,
"attachment;filename="
+ fileName);
11.
12.
//因为文件编码也为 ISO8859-1,所以内容须转码成 ISO8859-1,尚不知如何控制下载文本文件的编码
13.
//或有谁知道的,还请告诉我一下。 文件内容可以从物理文件中来,或者数据库中读取填入等等
14.
out.write(
new
String(
"Servlet 文件下载测试"
.getBytes(),
"ISO8859-1"
));
15.
16.
out.close();
知道了上面各行的含义,再来看下 Struts2 的解决方式,其实不过是把某些代码的功能移入到了配置文件而已。在李刚所著的《Struts 2 权威指南》中说 Struts 实现文件下载是由一个 download 拦截器。其实不然,只是一个 StreamResult(org.apache.struts2.dispatcher.StreamResult) 而已,也不像实现文件上传那样要额外的 JAR 包。在 StreamResult 中有以下几个默认属性要留意一下:
public static final String DEFAULT_PARAM = "inputName";
protected String contentType = "text/plain";
protected String contentDisposition = "inline";
protected String inputName = "inputStream";
protected InputStream inputStream;
protected int bufferSize = 1024;
StreamResult 的实现细节敬请阅读它的源代码,实现过程一言以蔽之就是:从 inputStream 获取内容,以相应的 contentType、contentDisposition 和 bufferSize 输出给浏览器,对 contentType 和 contentDisposition 的相应设置就能实现文件下载,可对照前面 Servlet 的实现。看个实际的例子吧。
struts.xml 中 Action 的配置,假定 Action 类为 com.unmi.DownLoadAction
01.
<
action
name
=
"download"
class
=
"com.unmi.action.DownloadAction"
>
02.
<
result
name
=
"success"
type
=
"stream"
>
<!--type 为 stream 应用 StreamResult 处理-->
03.
<
param
name
=
"contentType"
>application/octet-stream</
param
>
<!--默认为 text/plain-->
04.
05.
<!-- 默认就是 inputStream,它将会指示 StreamResult 通过 inputName 属性值的 getter 方法,
06.
比如这里就是 getInputStream() 来获取下载文件的内容,意味着你的 Action 要有这个方法 -->
07.
<
param
name
=
"inputName"
>inputStream</
param
>
08.
09.
<!-- 默认为 inline(在线打开),设置为 attachment 将会告诉浏览器下载该文件,filename 指定下载文
10.
件保有存时的文件名,若未指定将会是以浏览的页面名作为文件名,如以 download.action 作为文件名,
11.
这里使用的是动态文件名,${fileName}, 它将通过 Action 的 getFileName() 获得文件名 -->
12.
<
param
name
=
"contentDisposition"
>attachment;filename="${fileName}"</
param
>
13.
<
param
name
=
"bufferSize"
>4096</
param
>
<!-- 输出时缓冲区的大小 -->
14.
</
result
>
说明:对于上面的配置其他参数可以用默认值,关键就是 contentDisposition 要设置为 attachment 才能提示下载,同时用 filename 指定文件名,若直接指定非动态的文件名。
DownloadAction 代码,需要实现 getInputStream() 返回输入流;因前面用的动态文件名,所以须加上 getFileName() 返回文件名,若非动态文件名,则该方法可省去。
01.
package
com.unmi.action;
02.
03.
import
java.io.*;
04.
import
java.text.*;
05.
import
java.util.Date;
06.
07.
/**
08.
* 文件下载的 Action
09.
* @author Unmi
10.
*/
11.
public
class
NetbookSerialAction {
12.
13.
public
String execute()
throws
Exception {
14.
//这里可加入权限控制
15.
return
"success"
;
16.
}
17.
18.
//获得下载文件的内容,可以直接读入一个物理文件或从数据库中获取内容
19.
public
InputStream getInputStream()
throws
Exception {
20.
//return new FileInputStream("somefile.rar"); 直接下载 somefile.rar
21.
22.
//和 Servlet 中不一样,这里我们不需对输出的中文转码为 ISO8859-1
23.
return
new
ByteArrayInputStream(
"Struts2 文件下载测试"
.getBytes());
24.
}
25.
26.
//对于配置中的 ${fileName}, 获得下载保存时的文件名
27.
public
String getFileName() {
28.
DateFormat df =
new
SimpleDateFormat(
"yyyy-MM-dd"
);
29.
String fileName =
"序列号("
+ df.format(
new
Date()) +
").txt"
;
30.
try
{
31.
//中文文件名也是需要转码为 ISO8859-1,否则乱码
32.
return
new
String(fileName.getBytes(),
"ISO8859-1"
);
33.
}
catch
(UnsupportedEncodingException e) {
34.
return
"impossible.txt"
;
35.
}
36.
}
37.
}
谨记一个就是,要想下载的文件名不乱码就要以 ISO8859-1 字符集进行转码,内容会否乱码可在调试中解决。
好啦,启动服务,访问 http://localhost:8080/teststruts2/download.action,浏览器便会提示下载 序列号(2009-06-17).txt,内容为:“Struts2 文件下载测试”。
发表评论
-
微信收货地址共享接口-终极解决
2015-06-25 13:10 8365最近要接入微信的收货地址共享接口,总是不成功,折腾了好 ... -
Java中HashMap的实现原理
2011-04-28 14:30 2802昨天有人来公司面试,因为面试的地方和我坐的地方比较近,所以也听 ... -
java注解(annotation)简介
2010-06-13 10:10 1357[Java 5.0] Annotation – @Deprec ... -
quartz和spring-quartz
2010-06-13 10:03 965quartz和spring-quartz -
Java 线程实例讲解综述
2010-06-13 09:57 1041Java 线程实例讲解综述 编写具有多线程能力的程序经常会用 ... -
Java Double 精度问题总结
2010-06-13 09:56 5319使用Java,double 进行运算时,经常出现精度丢失的问题 ... -
eXtremeComponents的eXtremeTable分页特性
2010-05-14 17:27 3392下面是我使用的例子: <ec:table ite ... -
java---final 关键字 和 static 用法
2010-03-17 13:58 895final 关键字 和 static 用法 一、final ... -
java版的escape和unescape方法
2010-03-17 09:21 2592其中unescape方法可以用来解开javascript的es ... -
StatSVN的使用说明
2010-03-04 10:27 1046一、 checkout 希望统计的版本或者分支到某个目录(不管 ... -
Velocity语法
2010-03-01 18:01 9151. 变量 (1)变量的 ... -
用KeyTool生成安全证书
2010-02-22 17:14 1145详细请见:Tomcat的帮助文档,:https://local ... -
Spring 注解学习手札
2010-02-10 10:02 880http://snowolf.iteye.com/blog/5 ... -
JDK、JRE、JVM的关系
2010-01-25 11:23 905JDK就是Java Development Kit.简单的说J ... -
类装载器学习
2010-01-22 12:54 859Java的类装载器(Class Loader)和命名空间(Na ... -
Tomcat发布项目方法
2010-01-22 10:46 2629第一种方法:在tomcat中的conf目录中,在server. ... -
理解Java ClassLoader机制
2010-01-21 16:20 924当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初 ... -
cookie和session的工作机制
2010-01-19 15:19 853转载自:http://hi.baidu.com/jmtbai/ ... -
如何设置Tomcat的JVM虚拟机内存大小
2010-01-18 14:25 982Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上 ... -
浅谈设置JVM内存分配的几个妙招
2010-01-18 14:24 1611安装Java开发软件时,默 ...
相关推荐
总的来说,Struts2接口文档是学习和使用Struts2框架不可或缺的工具,它能帮助开发者高效地理解和使用框架提供的各种组件和接口,提升开发效率,减少错误,并有助于深入理解MVC模式在实际项目中的应用。通过仔细研读...
Struts1和Struts2是两个非常著名的Java Web框架,它们都提供了处理文件上传和下载的功能,但实现方式有所不同。本文将深入探讨这两个框架在文件操作方面的具体实现。 首先,让我们了解一下Struts1中的文件上传功能...
这个API帮助文档是开发者在使用Struts2框架时的重要参考资料,它详细阐述了框架的各种组件、类库和方法,有助于理解并有效利用Struts2的功能。 1. **Struts2核心组件** - `struts2-core`:这是Struts2框架的核心...
通过理解MVC模式、熟练掌握Struts2的配置和Action处理、灵活运用Jquery和Ajax,可以大大提高开发效率,提升用户使用体验。在实际开发过程中,还需要关注安全问题,如Struts2的安全漏洞,确保应用的稳定性和安全性。
通过阅读这份“超好的Struts2 pdf 文档”,开发者不仅可以掌握Struts2的基本使用,还能深入理解其设计理念,提升Web应用的开发效率和质量。在实际项目中,结合Struts2的灵活性和强大的功能,可以构建出稳定、高效的...
总的来说,"Struts2帮助文档"是一份宝贵的资源,它将引导你探索Struts2的强大功能,助你在开发高效、稳定的Web应用时游刃有余。通过深入阅读和实践,你不仅可以掌握Struts2的使用,还能提升Java web开发的整体能力。
此压缩包包含的"Struts2-API"和"Struts2中文帮助文档"是学习和开发Struts2应用的重要资源。 Struts2-API文档详细列出了框架的所有公共接口和类,这是开发者理解并使用Struts2核心组件的基础。例如,`ActionSupport`...
通常,Struts2的核心库和其他依赖库会以JAR(Java Archive)文件的形式包含在项目中,这些JAR文件包含了框架的所有类和方法。开发者需要将这些JAR文件添加到项目的类路径中,以便能够使用Struts2的功能。文件可能会...
Struts2-showcase是一个用于演示和学习Apache Struts2框架功能的开源项目。这个压缩包“struts2-showcase.rar”包含了完整的源代码,旨在帮助开发者深入理解Struts2框架的工作原理及其各种特性。以下是对Struts2和...
这个“struts2简单例子”是初学者理解Struts2工作原理和核心概念的一个很好的起点。让我们深入探讨一下Struts2的基础知识。 1. **MVC架构**: MVC模式是软件设计中的一个经典模式,它将应用逻辑分为三个主要部分:...
Struts2是Java Web开发中一个非常重要的框架,它的出现为开发者提供了强大...总的来说,学习和理解Struts2的基础应用,不仅能够帮助开发者构建功能完善的Web应用,也能为后续深入学习其他Java Web框架打下坚实的基础。
总的来说,Struts2的文件上传和下载功能强大且灵活,但需要对HTTP协议、文件流操作和服务器文件系统有基本理解。实际开发时,还需要考虑错误处理、安全性和性能优化,比如限制文件大小、检查文件类型、防止路径遍历...
- **定义与特点**:Struts2是一款基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它继承了Struts1的优点,同时在设计上更加灵活、易用,支持拦截器、类型转换、文件上传等特性。Struts2使用过滤...
这个压缩包文件包含了关于Struts2开发的各种文档,是开发者深入理解并熟练运用Struts2的重要参考资料。 首先,Struts2的核心是基于MVC(Model-View-Controller)设计模式的,它将业务逻辑、数据模型和用户界面分离...
在这个“最简单的struts2文件”中,我们可以找到构建一个基本Struts2应用所需的组件和配置。下面将详细解释Struts2的核心概念和关键组成部分。 1. **Action类**: 在Struts2中,业务逻辑主要由Action类执行。...
Struts2是一个强大的Java web应用程序框架,用于构建和管理MVC(模型-视图-控制器)架构的应用程序。它在Java社区中广泛使用,因...理解并熟练掌握这些知识点,将有助于你高效地开发和维护基于Struts2的Java web应用。
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Struts1的基础上进行了很多改进和增强,提供了更强大的功能和更好的灵活性。这个"STRUTS2学习文档"显然是一个关于如何理解和...
Struts2是一个强大的Java web应用程序框架,用于构建和...通过深入理解和熟练运用Struts2,开发者可以创建高效、可维护的Web应用。在使用过程中,保持框架的版本更新和遵循最佳实践是确保应用安全性和稳定性的关键。
Struts2.2.1是该框架的一个版本,提供了丰富的功能和改进,以提高开发效率和应用性能。 在"Struts2.rar"文件中,我们可以期待找到以下核心知识点: 1. **拦截器(Interceptors)**:Struts2的一大特色是它的拦截器...
Struts2是一个强大的MVC(模型-视图-控制器)框架,它被广泛应用于Java Web开发中,提供了灵活的架构来构建可维护性和扩展性良好的应用程序。本综合应用实例主要展示了如何利用Struts2框架与MySQL数据库进行集成,...