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

猜你喜欢

转载自blog.csdn.net/qq_36443497/article/details/79014298
今日推荐