Java 什么是';错误调度';在servlet处理中?

Java 什么是';错误调度';在servlet处理中?,java,jakarta-ee,servlets,servlet-3.0,servletexception,Java,Jakarta Ee,Servlets,Servlet 3.0,Servletexception,报告说: 如果异步操作超时,则 容器必须执行以下步骤: 在其onTimeout方法中调用向ServletRequest注册的所有AsyncListener实例,在这些实例上异步 行动开始了 如果没有任何侦听器调用complete()或任何dispatch()方法,请使用状态代码执行错误分派 等于HttpServletResponse.SC\u INTERNAL\u SERVER\u ERROR 如果未找到匹配的错误页,或者错误页未调用complete()或任何dispatch()方法,请调用c

报告说:

如果异步操作超时,则 容器必须执行以下步骤:

  • 在其
    onTimeout
    方法中调用向
    ServletRequest
    注册的所有
    AsyncListener
    实例,在这些实例上异步 行动开始了
  • 如果没有任何侦听器调用
    complete()
    或任何
    dispatch()
    方法,请使用状态代码执行错误分派 等于HttpServletResponse.SC\u INTERNAL\u SERVER\u ERROR
  • 如果未找到匹配的错误页,或者错误页未调用
    complete()
    或任何
    dispatch()
    方法,请调用
    complete()
但我在任何地方都找不到“错误调度”的含义。 事实上,有一种说法也是如此。(确切地说:“我也没有看到‘错误调度’的定义”)

但当然,必须有一个明确的定义,以及如何使用它。
有人知道吗?

容器在异常/错误期间进行的调度称为错误调度。这些通常是发送到错误页面的。据我所知,无法直接执行错误调度

通过错误分派发出的请求的分派器类型将设置为DispatcherType.error。(在servlet的服务方法代码中,可以使用getDispatcherType()获取分派类型)

以下六个请求范围的属性也将在错误分派中设置

"javax.servlet.error.exception"
"javax.servlet.error.exception_type"
"javax.servlet.error.message"
"javax.servlet.error.request_uri"
"javax.servlet.error.servlet_name"
"javax.servlet.error.status_code"
因此,如果您有一个错误页面,容器将错误重定向到该页面,您知道您可以阅读这六个属性以了解更多信息

您可以使用部署描述符(web.xml)中的标记来设置错误分派。例如,如果您为404错误代码添加了错误页面标记,那么当出现页面未找到错误时,容器将分派到该页面。在该错误页面中,您可以使用类似request.getAttribute(“javax.servlet.error.message”)的代码来检索有关错误的详细信息。例如

web.xml:

<web-app>
    <error-page>
        <error-code>404</error-code>
        <location>/error.jsp</location>
    </error-page>
</web-app>

404
/error.jsp
error.jsp:

<!DOCTYPE html>
<html>
    <head>
        <title>404 Error</title>
    </head>
    <body>
        The page was not found. You requested <%= request.getAttribute("javax.servlet.error.message") %> but it was not found. Sorry.
    </body>
</html>

404错误
找不到该页。您请求了,但找不到。很抱歉
在上面的示例应用程序中,如果找不到客户机请求的页面,或者您在某处使用response.senderro(“404”、“…”),则容器将向error.jsp发送错误


JSP错误处理机制(使用“errorPage”和“iErrorPage”页面指令)也适用于这里。

另一个与问题没有直接关系但我在几乎所有地方都没有清楚提到的信息,包括上面的答案是错误调度在技术上是而不是“重定向”,这是相当内部的前进。对于初学者来说,这可能看起来很混乱,因为它通常都写为“容器重定向到错误页面”。因此,当容器看到任何资源发送http错误代码/未捕获异常时,它就开始查看web xml,查看是否定义了任何处理程序,如果存在,则使用请求调度器将请求适当地转发给该资源。显然,上述答案中提到的所有信息都适用


但是,如果有人想重定向,他们可以在过滤器或servlet中,或者在任何他们有响应对象可用的地方重定向。

这对我来说仍然不清楚!如何设置/配置此错误分派?另外,不响应。senderro()调用错误分派吗?