测试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. Django 模板函数

    Django 模板函数 在模板中的函数是只需要函数名,不用加括号,自动执行 在前端中的函数 不用加括号,函数自动执行 前端 {% for item in userinfo.keys %} <h3 ...

  2. lua在linxu和windows系统下的遍历目录的方法

    在windows下遍历目录使用lfs库:例如遍历整个目录下的所有文件 local lfs = require "lfs" function findPathName(path)  ...

  3. 解决Windows 与Mac 双系统下的蓝牙设备共用的问题

    不知道有多少人和我一样用的蓝牙鼠标或者键盘,有的话应该都会遇到同一个问题:即在一个系统下配好对后在另一个系统必须重新配对才能使用,很是麻烦.还要将蓝牙设备进入发现模式,OS下搜索,连接....终于昨天 ...

  4. 20180901 JavaScript闭包和匿名函数自动调用

    引用: 1. JavaScript闭包_by runoob 2. JS中(function(){xxx})这么写是什么意思? (一)闭包是可以访问上一层函数作用域里变量的函数,即便上一层函数已经关闭. ...

  5. .pyc文件的结构体PyCodeObject

    python执行程序时生成的pyc文件里面是,PyCodeObject 的结构体构成,每个命名空间(函数名.import模块等)都会形成一个core block,一个python程序的所有命名空间生成 ...

  6. 【网络基础】【TCP/IP】IP的分级

    节选自 <鸟哥的linux私房菜>  http://cn.linux.vbird.org/linux_server/0110network_basic_3.php#ps12 InterNI ...

  7. 【laravel】Laravel 5 TokenMismatchException on PHP 5.6.9

    When I realized this was only happening in IE and Chrome, but not Firefox, it led me to the fix. The ...

  8. Python语言的简介

    ___________________________________________________________我是一条分割线__________________________________ ...

  9. OpenStack, kvm, qemu-kvm以及libvirt之关系

    OpenStack, kvm, qemu-kvm以及libvirt之关系: KVM是最底层的hypervisor,它是用来模拟CPU的运行,它缺少了对network和周边I/O的支持,所以我们是没法直 ...

  10. k短路模板

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