测试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();* */}}}}

转载于:https://www.cnblogs.com/tapt/p/10119446.html

jsp实现文件下载,out = pageContext.pushBody();out.close();不用写到jsp中相关推荐

  1. JSP实现文件下载功能

    JSP实现文件下载功能 package top.canghe.downloadDemo;import java.io.FileInputStream; import java.io.IOExcepti ...

  2. 你写的JSP就是JSP么?

    以前 Java Web是使用Java语言进行web系统开发,以前一般情况下我们写好的Java代码都要打包诚war包,然后放入到Tomcat容器下,启动Tomcat.系统会自动进行解压. 注意:前端收到 ...

  3. javaweb——jsp(jsp的本质是什么、jsp九大内置对象、四个域对象、jsp的主要作用)

    1.什么是jsp,它有什么用? jsp的全称是java server pages.Java 的服务器页面. jsp的主要作用是代替Servlet 程序回传html页面的数据. 因为Servlet 程序 ...

  4. 解决Jsp运行org.apache.jasper.JasperException: Unable to compile class for JSP:问题

    解决Jsp运行org.apache.jasper.JasperException: Unable to compile class for JSP:问题 参考文章: (1)解决Jsp运行org.apa ...

  5. myeclipse运行jsp文件_【新书连载12】软件测试专项技术—JSP

    3.2 JSP3.2.1  JSP简介JSP与PHP.ASP.ASP.NET等语言类似,是运行在服务器端的语言.JSP是一种跨平台的动态网页技术标准,由Sun Microsystems公司倡导.多家公 ...

  6. 手把手做一个JSP入门程序(二):创建一个项目(JSP)

    创建一个项目 我们使用Eclipse和Web服务器的Tomcat进行开发.Eclipse我们需要用"Eclipse IDE for Java EE Developers"(Ecli ...

  7. 手把手做一个JSP入门程序(一):程序基本介绍(JSP)

    胡扯   说好的不学jsp,结果今天还是学了.主要还是为了后面的java后台的学习啦.为了更好的掌握知识,那我们就来写一个简单的jsp入门程序吧!这只是一个简单的入门小程序,所以就没有太多强大的功能. ...

  8. Jsp和Javascript读写cookie,cookie的path设置,jsp解码cookie值

    cookie的基础知识就不介绍了,自己去百度. 一.jsp读写cookie jsp写cookie的代码如下: Cookie cookie1 = new Cookie("historyCity ...

  9. javaweb JSP JAVA 新闻发布系统源码(新闻管理系统)jsp新闻发布系统

    javaweb JSP JAVA 新闻发布系统源码(新闻管理系统)jsp新闻发布系统 常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情数据查看,在线招标房,屋租赁,教务管理 ...

  10. 在线jsp版泰囧表情的生成器代码,不用PS也能恶搞。

    转载请注明出处:在线jsp版泰囧表情的生成器代码,不用PS也能恶搞. 代码下载地址:http://www.zuidaima.com/share/1687663042939904.htm 以前分享过ja ...

最新文章

  1. Jprofiler注册码
  2. Java注释@interface的用法
  3. 一个IT人的非典型职场十年 (5)
  4. java流式传输对象_使用Java 8在地图上流式传输
  5. Java跳出多重循环
  6. Spring Boot 搭建应用实现登陆实例,页面使用bootstrap
  7. Objective C学习总结(二)
  8. 一道NP中的EIGRP拓扑表的题
  9. 双侧检验的p值和单侧检验_【单侧检验和双侧检验的区别】_怎么检验_如何检验-大众养生网...
  10. 【Linux】grep命令
  11. 30天敏捷生活(7):生成行动计划
  12. 数学建模可以用python吗_Python中常用的数学建模Scipy
  13. linux TP 阿帕奇 数据库 php的安装
  14. Eclipse主题切换
  15. 利润表模板excel_Excel 最新财务报表分析模板(资产负债表、利润表、现金流量表…)...
  16. 计算机主机有自带的声音吗,台式电脑主机前面的插孔没声音怎么回事?如何解决?...
  17. 出售时间的网站(跟王利芬创建的优米网其中一种模式一样)
  18. Springboot查看MANIFEST.MF信息
  19. 从零开始系统化学Android,手慢无
  20. 自己写一个微型数据库_“最国际化的微型机构:”两名伦敦训练营的毕业生如何建造了一个远程…...

热门文章

  1. 做网赚赚不到钱,你的方法用对了么?
  2. [无忧网络验证]代理使用教程
  3. JPA(hibernate)一对多根据多的一方某属性进行过滤查询
  4. Android应用 中英文切换
  5. linuxdeployqt ldd ERROR: ldd outputLine: .../libQt5Core.so.5: version `Qt_5' not found (required by
  6. 达梦8用户和角色管理
  7. Sony如何启动微型计算机,索尼vaio笔记本怎么进bios设置|索尼笔记本进bios按什么键-...
  8. android模拟器pc版 安装软件,不用花钱,电脑端Android模拟器安装使用教程
  9. 反馈电路反馈类型的快速判断
  10. 心上莲花:佛教简介(上)