getOutputStream() has already been called for this response异常

来源:互联网 发布:windows curl post 编辑:程序博客网 时间:2024/05/16 17:14

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

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

     一般都是在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();

 

1 0
原创粉丝点击