JSP中出现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(“**“);

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

以及你无意中会写的回车+换行。

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();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值