6

javax.servlet.AsyncContext 接口的javadoc说:

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

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

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

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

4

2 回答 2

5

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

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

以下六个请求范围的属性也将在错误调度中设置。

"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"

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

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>

错误.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>

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

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

于 2013-05-02T14:19:19.940 回答
2

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

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

于 2013-10-17T15:44:59.930 回答