如何在自定义错误页面(Tomcat)中获取消息?

时间:2009-06-15 09:46:19

标签: jsp tomcat custom-error-pages

在JSP中,您可以使用response.sendError(int code, String message)返回特定的错误代码(例如404找不到)和消息。 只要您使用默认的丑陋Tomcat错误页面,这些消息就会显示正常。但是,如果您创建自定义错误页面,您如何获得该消息? 我试过了exception.getMessage()pageContext.getErrorData()但没有用。我一直在寻找这个好几个小时,似乎没有人想知道同样的事情! :S

我忘了提到我到目前为止只尝试过404s,因为这是我最需要的...由于某种原因异常是空的,所以在它上面尝试任何东西会抛出NullPointerException。 错误页面是一个404错误页面,通过web.xml设置(因为我希望它显示每个单个404错误),对于任何想知道的人,是的,它将isErrorPage指令设置为true ...

6 个答案:

答案 0 :(得分:13)

错误页面jsp。

中的请求对象的javax.servlet.error.message属性提供了错误消息

以下是访问它的jsp语法:

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

您可以在新错误属性下的错误页面here中查找可用的其他错误相关信息。

答案 1 :(得分:9)

exception.getMessage()应该有效

尝试添加exception.getClass().getName()

  1. 可能是NullPointerException没有消息
  2. 或异常不是来自Sun且消息未正确设置
  3. 当然,这只有在我正确记住的情况下,如果错误是由顶部有<%@ page errorPage="/yourerrorpage.jsp" %>的jsp抛出的。

    如果错误来自servlet,则异常详细信息将作为请求属性传递

    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
    

    检查Servlet Specification第9.9节

答案 2 :(得分:3)

我很抱歉这么晚才回答,但是我在一周前面对这个问题,我浏览了很多不同的网站,但没有人真正按照我想听的方式解决这个问题。在这篇文章中,我找到了一些有趣的解决方案,然后找到了我自己的解决方案。只需在您的网页中加入此来源:

<%
    out.println(pageContext.getErrorData().getRequestURI());
    out.println("<br/>");
    out.println(pageContext.getErrorData().getStatusCode());
    out.println("<br/>");
    out.println(pageContext.getException());
    out.println("<br/>");
%>

它对我来说非常好。

答案 3 :(得分:0)

你想要的东西对我来说很奇怪:)。那就是说,我会做以下事情:

  1. 以这种方式实施HttpResponseWrapper以包装任何其他HttpResponse

    public class HttpResponseWrapper implements HttpResponse {
        private String errorMessage;
    ...
    
        @Override
        public void sendError(...) {
            <save error message here>
        }
    ...
    }
    
  2. 创建过滤器并在此

  3. 中包装任何响应
  4. 对所有请求进行过滤,首先在链中

  5. 在错误页面中,检查响应是否为HttpResponseWrapper

  6. 的实例
  7. 收到你的留言

答案 4 :(得分:0)

只有在错误页面由于异常而非响应错误代码而加载时才会设置exception的{​​{1}}部分。

ErrorData上查看sendError的{​​{1}}。它提到了为什么你没有看到你传递给HttpServletResponse的信息(强调我的):

  

使用指定的状态向客户端发送错误响应。服务器默认创建响应,使其看起来像包含指定消息的HTML格式的服务器错误页面,将内容类型设置为“text / html”,不改变cookie和其他标头。 如果对与传入的状态代码相对应的Web应用程序进行了错误页面声明,则将优先于建议的msg参数进行返回。

  如果响应已提交,则此方法将抛出IllegalStateException。使用此方法后,应认为响应已提交,不应写入。

答案 5 :(得分:0)

您可以使用

${requestScope['javax.servlet.error.message']}

如果你没有页面上的jstl