27

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

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

4

6 回答 6

13

错误消息可通过javax.servlet.error.message错误页面 jsp 中请求对象的属性获得。

这是访问它的jsp语法:

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

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

于 2009-06-23T19:31:58.200 回答
9

exception.getMessage()应该可以

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

  1. 它可能是一个NullPointerException没有消息的
  2. 或者异常不是来自 Sun 并且消息设置不正确

当然,如果我没记错的话,这只有<%@ 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 规范(自 ~2011 年以来链接已断开)第 9.9 节

于 2009-06-15T09:53:11.930 回答
5

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

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

它对我来说非常好。

于 2013-04-19T02:35:07.587 回答
0

仅当错误页面是由于异常而不是响应错误代码而加载时,才会设置该exception部分。ErrorData

请参阅有关on的javadoc。它提到了为什么你没有看到你传递给的消息(强调我的):sendErrorHttpServletResponsesendError

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

如果响应已提交,则此方法将引发 IllegalStateException。使用此方法后,应将响应视为已提交,不应写入。

于 2009-06-22T18:15:33.763 回答
0

你想要的东西对我来说看起来很奇怪:)。也就是说,我将执行以下操作:

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

    public class HttpResponseWrapper implements HttpResponse {
        private String errorMessage;
    ...
    
        @Override
        public void sendError(...) {
            <save error message here>
        }
    ...
    }
    
  2. 创建一个过滤器并将任何响应包装在此

  3. 将过滤器放在所有请求上,并放在链中的第一个

  4. 在您的错误页面中检查响应是否为 instanceofHttpResponseWrapper

  5. 获取您的信息

于 2009-06-15T22:09:25.537 回答
0

您可以使用

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

如果页面上没有 jstl

于 2016-12-25T06:20:00.747 回答