测试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. s///|s()()i|/i|/g|\U|\u|\L|\l|\U\l|split|join|匹配到hash|匹配到变量|`date`|$^I

    #!/usr/bin/perl -w use strict; use warnings; $_='She is a good girl and likes helping others '; s/sh ...

  2. JavaScript Dom编程艺术(1)

    Dom是一种可以供多种环境和多种程序设计语言使用的API: 一份文档就是一个节点树: 节电分为不同的类型:元素节点,属性节点,文档节点,元素节点分为属性节点和文档节点: getelementbyid( ...

  3. destoon 后台管理左侧新增菜单项

    destoon 后台菜单设置在对应模块的admin/menu.inc.php 例如要在后台会员管理里增加会员承包和股东管理 $menu = array( array('添加会员', '?modulei ...

  4. PTA 银行排队问题之单队列多窗口加VIP服务 队列+模拟

    假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假设顾客总是选择编号最小的窗口. 有些银行会给 ...

  5. UVA - 11054 Wine trading in Gergovia 扫描法

    题目:点击打开题目链接 思路:考虑第一个村庄,如果第一个村庄需要买酒,那么a1>0,那么一定有劳动力从第二个村庄向第一个村庄搬酒,这些酒可能是第二个村庄生产的,也可能是从其他村庄搬过来的,但这一 ...

  6. (手写)mybatis 核心配置文件和接口不在同一包下的解决方案

    smart-sh-mybatis项目 app.xml文件中此处配置为: <!-- 从整合包里找,org.mybatis:mybatis-spring:1.2.4 --> <!-- s ...

  7. Leetcode31--->Next Permutation(数字的下一个排列)

    题目: 给定一个整数,存放在数组中,求出该整数的下一个排列(字典顺序):要求原地置换,且不能分配额外的内存 举例: 1,2,3 → 1,3,2:  3,2,1 → 1,2,3:  1,1,5 → 1, ...

  8. spark作业

    假定用户有某个周末网民网购停留时间的日志文本,基于某些业务要求,要求开发 Spark应用程序实现如下功能: 1.实时统计连续网购时间超过半个小时的女性网民信息. 2.周末两天的日志文件第一列为姓名,第 ...

  9. python + selenium - 自动化环境搭建

    1. 安装python (1)下载地址:https://www.python.org/downloads/windows/ (2)安装方式:默认安装即可 (3)环境变量配置:打开[系统属性]-[环境变 ...

  10. datatable 修改点击列头进行排序顺序

    一般点击排序时,是先升序后降序 可以通过如下代码修改排序规则 jQuery(function ($) { $(".datatable").dataTable({ "pag ...