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
I'm sorry for answering so late, but I faced with this problem just a week ago, I've browsed a lot of different sites but nobody really aswered this problem the way I wanted to hear. In this post I found out a few interesting solutions and then came up to my own. Just include this source in your page:
<%
out.println(pageContext.getErrorData().getRequestURI());
out.println("<br/>");
out.println(pageContext.getErrorData().getStatusCode());
out.println("<br/>");
out.println(pageContext.getException());
out.println("<br/>");
%>
It worked perfectly fine with me.
You can use
${requestScope['javax.servlet.error.message']}
if you don't have jstl on the page
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.
The thing you want looks weird to me :). That said, I would do the following:
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>
}
...
}
Create a Filter and wrap any response in this
Put filter on all requests and first in the chain
In your error page check if response is instanceof HttpResponseWrapper
Get your message
Hmm exception.getMessage()
should work
Try adding exception.getClass().getName()
NullPointerException
which has no messageOf 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 (link is broken since ~2011) section 9.9
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 under New Error Attributes.