问题:
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:538) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:424) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
分析:
出现该问题最根本的原因是在Servlet中使用了两种输出机制
jsp默认是JspWriter流,而你可能在程序中启用了另外一个输入/输出流,比如说文件下载的时候
首先你要知道pushBody()的作用是保存当前的out对象,并更新PageContext中Page范围内Out对象。至于为什么要加上这句话,是因为JSP容器在处理完成请求后会调用releasePageConter方法释放所有的PageContestObject,并且同时调用getWriter方法。由于getWriter方法与在JSP页面中使用流相关的getOutputStream方法冲突,所以会造成这种异常
解决:
在操作流文件的jsp文件最后增加
out.clear();
out=pageContext.pushBody();