SpringMVC 基于 MVC 架構模式,核心流程時前端控制室 DispathcherServlet 統一調度,通過組件協作完成 http 的請求與響應。
對于 dispatchServlet 作為前端請求的控制器,全局的訪問點,首先將根據 URL 調用 HandlerMapping 獲取 Handler 配置的相關的對象。以 HandlerExceptionChain 執行鏈的形式返回。
handlerMapping 根據 URL 和 HTTP 方法找到對應的處理器,并包裝成HandlerExceptionChain。 比如通過 RequestMappingHandlerMapping 映射到 Controller 里面 方法上面去。
handlerExceptionChain 調用鏈,包含了一個 handler 和多個攔截器。按照順序調用攔截器的 prehandle 方法
根據 Handler 找到合適的 HandlerAdapter。開始執行攔截器的內容
將 Request 中的參數提取出來進行填充
- 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)方法,處理請求。在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:
- 數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
- 數據格式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等
- 數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
執行完成之后
- Handler執行完成后,向DispatcherServlet 返回一個ModelAndView對象。
- 此時將開始執行攔截器的postHandle(…)方法【逆向】。
- 根據返回的ModelAndView(此時會判斷是否存在異常:如果存在異常,則執行 HandlerExceptionResolver進行異常處理)選擇一個適合的ViewResolver進行視圖解析,根據Model 和View,來渲染視圖。
- 渲染視圖完畢執行攔截器的afterCompletion(…)方法【逆向】。
- 將渲染結果返回給客戶端。