2013-03-25 91 views
2

当我尝试在EXCEL中保存JSP数据时,我从Tomcat服务器获取IllegalStateException。 IllegalStateException可能出现以下任何一种情况:IllegalStateException的原因

  • 如果在sendRedirect()之后没有返回语句。
  • 如果POST大小大于2MB。
  • 如果页面缓冲区大小较小。

除此之外,是否有任何原因导致IllegalStateException

我的代码:

response.sendRedirect(response.encodeRedirectURL(request.getRequestURI() + "?saveToFile=true&action=" + ReportsManager.ACTION_SAVE_AS_XLS + "&saveFileName=" + saveFileName + "&returnPage=" + StringFunctions.encodeUrlParameter(returnPage)));  
return; 

我越来越IllegalStateException在的sendRedirect()。

另外,如果在JSP中只有很少的记录(比如100行),那么在保存为Excel时不会出错。如果有1000条记录,那么我得到IllegalStateException

堆栈跟踪:

*Mar 25, 2013 6:57:26 AM,JSP Runtime Error,0,java.lang.IllegalStateException 
     at org.apache.coyote.tomcat5.CoyoteResponseFacade.sendRedirect(CoyoteResponseFacade.java:352) 
     at org.apache.jsp.OperationalReports.SalespersonSales_jsp._jspService(SalespersonSales_jsp.java:2567) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) 
     at com.retailJava.core.filters.SecurityFilter.doFilter(SecurityFilter.java:136) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) 
     at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) 
     at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) 
     at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) 
     at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) 
     at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) 
     at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) 
     at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705) 
     at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577) 
     at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) 
     at java.lang.Thread.run(Thread.java:595) 

如果我设置页面缓冲区的大小,那么它worlks罚款1000条记录。但是,如果它达到2000条记录,那么我再次遇到问题。

<%@ page buffer = "2048kb" autoFlush = "true" %> 
+0

可能性是无限的。 http://docs.oracle.com/javase/6/docs/api/java/lang/IllegalStateException.html – greenkode 2013-03-25 06:40:50

+0

为什么你不显示相关的代码?它可能会帮助更多。 – 2013-03-25 06:47:31

+0

添加了我的代码,这会导致问题。 – 2013-03-25 06:51:14

回答

3

Documentation状态:

的sendRedirect抛出:IllegalStateException - 如果此响应已被提交

由于禁用maxPostSize并不能解决问题(根据OP的评论),似乎在更早的时候,响应是beeing commited。

您可以通过检查isCommited标志来验证。

+1

有没有办法解决这个问题?从Tomcat配置文档中,我得到了以下建议:我们可以在Tomcat的server.xml“maxPostSize”中添加以下属性。默认情况下,它将被设置为2MB。通过将其设置为0,我们可以禁用大小检查。但这似乎并没有解决问题。 – 2013-03-25 07:07:43

+2

Gotcha。多谢,伙计。正如你所说的,如果有大量数据,响应会被提交。 :)需要验证为什么它得到comitted。 – 2013-03-25 08:24:15

2

如果调用两次 “response.sendRedirect是()” 方法, 或URL是错误的URL,这个错误可能会导致