getOutputStream() has already been called for this response

刚刚研究项目的时候,遇到这个错误。搜了很多资料并自己研究了好久终于算是基本解决了这个问题,在这里记录一下。

出现错误的原因,说出来很简单:

     一般都是在JSP中调用了:response.getOutputStream();来获取输出流。并且有意或者无意的使用了out对象来输出内容。

 

异常的显式原因(自身代码原因):

1、我们都知道,JSP最终会被翻译为一个Java类(Servlet),然后在页面中的所有HTML内容,都是在这个Servlet中的_jspService()方法里面被输出的。

输出的方式是out.write("****");

 

2、又因为JSP页面中你所有写的不加"<%%>"这两个括号的内容都会被自动翻译为out.write("****");

    1、不加"<%%>"是包括"<%%>"、"<%@%>"、"<%!%>"的内容。

    2、out是JspWriter,字符输出流。输出的内容包括全部的HTML,以及你无意中会写的回车+换行

 

3、问题出现了:如果你调用了response.getOutputStream()来获取输出流,又无意中out输出了("\r\n")(当然,你自己显示调用out更不行了)就会出现错误。

错误就是getOutputStream() has already been called for this response。

 

异常的真实原因(java设计使然):

jsp中的out对象,在jsp中是通过这句代码获得的:pageContext.getOut();

    1、经过我研究发现:如果你并没有在JSP中写需要write的内容(write方法没有被掉用过),似乎out对象根本就没有被创建。

    2、一旦JSP中使用了out.write(),那么pageContext.getOut()就真正的返回了一个JspWriter对象。

    3、这样就不知道在哪最终调用了ServletResponse.getWriter();

    4、又因为你之前调用了response.getOutputStream();

    5、这样最终触发了3和4方法中相同的异常。

        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.

 

解决方法:

1、无意中使用了out对象的情况:

仔细查找页面中的代码,删除%><%之间的所有内容包括空格和换行符。不能出现所有非Java代码的内容。

 

2、确实需要使用out对象也要使用getOutputStream的情况:

在JSP页面Java代码块的最后加上:out.clear();

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值