什么是 servlet 处理中的“错误调度”?

inq*_*One 6 java servlets servletexception servlet-3.0 jakarta-ee

javax.servlet.AsyncContext 接口javadoc说:

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

  • 在他们的onTimeout方法中调用所有AsyncListener注册ServletRequest到异步
    操作的实例。
  • 如果没有调用complete() 任何侦听器或任何dispatch()方法,则执行状态代码等于 的错误调度HttpServletResponse.SC_INTERNAL_SERVER_ERROR
  • 如果没有找到匹配的错误页面,或者错误页面没有调用 complete()或任何dispatch()方法,调用complete().

但是我在任何地方都找不到“错误调度”的含义。事实上,有一个Apache 错误也发出了同样的声音。(用他们的原话来说:“我也没有看到‘错误调度’的定义”)

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

man*_*jtc 5

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

通过错误调度的请求会将调度程序类型设置为 DispatcherType.ERROR。(在servlet的service方法代码中,可以使用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"
Run Code Online (Sandbox Code Playgroud)

因此,如果您有一个容器将错误重定向到的错误页面,您知道可以阅读这六个属性以获取更多信息。

http://docs.oracle.com/javaee/6/api/javax/servlet/DispatcherType.html http://docs.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html

您可以通过在部署描述符 (web.xml) 中使用标记来设置错误调度。例如,如果您为 404 错误代码添加了一个错误页面标记,那么当发生页面未找到错误时,容器将调度到该页面。在该错误页面中,您可以使用 request.getAttribute("javax.servlet.error.message") 之类的代码来检索有关错误的详细信息。例子 ...

网页.xml :

<web-app>
    <error-page>
        <error-code>404</error-code>
        <location>/error.jsp</location>
    </error-page>
</web-app>
Run Code Online (Sandbox Code Playgroud)

错误.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>
Run Code Online (Sandbox Code Playgroud)

在上面的示例应用程序中,如果没有找到客户端请求的页面,或者您在某处使用 response.sendError("404", "..."),容器将向 error.jsp 执行错误分派。

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