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 ...
随机推荐
- 用Windows Native API枚举所有句柄及查找文件句柄对应文件名的方法
枚举所有句柄的方法 由于windows并没有给出枚举所有句柄所用到的API,和进程所拥有的句柄相关的只有GetProcessHandleCount这个函数,然而这个函数只能获取到和进程相关的句柄数,不 ...
- 二十一、C++中的临时对象
思考: 构造函数是一个特殊的函数 是否可以直接调用? 是否可以在构造函数中调用构造函数? 直接调用构造函数的行为是什么? 答: 直接调用构造函数将产生一个临时对象 临时对象的生命周期只有一条语句的时间 ...
- 【android】安卓开发apk列表
- 谷歌的Zxing框架的扫码软件 (目前国内的应用商店很少此种类型的扫码app) - 解析IP地址功能,从IP地址(子网掩码)自动解析出网段,广播地址
- Python 简单购物程序
# Author:Eric Zhao# -*- coding:utf-8 -*-'''需求:启动程序后,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够,够就 ...
- jquery中arrt()和prop()的区别
在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参数和用法也几乎完全相同. 但不得不说的是,这两个函数的用处却并不相同.下面我们来详细介绍这两个函数之间的区别. ...
- CF 510b Fox And Two Dots
Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on ...
- 【Beta】Scrum meeting 2
第一天:2019/6/25 前言: 第1次会议在6月日25由PM在教10-101召开. 明确所有任务要求,根据每个人的特长和项目需求分发任务,并明确项目前进方向.时长50min. 本日任务完成情况 成 ...
- dedecms 标签
article文章页标签 文档工具:http://tools.dedecms.com/dedetag_maker/article.html {dede:field.title/} 文章标题 {dede ...
- Leetcode24--->Swap Nodes in Pairs(交换单链表中相邻的两个节点)
题目:给定一个单链表,交换两个相邻的节点,且返回交换之后的头节点 举例: Given 1->2->3->4, you should return the list as 2-> ...
- JAVA-字符串按指定长度换行
可能有汉字的字符串按指定长度换行. public String getStringByEnter(int length, String string) throws Exception { for ( ...