You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Karen Lease <kl...@vftis.com> on 2000/05/10 17:34:27 UTC
BUG? Include from JSP and
Hi everybody,
I believe I have found a bug in the 3.1 release version of Tomcat, but
the buglist page refuses any access, so I will discuss it here.
Here is what happens.
I have an error-page specified in my web.xml. It's working fine, if the
error is generated directly by a servlet. However when I force an error
in a servlet which is included from a jsp page, I get back the stack
trace shown below. My JSP has already generated some output before
calling the servlet, so the response is committed. What I found strange
was that the "root cause" was NullPointerException. My error page is
not even being reached, and the exception was coming from
tomcat.core.ContextManager.handleError(). The reason is that in this
method, in the case of handling an error page for an Exception, the
code calls reset() on the Response before looking to see if the
response was committed. This causes the IllegalStateException, which
gets caught. But then the method "falls through" to the default error
page handling, except that errorServlet is still null. So when it tries
to pass off to that, it generates the NullPointerException which I was
getting. I included the code below, with the fixes I made to stop it
from doing that.
I just looked at the latest version of ContextManager.java from CVS
(1.78), which has a lot of new stuff, including some restructured error
handling code. I believe it will no longer generate the
IllegalStateException because the reset is gone. But if there is some
other exception generated by the error page itself, it will still fall
through with a null errorServlet reference.
Note: the relevant code is now in the method: "private void
callInternalError( )"
--------------------------------------------------------------------
-------------------------------------------
STACK TRACE in my browser window
--------------------------------------------------------------------
-------------------------------------------
Included servlet error: 500
Location: /<myjsp>
Internal Servlet Error:
javax.servlet.ServletException
at
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageCo
ntextImpl.java:386)
at
jsp._0002fjsp_0002fSearchResult_0002ejspSearchResult_jsp_0._jspServi
ce(_0002fjsp_0002fSearchResult_0002ejspSearchResult_jsp_0.java:79)
at
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:126)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.jasper.runtime.JspServlet$JspServletWrapper.service(JspSe
rvlet.java:174)
at
org.apache.jasper.runtime.JspServlet.serviceJspFile(JspServlet.java:
261)
at
org.apache.jasper.runtime.JspServlet.service(JspServlet.java, Compiled
Code)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.j
ava, Compiled Code)
at org.apache.tomcat.core.RequestDispatcherImpl.forward(Requ
estDispatcherImpl.java:163)
at <mypackage>.SearchServlet.doGet(SearchServlet.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.j
ava, Compiled Code)
at
org.apache.tomcat.core.ContextManager.service(ContextManager.java:559)
at
org.apache.tomcat.service.http.HttpConnectionHandler.processConnecti
on(HttpConnectionHandler.java:160)
at
org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.
java:338)
at java.lang.Thread.run(Thread.java:479)
Root cause:
java.lang.NullPointerException
at
org.apache.tomcat.core.ContextManager.handleError(ContextManager.java,
Compiled Code)
at
org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.j
ava, Compiled Code)
at
org.apache.tomcat.core.RequestDispatcherImpl.include(RequestDispatch
erImpl.java:262)
at
org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.ja
va:350)
at
jsp._0002fjsp_0002fSearchResult_0002ejspSearchResult_jsp_0._jspServi
ce(_0002fjsp_0002fSearchResult_0002ejspSearchResult_jsp_0.java:69)
at
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:126)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.jasper.runtime.JspServlet$JspServletWrapper.service(JspSe
rvlet.java:174)
at
org.apache.jasper.runtime.JspServlet.serviceJspFile(JspServlet.java:
261)
at
org.apache.jasper.runtime.JspServlet.service(JspServlet.java, Compiled
Code)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.j
ava, Compiled Code)
at org.apache.tomcat.core.RequestDispatcherImpl.forward(Requ
estDispatcherImpl.java:163)
at <mypackage>.SearchServlet.doGet(SearchServlet.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.j
ava, Compiled Code)
at
org.apache.tomcat.core.ContextManager.service(ContextManager.java:559)
at
org.apache.tomcat.service.http.HttpConnectionHandler.processConnecti
on(HttpConnectionHandler.java:160)
at
org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.
java:338)
at java.lang.Thread.run(Thread.java:479)
--------------------------------------------------------------------
-------------------------------------------
SOURCE CODE from the 3.1 release ContextManager.java (handleError)
This includes the changes I made to get it to go to my own error page,
which now works OK.
--------------------------------------------------------------------
-------------------------------------------
// Try a normal "error page"
if( errorServlet==null && path != null ) {
try {
RequestDispatcher rd = ctx.getRequestDispatcher(path);
// reset the response, keeping the status code if necessary
//res.reset(); // KL: THROWS IllegalStateException if res committed!
if (code >= 400) {
res.setStatus(code);
}
// try a forward if possible, otherwise an include
if (res.isBufferCommitted()) {
rd.include(req.getFacade(), res.getFacade());
}
else {
res.reset(); // Moved here from above: KL
10may2000
rd.forward(req.getFacade(), res.getFacade());
}
return ;
} catch( Throwable t1 ) {
ctx.log(" Error in custom error handler " + t1 );
// nothing - we'll call DefaultErrorPage
// Added by KLease 10may2000 to avoid NPE below
(errorServlet is null!)
req.setAttribute( "tomcat.servlet.error.defaultHandler",
"true");
errorServlet=ctx.getServletByName("tomcat.errorPage");
}
}
--------------------------------------------------------------------
-------------------------------------------
I hope this helps.
Best regards,
Karen
/* =====================================
Karen Lease
SPX Valley Forge Technical Information Services
SPX France SA
147 avenue Paul Doumer
92500 Rueil-Malmaision France
Tel.: +33 (0)14751-1751
Fax: +33 (0)14751-8714
eMail: klease@vftis.com
visit us on the web at http://www.vftis.com
======================================*/