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

rsaldnfx  于 2023-02-27  发布在  其他
关注(0)|答案(7)|浏览(144)

在JSP中,可以使用response.sendError(int code, String message)返回特定的错误代码(例如404表示找不到)和一条消息。只要使用默认的丑陋的Tomcat错误页,这些消息就会显示得很好。但是,如果创建一个自定义错误页,你是怎么得到这个消息的?我试过exception.getMessage()pageContext.getErrorData(),但没有用。我已经找了几个小时,似乎没有人甚至想知道同样的事情!
我忘了提一下,到目前为止我只在404上试过,因为这是我最需要的...异常由于某种原因为null,所以在它上面尝试任何东西都会抛出一个NullPointerException。错误页面是一个404错误页面,通过web.xml设置(因为我希望它在每个404错误时都显示出来),对于任何想知道的人,是的,它的isErrorPage指令设置为true...

6qqygrtg

6qqygrtg1#

错误消息可通过错误页面jsp中请求对象的javax.servlet.error.message属性获得。
下面是访问它的jsp语法:

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

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

aoyhnmkz

aoyhnmkz2#

exception.getMessage()应该可以
尝试添加exception.getClass().getName()
1.它可能是没有消息的NullPointerException
1.或者异常不是来自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 Specification(自2011年起链路断开)第9.9节

fcipmucu

fcipmucu3#

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

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

对我来说很好用。

pftdvrlh

pftdvrlh4#

仅当错误页是由于异常而不是响应错误代码加载时,才会设置ErrorDataexception部分。
参见javadocsendErrorHttpServletResponse,它提到了为什么你看不到你传递给sendError的消息(着重号是我的):
使用指定的状态向客户端发送错误响应。服务器默认创建的响应类似于包含指定消息的HTML格式的服务器错误页,内容类型设置为“text/html”,Cookie和其他标头保持不变。如果已为与传入的状态代码对应的Web应用程序进行错误页声明,它将优先于建议的MSG参数而被服务回来。
如果响应已提交,则此方法引发IllegalStateException。使用此方法后,响应应视为已提交,不应写入。

anauzrmj

anauzrmj5#

你想要的东西在我看来很奇怪:)。话虽如此,我会做以下几点:
1.实现HttpResponseWrapper,以如下方式 Package 任何其他HttpResponse

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

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

1.创建一个过滤器并将任何响应 Package 在此
1.将筛选器放在所有请求上,并放在链中的第一位
1.在错误页面中检查响应是否为HttpResponseWrapper的示例
1.获取您的消息

jhkqcmku

jhkqcmku6#

您可以使用

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

如果页面上没有jstl

6g8kf2rb

6g8kf2rb7#

<%
    if (null != request.getAttribute("errorMessage")) {
       out.println(request.getAttribute("errorMessage"));
    }
%>

您可以使用

相关问题