15.1、常用組件 15.1.1、 DispatcherServlet DispatcherServlet 是前端控制器,由框架提供,不需要工程師開發; 作用:統一處理請求和響應,整個流程式控制制的中心,由它調用其它組件處理用戶的請求。 15.1.2、HandlerMapping HandlerMapp ...
15.1、常用組件
15.1.1、 DispatcherServlet
DispatcherServlet 是前端控制器,由框架提供,不需要工程師開發;
作用:統一處理請求和響應,整個流程式控制制的中心,由它調用其它組件處理用戶的請求。
15.1.2、HandlerMapping
HandlerMapping 是處理器映射器,由框架提供,不需要工程師開發;
作用:根據請求的 url、method 等信息去查找 Handler(即控制器方法)。
15.1.3、Handler
Handler 是處理器(即控制器方法),需要工程師開發;
作用:對匹配的用戶請求進行具體處理。
15.1.4、HandlerAdapter
HandlerAdapter 是處理器適配器,由框架提供,不需要工程師開發;
作用:通過 HandlerAdapter 來調用處理器(即控制器方法)。
15.1.5、ViewResolver
ViewResolver 是視圖解析器,由框架提供,不需要工程師開發;
作用:進行視圖解析,得到相應的視圖,例如:ThymeleafView、InternalResourceView、RedirectView。
15.1.6、View
View 是視圖,,需要工程師開發;
作用:將共用域中的數據通過頁面展示給用戶。
15.2、執行流程
-
用戶向伺服器發送請求,請求被 SpringMVC 的前端控制器 DispatcherServlet 捕獲;
-
DispatcherServlet 對請求 URL 進行解析,得到 URI ,判斷請求 URI 對應的映射是否存在;
-
如果請求 URI 對應的映射不存在:
-
再判斷是否配置了 mvc:default-servlet-handler :
-
如果沒配置,則控制台日誌顯示找不到請求對應的目標資源,客戶端展示404錯誤;
-
如果有配置,則訪問目標資源(一般為靜態資源,如:JS,CSS,HTML);若目標資源不存在,客戶端也會展示404錯誤。
-
-
-
如果請求 URI 對應的映射存在,則執行以下流程:
-
根據該 URI ,調用 HandlerMapping 獲得該 Handler 配置的所有相關的對象(包括Handler對象以及對應的攔截器),
最後以 HandlerExecutionChain (處理器執行鏈對象)的形式返回; -
DispatcherServlet 根據獲得的 Handler ,選擇一個合適的 HandlerAdapter ;
-
如果成功獲得了 HandlerAdapter ,此時將開始執行對應攔截器的 preHandler() 方法【正向】;
-
提取 Request (請求)中的數據,填充到 Handler 的入參,開始執行 Handler(控制器方法)對用戶請求進行具體處理;
在填充 Handler 的入參過程中,根據控制器方法的配置,Spring將幫忙做一些額外的工作:-
HttpMessageConverter(常用): 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換為指定的響應信息
-
數據轉換(常用):對請求消息進行數據轉換,如將 String 轉換成 Integer、Double 等
-
數據格式化(少用):對請求消息進行數據格式化,如將字元串轉換成格式化數字或格式化日期等
-
數據驗證(少用):驗證數據的有效性(長度、格式等),驗證結果存儲到 BindingResult 或 Error 中
-
-
Handler 執行完成後,向 DispatcherServlet 返回一個 ModelAndView 對象;
(此時會判斷 Handler 執行是否存在異常,如果存在異常,則執行 HandlerExceptionResolver 進行異常處理) -
如果 Handler 執行不存在異常,則執行對應攔截器的 postHandle() 方法【逆向】,存在異常則跳過該步驟;
-
根據返回的ModelAndView 選擇一個適合的 ViewResolver 進行視圖解析,根據 Model 和 View 來渲染視圖;
-
渲染視圖完畢後,執行對應攔截器的 afterCompletion() 方法【逆向】;
-
將渲染結果返回給客戶端。
-
-
本文來自博客園,作者:Javaer1995,轉載請註明原文鏈接:https://www.cnblogs.com/Javaer1995/p/17842724.html