• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JSP > tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

作者:柳暗花明 字体:[增加 减小] 来源:互联网 时间:2017-05-11

柳暗花明通过本文主要向大家介绍了tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

1.在tomcat6.0下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

  在tomcat6.0下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好的原因。

  具体的原因就是:
  在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后有一段这样的代码

    if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}</div>

  这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和response.getOutputStream()相冲突的!所以会出现以上这个异常。

  然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那样--将jsp内的所有空格和回车符号所有都删除掉),在使用完输出流以后调用以下两行代码即可:

out = pageContext.pushBody();</div>

  最后这里是一个输出彩色验证码例子(这样的例子几乎随处可见)

imag.jsp

<%@ page import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%@ page import="java.io.OutputStream" %>
<%!
  Color getRandColor(int fc,int bc){
    Random random = new Random();
    if(fc>255) fc=255;
    if(bc>255) bc=255;
    int r=fc+random.nextInt(bc-fc);
    int g=fc+random.nextInt(bc-fc);
    int b=fc+random.nextInt(bc-fc);
    return new Color(r,g,b);
  }
 %>
<%
  try{
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0);
    int width=60, height=20;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    OutputStream os=response.getOutputStream();
    Graphics g = image.getGraphics();
    Random random = new Random();
    g.setColor(getRandColor(200,250));
    g.fillRect(0, 0, width, height);

    g.setFont(new Font("Times New Roman",Font.PLAIN,18));
    g.setColor(getRandColor(160,200));
    for (int i=0;i<155;i++){
      int x = random.nextInt(width);
      int y = random.nextInt(height);
      int xl = random.nextInt(12);
      int yl = random.nextInt(12);
      g.drawLine(x,y,x+xl,y+yl);
     }
    String sRand="";
    for (int j=0;j<4;j++){
      String rand=String.valueOf(random.nextInt(10));
      sRand+=rand;
      g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
      g.drawString(rand,13*j+6,16);
    }
    session.setAttribute("rand",sRand);
    g.dispose();

    ImageIO.write(image, "JPEG",os);
    os.flush();
    os.close();
    os=null;
    response.flushBuffer();
    out.clear();
    out = pageContext.pushBody();
  }catch(IllegalStateException e){
      System.out.println(e.getMessage());
    e.printStackTrace();
  }
%>

</div>

  如有不足之处,欢迎斧正!

2.getOutputStream() has already been called for this response问题的解决

  在jsp向页面输出图片的时候,使用response.getOutputStream()会有这样的提示:java.lang.IllegalStateException:getOutputStream() has already been called for this response,会抛出Exception

  原因一:
  JSP默认的输出流为PrintWriter ,即<% %>以外的东西所默认的输出方式,如果你尝试在JSP中使用ServletOutputStream就会引起错误.要嘛直接改用Servlet输出(复写service方法),要嘛删除除%><%中的任何东西(包括HTML标签,空格,回车等东西)应该就可以。对于这样的情况应该这样来解决,删除%><%之间的所有内容包括空格和换行符,最后也要消除空格和换行符,最好再加上一句response.reset()。

  原因二: 

  在J2EE的API参考里有这么个:

  ServletResponse的getWriter()方法里会抛出这个异常:

    IllegalStateException - if the getOutputStream method has already been called for this response object

  而它的getOutputStream()方法里会抛出这个异常:

    IllegalStateException - if the getOutputStream method has already been called for this response object

  并且两者的函数申明里都有这么样的一句

    Either this method or getOutputStream() may be called to write the body, not both.
    Either this method or getWriter() may be called to write the body, not both.


  以上说明也解释了为什么在往页面中写入图片的时候要使用如下循环格式

while((len=in.read(b)) >0) {
  output.write(b,0,len);
}
output.flush();</div>
而不是把response.getOutputStream().write()放到循环体内

在页面中直接写:
<h1>
<%
    response.getOutputStream();
%>
</h1>
</body></div>

将会出现错误消息如下:

java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.catalina.connector.Response.getWriter(Response.java:604)
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)

以上就是tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法的全部内容,希望能给大家一个参考,也希望大家多多支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-11JSP中用回车监听按钮事件兼容火狐 IE等主流浏览器
  • 2017-05-11java struts常见错误以及原因分析
  • 2017-05-11jsp计数器制作手册
  • 2017-05-11jsp基于XML实现用户登录与注册的实例解析(附源码)
  • 2017-05-11FCKeditor使用方法(FCKeditor_2.6.3)详细使用说明第1/2页
  • 2017-05-11如何使用JSP+MySQL创建留言本(二)
  • 2017-05-11java操作mysql入门代码实例(含插入、更新和查询)
  • 2017-05-11JSP中正则表达式用法实例
  • 2017-05-11jsp中session过期设置及web.xml配置学习
  • 2017-05-11Resin在Windows系统下的安装

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 通过过滤器(Filter)解决JSP的Post和Request中文乱码问题
    • jsp简单自定义标签的forEach遍历及转义字符示例
    • Java源码分析:深入探讨Iterator模式
    • 搭建Eclipse+MyEclipse开发环境
    • 页面自动刷新,不用按回车键来提交数据!
    • JSP安全性初探
    • JSP中EL表达式的用法详解(必看篇)
    • jsp计数器制作手册
    • JSP加载JS文件不起作用的有效解决方法
    • Java输出系统当前的日期(年月日时分秒毫秒)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有