java.lang.IllegalStateException错误原因以及解决方法
来源:互联网 发布:桌子高度 知乎 编辑:程序博客网 时间:2024/06/06 04:35
Servlet.service() for servlet default threw exceptionjava.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407) at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:725) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:483) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at filters.TomcatFormFilter_UTF8.doFilter(TomcatFormFilter_UTF8.java:79) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
错误原因
该异常表示,当前对客户端的响应已经结束,不能在响应已经结束(或说消亡)后再向客户端(实际上是缓冲区)输出任何内容。
这是web容器生成的servlet代码中有out.write(””),这个和JSP中调用的response.getOutputStream()产生冲突.即Servlet规范说明,不能既调用 response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出 IllegalStateException,因为在jsp中,out变量是通过response.getWriter得到的,在程序中既用了response.getOutputStream,又用了out变量,故出现以上错误.
具体分析
首先解释下flush(),我们知道在使用读写流的时候数据先被读入内存这个缓冲区中,然后再写入文件,但是当数据读完时不代表数据已经写入文件完毕,因为可能还有一部分仍未写入文件而留在内存中,这时调用flush()方法就会把缓冲区的数据强行清空输出,因此flush()的作用就是保证缓存清空输出。 response是服务端对客户端请求的一个响应,其中封装了响应头、状态码、内容等,服务端在把response提交到客户端之前,会向缓冲区内写入响应头和状态码,然后将所有内容flush。这就标志着该次响应已经committed(提交)。对于当前页面中 已经committed(提交)的response,就不能再使用这个response向缓冲区写任何东西(注:同一个页面中的response.XXX()是同一个response的不同方法,只要其中一个
已经导致了committed,那么其它类似方式的调用都会导致 IllegalStateException异常)。
【注意】能够导致响应已经committed的操作包括:forward, redirect, flushBuffer。
JDK API:
flushBuffer public void flushBuffer()throws IOExceptionForces any content in the buffer to be written to the client. A call to this method automatically commits the response, meaning the status code and headers will be written.
sendRedirect public void sendRedirect(String location)throws IOExceptionSends a temporary redirect response to the client using the specified redirect location URL. This method can accept relative URLs; the servlet container must convert the relative URL to an absolute URL before sending the response to the client. If the location is relative without a leading '/' the container interprets it as relative to the current request URI. If the location is relative with a leading '/' the container interprets it as relative to the servlet container root.If the response has already been committed, this method throws an IllegalStateException. After using this method, the response should be considered to be committed and should not be written to.
forwardpublic void forward(ServletRequest request,ServletResponse response) throws ServletException,IOExceptionForwards a request from a servlet to another resource (servlet, JSP file, or HTML file) on the server. This method allows one servlet to do preliminary processing of a request and another resource to generate the response.For a RequestDispatcher obtained via getRequestDispatcher(), the ServletRequest object has its path elements and parameters adjusted to match the path of the target resource.forward should be called before the response has been committed to the client (before response body output has been flushed). If the response already has been committed, this method throws an IllegalStateException. Uncommitted output in the response buffer is automatically cleared before the forward.The request and response parameters must be either the same objects as were passed to the calling servlet's service method or be subclasses of the ServletRequestWrapper or ServletResponseWrapper classes that wrap them.
注:
在一次响应commit之前,所有的内容输出都将写入servlet引擎的缓冲区(tomcat或weblogic的内容空间), 而在commit之后,上一次response向缓冲区写入的内容,将清空。
由于servlet在没有设置单线程的情况下(使用Single-Threaded Model,servlet实现 SingleThreadModel接口,jsp使用<%@ page isThreadSafe="false" %>),是多线程的,所以
上面所说的缓冲区,都将是该response所属的线程私有的内存空间。有了这个概念,将可以分析碰到的关于servlet多线程的很多问题。如果不能确认response是否已经committed. 可以调用response.isCommitted()来判断。导致这个错误最普遍的原因是,jsp有编译错误。
解决:
法一:在JSP文件中,加入下面两句
<%out.clear();out = pageContext.pushBody();%>
其中out,pageContext均为jsp内置对象!
很多开发项目并不是JSP前端,如freemarker,velocity等
造成问题的"response.getOutputStream()"并未被写在JSP里,而是写在servlet/action里.
法二: 在struts2的action中,不要return 回具体的result文件,而是return null
//return SUCCESS; return null;
- java.lang.IllegalStateException错误原因以及解决方法
- java.lang.IllegalStateException 错误原因及解决方法小记
- android TimerTask 的简单应用,以及java.lang.IllegalStateException: TimerTask is scheduled already错误的解决方法
- android TimerTask 的简单应用,以及java.lang.IllegalStateException: TimerTask is scheduled already错误的解决方法
- android TimerTask 的简单应用,以及java.lang.IllegalStateException: TimerTask is scheduled already错误的解决方法
- java.lang.IllegalStateException异常:原因分析和解决方法
- 错误 java.lang.IllegalStateException: TimerTask is scheduled already错误的解决方法
- 举例说明android中出现java.lang.IllegalStateException: database not open这种错误的原因及解决办法
- android Java.lang.IllegalStateException: No activity 解决方法
- 出现 java.lang.UnsupportedClassVersionError 错误的原因及解决方法
- 出现 java.lang.NoSuchMethodError 错误的原因及解决方法
- 出现 java.lang.UnsupportedClassVersionError 错误的原因及解决方法
- 访问tomcat出现java.lang.IllegalStateException: No output folder错误解决方法
- androidの异常:java.lang.IllegalStateException: ImageLoader must be init with configuration befor 错误解决方法
- 访问tomcat出现java.lang.IllegalStateException No output folder错误解决方法
- 访问tomcat出现java.lang.IllegalStateException No output folder错误解决方法
- java.lang.IllegalStateException: No match found错误
- java.lang.IllegalStateException: STREAM错误的理解
- 视频宽高比 PAR DAR SAR 详解
- [Python]解析.ini 文件出错ConfigParser.MissingSectionHeaderError: File contains no section headers.
- URI和URL的区别
- SOCKET 网络编程(1) TCP部分
- <java> <JTable> 关于设置JTable导入数据后自动排序-小记
- java.lang.IllegalStateException错误原因以及解决方法
- 使用JavaService生成windows服务
- JAVA的网络编程【转】
- iPhone 的.m文件解释
- 银行神秘顾客调查的内容-监测对象
- paip.Log4j配置不起作用的解决
- html5 语义标签理解 整理2 [
- samb服务器配置
- 希尔排序java-对比插入排序