I have a simple (Servlet, JSP, and JSTL) web app whose main functionality is displaying images retrieved from a back-end server. The controller servlet forwards the user to a JSP that in turn uses another Servlet to display the resulting image on that same JSP. Further down, the JSP has a line similar to:
<a href="<c:out value='${imageURL}'/>"><img src="<c:out value='${imageURL}'/>" alt="image view" border="1"></a>
which invokes a GET request on the image-generating servlet causing it to generate the image.
My question is: how do I handle Exceptions thrown by this image-generating servlet?
I already have an error page defined (in web.xml) to handle ServletException within my web app but this doesn’t work for this image-generating Servlet, and results in the following errors showing up in my Tomcat server logs:
SEVERE: Exception Processing ErrorPage[exceptionType=javax.servlet.ServletException, location=/WEB-INF/ExceptionPage.jsp]
java.lang.IllegalStateException: Cannot reset buffer after response has been committed
What’s my recourse in this situation?
I’d like to be able to handle Exceptions thrown from this image-generating Servlet, and display some error on the main UI or forward the user to another error page.
You can’t change the response to redirect to an error page while sending the response. It’s already too late to change the entire response then. You can’t ask those already sent bytes back from the client side. That’s what the
IllegalStateExceptionstands for here. It’s a point of no return.Best what you can do is to just log the exception, or to rewrite the code so that it doesn’t write any bit to the response (also not setting the response headers) while the business logic hasn’t finished its task yet. Once you’ve determined that the business logic didn’t throw any exception, then start writing (and thus indirectly also committing) the response. If the business logic has thrown an exception while the response isn’t touched yet, then you can just safely throw it through so that it ends up in an error page. Although in case of an image servlet, you may also want to stream some standard
404.gifto the response instead. This because you can’t display another HTML (error) page in an<img>element and you also can’t change the URL of the parent JSP/HTML page as well since that concerns a different request.