- 浏览: 141008 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 8305最近要接入微信的收货地址共享接口,总是不成功,折腾了好 ... -
Java中HashMap的实现原理
2011-04-28 14:30 2728昨天有人来公司面试,因为面试的地方和我坐的地方比较近,所以也听 ... -
java注解(annotation)简介
2010-06-13 10:10 1313[Java 5.0] Annotation – @Deprec ... -
quartz和spring-quartz
2010-06-13 10:03 873quartz和spring-quartz -
Java 线程实例讲解综述
2010-06-13 09:57 983Java 线程实例讲解综述 编写具有多线程能力的程序经常会用 ... -
Java Double 精度问题总结
2010-06-13 09:56 5250使用Java,double 进行运算时,经常出现精度丢失的问题 ... -
eXtremeComponents的eXtremeTable分页特性
2010-05-14 17:27 3281下面是我使用的例子: <ec:table ite ... -
java---final 关键字 和 static 用法
2010-03-17 13:58 842final 关键字 和 static 用法 一、final ... -
java版的escape和unescape方法
2010-03-17 09:21 2502其中unescape方法可以用来解开javascript的es ... -
StatSVN的使用说明
2010-03-04 10:27 1000一、 checkout 希望统计的版本或者分支到某个目录(不管 ... -
Velocity语法
2010-03-01 18:01 8371. 变量 (1)变量的 ... -
用KeyTool生成安全证书
2010-02-22 17:14 1095详细请见:Tomcat的帮助文档,:https://local ... -
Spring 注解学习手札
2010-02-10 10:02 780http://snowolf.iteye.com/blog/5 ... -
JDK、JRE、JVM的关系
2010-01-25 11:23 854JDK就是Java Development Kit.简单的说J ... -
类装载器学习
2010-01-22 12:54 773Java的类装载器(Class Loader)和命名空间(Na ... -
Tomcat发布项目方法
2010-01-22 10:46 2566第一种方法:在tomcat中的conf目录中,在server. ... -
理解Java ClassLoader机制
2010-01-21 16:20 849当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初 ... -
cookie和session的工作机制
2010-01-19 15:19 763转载自:http://hi.baidu.com/jmtbai/ ... -
如何设置Tomcat的JVM虚拟机内存大小
2010-01-18 14:25 925Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上 ... -
浅谈设置JVM内存分配的几个妙招
2010-01-18 14:24 1567安装Java开发软件时,默 ...
相关推荐
它包含用于构建一个功能齐全的博客系统的源代码和资源文件,结合了Java Server Pages (JSP)、Apache Struts框架、Hibernate持久化框架以及Spring框架的强大功能,以支持高效的数据库操作和灵活的业务逻辑处理。...
Struts原理、开发及项目实施 Holen 2002-9-12 <br/>1、 摘要 2、 关键词 3、 Framework 4、 Struts的起源 5、 Struts工作原理 6、 Struts安装 7、 一个实例 8、 Struts优缺点...
·与主流技术的整合应用——考虑到ExtJS开发的实际情况,本书还特意讲解与Ajax、JSP标签库、Struts的整合,真正实现在开发中灵活应用ExtJS。 精彩示范效果 包含相关实例文件,源代码和ExtJS库文件。...
·与主流技术的整合应用——考虑到ExtJS开发的实际情况,本书还特意讲解与Ajax、JSP标签库、Struts的整合,真正实现在开发中灵活应用ExtJS。 精彩示范效果 包含相关实例文件,源代码和ExtJS库文件。...
Struts is a set of cooperating classes, servlets, and JSP tags that make up a reusable MVC 2 design. This definition implies that Struts is a framework, rather than a library, but Struts also contains...
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。 我用...
Java的高级特性包括异常处理、多线程、文件和输入输出流、网络编程、反射、泛型、集合、枚举、并发编程等内容。这些内容是Java语言的高级特性,可以帮助程序员提高程序的性能和稳定性,是实现复杂程序的关键。 Java...
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
例如,可以使用j2mepolish,请参考本人以前发表的文章《使用J2mePolish的build和preprocess功能》。本文主要讨论如何使用antenna来解决这个问题。 Antenna介绍 Ant ... by pandonix 2007-08-28 回复 (9) 用Ant 来...
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....