测试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中的更多相关文章

  1. 对“使用MyEclipse,写的jsp代码因有汉字而无法保存”问题的解决

    使用MyEclipse编辑jsp时.有时会出现"使用MyEclipse,写的jsp代码因有汉字而无法保存"的现象,怎样解决呢? Window-->Preferences--& ...

  2. j2ee,jsp,servlet文件下载server端

    1.getOutputStream() has already been called for this response 报错的原因: 使用tomcat容器调用response.getOutputS ...

  3. JSP内置对象——pageContext对象和config对象

    它对应的常用方法有: 现在,我新建一个“pageContext.jsp”页面,可以获得“session_page1.jsp”这个页面中保存的用户名: pageContext.jap: session_ ...

  4. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  5. JSP内置对象--pageContext对象(非常重要!!!)

    pageContext对象是javax.servlet.jsp.PageContext类的实例,只要表示的是一个jsp页面的上下文,而且功能强大,几乎可以操作各种内置对象. >forward(S ...

  6. jsp内置对象-pageContext对象

    1.概念:pageContext对象能够获取JSP页面中的request.response.session.application等其他内置对象.pageContext对象的创建和初始化由容器完成,可 ...

  7. Weblogic环境(JSP)文件下载问题(下载的文件与原文件大小不一致问题)

    最近发现一个问题有个download.jsp文件下载jsp在Tomcat下正常,在Weblogic下不太正常! Weblogic下载的文件比原文件大两个字节,查看文件像是文件内容最后多了空行 检查do ...

  8. jsp里面不能使用${pageContext.request.contextPath}解决方案

    1.在jsp中使用${pageContext.request.contextPath}获取相对路径,可是最后路径变为:http://localhost:8080/oneself/$%7BpageCon ...

  9. jsp内置对象pageContext如何在Servlet中获取值

    pageContext javax.servlet.jsp.PageContext 的实例,该对象代表该JSP 页面上下文,使用该对象可以访问页面中的共享数据.常用的方法有getServletCont ...

随机推荐

  1. VA助手添加扩展文件后缀名

    Allow C/C++ files with a non-standard extension Follow these steps to make Visual Assist consider as ...

  2. 查询linux文件的MD5值

    Linux下查询文件的MD5值:md5sum xxx.iso.md5 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5全称是报文摘要算法(Message-Digest Algor ...

  3. JS Math方法、逻辑

    Math.PI; // 返回 3.141592653589793 Math.round(x) 的返回值是 x 四舍五入为最接近的整数. Math.pow(x, y) 的返回值是 x 的 y 次幂. M ...

  4. Python SciPy Sparse模块学习笔记

    1. sparse模块的官方document地址:http://docs.scipy.org/doc/scipy/reference/sparse.html   2. sparse matrix的存储 ...

  5. Linux curl命令中,HTTP 302处理

    在Linux中使用curl命令时,偶尔会遇到一些URL跳转到新的URL,即HTTP中的3XX(redirection,重定向 ). $curl -s -I $URL > log 这时在返回的报文 ...

  6. 洛谷 P5016 龙虎斗

    输入兵营总数.兵营人数.以m分界. 然后输入s1个兵到了p1兵营. 最终我们要求的是把s2个兵放到哪个兵营使龙虎双方气势差距最小. 第一要把每个兵营的气势算出来,并且加到它所属的阵营里(<m是龙 ...

  7. 【模板】有旋Treap

    如题,这是一个模板... #include <algorithm> #include <iostream> #include <cstring> #include ...

  8. python3.6 取整除法

    python3.6 中取整除法运算逻辑如下: d 非零,那么商 q 满足这样的关系: a = qd + r ,且0 ≤ r n1=7//3 #7 = 3*2 +1 n2=-6.1//3 #-7 = 3 ...

  9. k短路模板

    https://acm.taifua.com/archives/jsk31445.html 链接: https://nanti.jisuanke.com/t/31445 #include <io ...

  10. poj 1979 走多少个‘ . '问题 dfs算法

    题意:给你一个迷宫地图,让你走.问最多可以走多少个“." 思路:dfs 找到起点,然后对起点进行dfs操作. dfs操作时,要把当前的位置标志成"#"表示已经走过,然后进 ...