2013-05-01 43 views
3

javadoc of the javax.servlet.AsyncContext interface說:什麼是servlet處理中的「錯誤分派」?

在事件的異步操作超時,容器必須通過這些步驟執行:

  • 調用,在他們onTimeout方法,所有AsyncListener實例 與ServletRequest註冊在其上啓動異步操作。
  • 如果沒有聽衆的稱爲complete() 或任何dispatch()方法,具有 狀態碼等於HttpServletResponse.SC_INTERNAL_SERVER_ERROR執行錯誤調度。
  • 如果未找到匹配的錯誤頁面,或者錯誤頁面未調用 complete()或任何dispatch()方法,請致電complete()

但我無法在任何地方找到「error dispatch」的含義! 事實上有一個Apache bug驚呼同樣! (用他們的確切的話來說:「我還沒有看到'錯誤派遣'的高清」)!

但是,當然,必須有明確的定義和如何使用它。 有誰知道?

回答

4

容器在異常/錯誤期間進行的調度稱爲錯誤調度。這些通常是發送到錯誤頁面。根據我的理解,沒有辦法直接進行錯誤分派。

通過錯誤分派發出的請求將使調度程序類型設置爲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:

<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」頁指令)也適用於此處。

+0

這對我來說依然朦朧!我該如何設置/配置此錯誤分派?另外,doesnt response.sendError()調用錯誤調度? – brainOverflow 2013-05-02 21:34:08

+0

我已經添加了一些關於執行錯誤分發的更多信息。 – manojtc 2013-05-03 05:37:39

0

這是不直接相關的問題,但我已經看到了幾乎所有的地方沒有明確提及,包括上述答案的另一個信息是錯誤調度技術上「重定向」,這是相當內部前進。對於初學者來說,這可能看起來很混亂,因爲它通常被寫爲「容器重定向到錯誤頁面」。因此,當你的容器看到任何資源發送的http錯誤代碼/未捕獲的異常時,它開始查看web xml以查看是否存在任何定義的處理程序,如果存在,那麼它會適當地將請求轉發到該資源,使用請求調度程序。顯然,上述答案中提到的所有信息都適用。

如果有人想做重定向,他們可以在過濾器或servlet中或從他們有響應對象的任何地方這樣做。