See below.
On Wed, 22 Aug 2001, Blanchard Andrew H (CPOCEUR) wrote:
> I'm trying to get OpenSymphony Sitemesh 1.2 running under Tomcat 4.0. I've
> tried beta 7 and dev beta 8. Anyway, I'm receiving the following exception:
>
> java.lang.IllegalStateException: Cannot create a session after the response
> has been committed
> at
> org.apache.catalina.connector.HttpRequestBase.doGetSession(HttpRequestBase.j
> ava:1104)
> at
> org.apache.catalina.connector.HttpRequestBase.getSession(HttpRequestBase.jav
> a:1064)
> at
> org.apache.catalina.connector.HttpRequestFacade.getSession(HttpRequestFacade
> .java:209)
> at
> org.apache.catalina.connector.HttpRequestFacade.getSession(HttpRequestFacade
> .java:218)
> at
> javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWr
> apper.java:268)
> at
> org.apache.jasper.runtime.PageContextImpl._initialize(PageContextImpl.java:1
> 38)
> at
> org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.java:11
> 4)
> at
> org.apache.jasper.runtime.JspFactoryImpl.internalGetPageContext(JspFactoryIm
> pl.java:175)
> at
> org.apache.jasper.runtime.JspFactoryImpl.getPageContext(JspFactoryImpl.java:
> 154)
> at
> org.apache.jsp._0002fdecorators_0002fmain_jsp._jspService(_0002fdecorators_0
> 002fmain_jsp.java:45)
> at
> org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
> org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.ja
> va:201)
> at
> org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:381)
> at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:458)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
> org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.
> java:672)
> at
> org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatch
> er.java:563)
> at
> org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher
> .java:486)
> at
> com.sitemesh.filter.PageFilter.applyDecorator(PageFilter.java:192)
> at com.sitemesh.filter.PageFilter.doFilter(PageFilter.java:114)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application
> FilterChain.java:213)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
> ain.java:193)
> at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.ja
> va:243)
> at
> org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
> 66)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
> va:215)
> at
> org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
> 66)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at
> org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2314)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164
> )
> at
> org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
> 66)
> at
> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
> at
> org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
> 64)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
> :163)
> at
> org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
> 66)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at
> org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:
> 1000)
> at
> org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1093
> )
> at java.lang.Thread.run(Thread.java:484)
>
> Opening up the Tomcat /work directory, I'm able to look at the servlet code
> generated by Tomcat from the JSP. (_0002fdecorators_0002fmain_jsp.java:45)
>
> <snip>
> (43) _jspxFactory = JspFactory.getDefaultFactory();
> (44) response.setContentType("text/html;charset=ISO-8859-1");
> (45) pageContext = _jspxFactory.getPageContext(this, request, response,"",
> true, 8192, true);
> </snip>
>
> I understand that once the response has been committed, you can't forward or
> redirect it. But what's going on here? Why is
> _jspxFactory.getPageContext(...) throwing this exception? This code is
> essentially right at the beginning of the servlet, before it even gets to
> JSP content. How do I tell Tomcat not to generate the setContentType(...)
> method until after the getPageContext(...) call? Or is the problem
> something completely different?
>
By default, JSP pages try to create a session unless you tell them not to
in the <%@ page %> directive. Thus, if you call a new page after the
response has been committed, this is exactly what is supposed to happen.
>From the stack trace, it looks like Sitemesh is using both filters and
request dispatchers, any of which could cause the response to be
committed.
> Thank you,
> Andy Blanchard
>
>
Craig