java.lang.IllegalStateException: getOutputStream() has already been called for this response 问题解决

我出现这种情况是在做一个下载功能的时候,下载成功就返回到某个页面,然后就出现这错误。

这是

 

原因一:

  下载功能时,如果需要返回,系统默认把文件内容写入到返回的地方,如果返回的地方没有正确接收,则会报错。不需要返回到某个页面的时候,如果要跳转,就跳转到另一个控制器然后再跳转到页面就不会报错。

原因二:
  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.


  以上说明也解释了为什么在往页面中写入图片的时候要使用如下循环格式
  OutputStream output=response.getOutputStream();
  while((len=in.read(b)) >0) {
    output.write(b,0,len); 
  }
output.flush();
而不是把response.getOutputStream().write()放到循环体内



posted @ 2015-12-10 09:09  吐槽村  阅读(4266)  评论(0编辑  收藏  举报