處理過程

DispatcherServlet 按如下方式處理請求

  • 搜尋 WebApplicationContext 並將其繫結到請求中作為屬性,供控制器和流程中的其他元素使用。預設情況下,它繫結在 DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE 鍵下。

  • locale 解析器繫結到請求中,以便流程中的元素可以解析處理請求(渲染檢視、準備資料等)時要使用的區域設定。如果您不需要區域設定解析,則不需要 locale 解析器。

  • theme 解析器繫結到請求中,以便檢視等元素可以確定要使用的主題。如果您不使用主題,則可以忽略它。

  • 如果您指定了 multipart 檔案解析器,將檢查請求是否包含 multipart 內容。如果找到 multipart 內容,請求將被封裝在 MultipartHttpServletRequest 中,以便流程中的其他元素進一步處理。有關 multipart 處理的更多資訊,請參閱 Multipart 解析器

  • 搜尋合適的 handler。如果找到 handler,則執行與該 handler 關聯的執行鏈(前置處理器、後置處理器和控制器)來準備用於渲染的模型。或者,對於註解控制器,可以在 HandlerAdapter 中渲染響應,而不是返回檢視。

  • 如果返回模型,則渲染檢視。如果沒有返回模型(可能是由於前置處理器或後置處理器攔截了請求,可能出於安全原因),則不渲染檢視,因為請求可能已經完成。

WebApplicationContext 中宣告的 HandlerExceptionResolver bean 用於解析請求處理期間丟擲的異常。這些異常解析器允許定製處理異常的邏輯。更多詳情請參閱 異常

對於 HTTP 快取支援,handler 可以使用 WebRequestcheckNotModified 方法,以及 控制器的 HTTP 快取 中描述的註解控制器的其他選項。

您可以透過向 web.xml 檔案中的 Servlet 宣告新增 Servlet 初始化引數(init-param 元素)來定製單個 DispatcherServlet 例項。下表列出了支援的引數

表 1. DispatcherServlet 初始化引數
引數 說明

contextClass

實現 ConfigurableWebApplicationContext 的類,由該 Servlet 例項化和本地配置。預設情況下,使用 XmlWebApplicationContext

contextConfigLocation

傳遞給 context 例項(由 contextClass 指定)的字串,用於指示可以在何處找到 contexts。該字串可能由多個字串組成(使用逗號作為分隔符),以支援多個 contexts。如果多個 context 位置中定義了兩次 bean,則以最新位置為準。

namespace

WebApplicationContext 的名稱空間。預設為 [servlet-name]-servlet

throwExceptionIfNoHandlerFound

當請求沒有找到 handler 時是否丟擲 NoHandlerFoundException。然後可以使用 HandlerExceptionResolver(例如,透過 `@ExceptionHandler` 控制器方法)捕獲該異常並像處理其他異常一樣處理。

從 6.1 版本起,該屬性設定為 true 並已棄用。

請注意,如果同時配置了 預設 servlet 處理,未解析的請求將始終轉發到預設 servlet,並且永遠不會丟擲 404。