【问题标题】:What is an 'error dispatch' in servlet processing?servlet 处理中的“错误调度”是什么?
【发布时间】:2013-05-01 18:31:25
【问题描述】:

javadoc of the javax.servlet.AsyncContext interface 说:

如果异步操作超时, 容器必须经过这些步骤:

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

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

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

【问题讨论】:

    标签: java jakarta-ee servlets servlet-3.0 servletexception


    【解决方案1】:

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

    通过错误分派的请求将分派器类型设置为 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") 之类的代码来检索有关错误的详细信息。示例...

    web.xml:

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

    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>
    

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

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

    【讨论】:

    • 对我来说仍然是朦胧的!如何设置/配置此错误调度?另外,response.sendError() 不会调用错误调度吗?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2023-04-01
      • 2010-11-14
      • 2014-05-11
      相关资源
      最近更新 更多