jsp实现文件下载,out = pageContext.pushBody();out.close();不用写到jsp中
测试jsp:
<%@ page contentType="text/html; charset=gbk" %>
<%
try{
com.enfo.intrust.web.DocumentFile file = new com.enfo.intrust.web.DocumentFile(pageContext);
String file_name = "d:/中国人.txt";
String name = "中国人.txt";
file.downloadFile(file_name,name);
}catch(Exception e){
throw new Exception(e.getMessage());
}
%>
调用的下载类:
package com.enfo.intrust.web; import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext; public class DocumentFile {
private PageContext pageContext;
public DocumentFile() {}
public DocumentFile(PageContext in_pageContext) {
try {
pageContext = in_pageContext;
} catch (Exception e) {
pageContext = null;
}
} private String Encode(String in) {
try {
return new String(in.getBytes("GBK"), "ISO-8859-1");
} catch (Exception e) {
return in;
}
} /**
* @param strFile 文件路径
* @param name 文件名,包含后缀
* */
public void downloadFile(String filePath, String fileName)throws Exception {
java.io.File file = new java.io.File(filePath);
if (!file.exists()) throw new Exception("file not exist");
/**
*取消JSP默认的输出流:javax.servlet.jsp.JspWriter
*/
JspWriter out = pageContext.getOut();
out.clear();
/**
* Websphere发布环境中,不能要下面这一行代码
* 主要是Weblogic或Websphere发布环境中问题,与tomcat不同
* 此处pushBody会将out引用一个新对象ContextBody的实例,ContextBody是JspWriter的子类
*/
//out = pageContext.pushBody(); /**
* response.getWriter()取得的是java.io.PrintWriter,输出以字符为单位;
* response.getOutputStream()取得的是javax.servlet.serlvetoutputstream,输出以字节为单位;
* 采用response的输出流:ServletOutputStream
* 从本地文件的输入流读取数据通过这个字节输出流输出
*/
HttpServletResponse response = (HttpServletResponse) (pageContext.getResponse());
response.reset();
response.setContentType("application/octet-stream");
response.addHeader("Content-disposition", Encode("attachment;filename=" + fileName));
DataInputStream dis = null;
OutputStream os = null;//jsp不用默认的out内置对象,而采用这个字节输出流
try {
dis = new DataInputStream(new FileInputStream(file));
os = response.getOutputStream();
byte[] buf = new byte[1024];
int curLen=0;
System.out.println("start to download:"+fileName);
while((curLen=dis.read(buf))>=0){
os.write(buf, 0, curLen);
os.flush();
}
System.out.println("download success");
} catch (Exception e) {
e.printStackTrace();
throw new Exception("download error");
} finally {
if(os != null)
os.close();
if(dis != null)
dis.close();
if(out != null)
{
//out.close();
/**
*jsp引擎中,在每个jsp结束后都会自动释放掉jsp所有内置对象,包括out;如果这里手动人为的把out这个jsp内置对象关闭了,
*后面jsp引擎释放它时就会报错提示Stream closed;
*但是在websphere发布环境中不会,应该是容器在释放对象前进行过判断,这里体现了websphere容器的容错性
*测试:在jsp中java代码区直接写一句:out.close();打开这个jsp,后台会直接报错;
*所以,不要在jsp中调用out.close()手动关闭jsp这个out内置对象;
* 除非:
* out = pageContext.pushBody();
* out.close();
* 这样不会报错,是因为:
* 一开始out=pageContext.getOut()得到的是jsp内置out对象,后来pushBody得到的是一个新的ContextBody对象,他们是二个对象
* ContextBody是JspWriter的子类;即:jsp内置out对象是父,pushbody得到的是子,
* 所以这里的out.close()其实不是close掉jsp的内置out对象,而是ContextBody的实例对象;
* 总结:为了在tomcat和websphere中的通用:
* 不要写out = pageContext.pushBody();也不要手动调用 out.close();
* */
}
}
} }
jsp实现文件下载,out = pageContext.pushBody();out.close();不用写到jsp中的更多相关文章
- 对“使用MyEclipse,写的jsp代码因有汉字而无法保存”问题的解决
使用MyEclipse编辑jsp时.有时会出现"使用MyEclipse,写的jsp代码因有汉字而无法保存"的现象,怎样解决呢? Window-->Preferences--& ...
- j2ee,jsp,servlet文件下载server端
1.getOutputStream() has already been called for this response 报错的原因: 使用tomcat容器调用response.getOutputS ...
- JSP内置对象——pageContext对象和config对象
它对应的常用方法有: 现在,我新建一个“pageContext.jsp”页面,可以获得“session_page1.jsp”这个页面中保存的用户名: pageContext.jap: session_ ...
- SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。
熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...
- JSP内置对象--pageContext对象(非常重要!!!)
pageContext对象是javax.servlet.jsp.PageContext类的实例,只要表示的是一个jsp页面的上下文,而且功能强大,几乎可以操作各种内置对象. >forward(S ...
- jsp内置对象-pageContext对象
1.概念:pageContext对象能够获取JSP页面中的request.response.session.application等其他内置对象.pageContext对象的创建和初始化由容器完成,可 ...
- Weblogic环境(JSP)文件下载问题(下载的文件与原文件大小不一致问题)
最近发现一个问题有个download.jsp文件下载jsp在Tomcat下正常,在Weblogic下不太正常! Weblogic下载的文件比原文件大两个字节,查看文件像是文件内容最后多了空行 检查do ...
- jsp里面不能使用${pageContext.request.contextPath}解决方案
1.在jsp中使用${pageContext.request.contextPath}获取相对路径,可是最后路径变为:http://localhost:8080/oneself/$%7BpageCon ...
- jsp内置对象pageContext如何在Servlet中获取值
pageContext javax.servlet.jsp.PageContext 的实例,该对象代表该JSP 页面上下文,使用该对象可以访问页面中的共享数据.常用的方法有getServletCont ...
随机推荐
- 使用EventLog组件向本机现有日志中添加条目
实现效果: 知识运用: EventLog组件的MachineName属性 //获取或设置在其上读取或写入事件的计算机名称 public string MachineName {get;set; } ...
- 第三章 DOM的基本
节点分为不同的类型:元素节点.属性节点和文本节点 getElementById()方法 这个方法将返回一个与那个有着给定id属性值的元素节点相对应的对象.注意大小写.该方法只有一个参数.这个参数也就是 ...
- 前缀树,trie树
前缀树: 假设一个字符串数组,“abcd”,"bcd","gef" , 构建一颗树,字母是在路径上,节点上最基本的存储的信息包括: 以这个节点结尾的 字符串的数 ...
- javaweb基础(12)_session详解
一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...
- ES6学习总结 (二)
一:ES6为函数做了哪些扩展 参数的默认值 传统写法: function person(n,a){ var name =n || "zhangsan"; var age = a | ...
- MATLAB编程技巧
[摘要] MATLAB是一种科学计算语言,和C.Fortran等高级语言相类似,能方便的实现程序控制.以下介绍一点matlab编程的技巧. 嵌套计算 程序执行的速度取决于调用的子程序的个数和算法实现. ...
- 【Git版本控制】git将单个文件回退到某一版本
暂定此文件为a.jsp 1.进入到a.jsp所在目录,通过 git log a.jsp查看a.jsp的更改记录 2.找到想要回退的版本号:例如 fcd2093 通过 git reset fcd2 ...
- C#基础-数组-ArrayList
数组ArrayList using System.Collections; //表示引入集合的命名空间 数组ArrayList容量本身是不固定的,根据存储的数据动态变化 // 声明一个ArrayLis ...
- 利用wget 和 curl 监控网站是否正常
监控网站URL是否正常最常见的方法莫过于wget和curl命令了,这两个命令都是非常强大,参数也非常多,下面列举几个常用的参数. wget 常用命令参数:--spider ...
- 使用GD库做图片水印
png图片作为水印加到其他类型图片后,背景变黑色 原因: imagecopy函数拷贝时可以保留png图像的原透明信息,而imagecopymerge却不支持图片的本身的透明拷贝. 然后直接上代码: / ...