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

javax.servlet.AsyncContext接口的javadoc说:

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

  • 在其onTimeout方法中调用所有AsyncListener实例,这些实例在ServletRequest上注册了异步
    开始运作。
  • 如果没有任何侦听器调用complete()或任何dispatch()方法,请执行错误分派,其状态代码等于HttpServletResponse.SC_INTERNAL_SERVER_ERROR
  • 如果未找到匹配的错误页面,或者错误页面未调用complete()或任何dispatch()方法,请调用complete()

但我无法在任何地方找到“错误发送”的含义。 事实上,有一个Apache错误 ,同样惊呼。 (用他们确切的话说:“我还没有看到’错误发送’的定义’,”

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

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

通过错误分派发出的请求将调度程序类型设置为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" 

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

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”)之类的代码来检索有关错误的详细信息。 示例……

web.xml:

   404 /error.jsp   

error.jsp:

    404 Error   The page was not found. You requested <%= request.getAttribute("javax.servlet.error.message") %> but it was not found. Sorry.   

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

JSPerror handling机制(使用“errorPage”和“isErrorPage”页面指令)也适用于此处。

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

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