嚴重: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:610)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:188)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
at org.apache.jsp.pic_jsp._jspService(pic_jsp.java:88)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
問題分析:前臺程序可以正常運行,但是當查看流程進行到哪一步的時候,控制檯就報這個錯誤。
具體的原因就是在tomcat中jsp編譯成servlet之後在函數
_jspService(HttpServletRequest request, HttpServletResponse response)
的最後有一段這樣的代碼
finally {
- if (_jspxFactory != null) {
- _jspxFactory.releasePageContext(_jspx_page_context);
- }
if (_jspxFactory != null) {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
這裏是在釋放在jsp中使用的對象,會調用response.getWriter(),因爲這個方法是和
response.getOutputStream()相沖突的!所以會出現以上這個異常。
解決方法:
在使用完輸出流以後調用以下兩行代碼即可:
out.clear();
out = pageContext.pushBody();