views:

1844

answers:

4

In JSPs, you may use response.sendError(int code, String message) to return a particular error code (eg 404 for not found) and a message as well. These messages display fine, as long as you use the default ugly Tomcat error pages. However, if you create a custom error page, how do you get that message? I've tried exception.getMessage() or pageContext.getErrorData() but no avail. I've been searching for this for like hours and nobody seems to even wonder about the same thing! :S

I forgot to mention I've only tried it with 404s so far, since that's what I need most... The exception is null for some reason, so trying anything on it throws a NullPointerException. The error page is a 404 error page, set via web.xml (since I want it to be displayed for EVERY single 404 error) and for anyone wondering, yes it has the isErrorPage directive set to true...

A: 

Hmm exception.getMessage() should work

Try adding exception.getClass().getName()

  1. It could be a NullPointerException which has no message
  2. or the exception is not from Sun and the message isn't set properly

Of course this only works, if I remember correctly, if the error is thrown by a jsp with <%@ page errorPage="/yourerrorpage.jsp" %> at the top.

If the error comes from a servlet the exception details are passed as request attributes

javax.servlet.error.status_code    java.lang.Integer
javax.servlet.error.exception_type java.lang.Class
javax.servlet.error.message        java.lang.String
javax.servlet.error.exception      java.lang.Throwable
javax.servlet.error.request_uri    java.lang.String
javax.servlet.error.servlet_name   java.lang.String

Check the Servlet Specification section 9.9

jitter
See my edit, sorry that I forgot to add more details...
Michelle
A: 

The thing you want looks weird to me :). That said, I would do the following:

  1. Implement HttpResponseWrapper to wrap any other HttpResponse in this way:

    public class HttpResponseWrapper implements HttpResponse { private String errorMessage; ...

    @Override
    public void sendError(...) {
        <save error message here>
    }
    

    ... }

  2. Create a Filter and wrap any response in this

  3. Put filter on all requests and first in the chain
  4. In your error page check if response is instanceof HttpResponseWrapper
  5. Get your message
Georgy Bolyuba
Thanks for your time, but did you actually read my post? I have set isErrorPage to true, and my 404 works fine (which means I've already done it right in web.xml, so there's no need to mention the error-page tag). I also mentioned that my question is about 404s, not exceptions.
Michelle
Yep, my fault. Somehow missed the point of the question. Happens. Updating my answer
Georgy Bolyuba
A: 

The exception part of the ErrorData will only be set if the error page was loaded as a result of an exception and not a response error code.

See the javadoc for sendError on HttpServletResponse. It mentions why you're not seeing the message you passed to sendError (emphasis mine):

Sends an error response to the client using the specified status. The server defaults to creating the response to look like an HTML-formatted server error page containing the specified message, setting the content type to "text/html", leaving cookies and other headers unmodified. If an error-page declaration has been made for the web application corresponding to the status code passed in, it will be served back in preference to the suggested msg parameter.

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.

jimr
Thanks. I had read that previously, but hadn't noticed the part you emphasized. So, to cut a long story short, it's not possible at all? :-(
Michelle
+2  A: 

The error message is available via 'javax.servlet.error.message' attribute of the request object in error page jsp.

Here is the jsp syntax to access it:

<c:out value="${requestScope['javax.servlet.error.message']}"/>

You could look for other error related information available in the error page here http://java.sun.com/developer/technicalArticles/Servlets/servletapi2.3 under 'New Error Attributes'.

Gennady Shumakher
Thanks but ...nope. Doesn't work :-/
Michelle
It should according to the spec and it actually does in our Tomcat based application. You may have some weird configuration issue. Anyhow, good luck on that one, and would be great to know the solution at the end.
Gennady Shumakher