關於MVC框架,我相信你們都不陌生,都會說也就是模型-視圖-控制器這三層的框架結構,若是你參加面試的時候考官會問:「MVC框架是什麼?你說一說。」其實咱們都知道這個問題還須要問的,只要你是一個開發人員,都知道MVC框架是什麼,考官會問什麼呢?他會問:「你瞭解Spring MVC的工做原理嗎?你給我說一說。」可能這個時候有些人還不知道Sring MVC的工做原理是什麼?如今我就淺談一下,讀者看了以後這篇文章以後,若是以爲有什麼地方寫的不對,但願你們給我指出來,畢竟相互學習,才能更近一步。閉門造車,只會原地踏步,我也是查看了一些資料以後。在說Spring MVC的相關知識以前,咱們先來談一談MVC三層框架結構的知識。前端
MVC也就是模型-視圖-控制器(Model-View-Controller)架構模式的開發模型,實現了模型和視圖的完全分離,結構清晰。web
Model(模型)是用於處理業務邏輯的部分。因此在開發的時候咱們把業務邏輯放在Model層,這樣能夠提升業務邏輯的複用,代碼量也會相應的減小。對於數據庫而言每每還存在事務的機制,爲了適應這樣的變化,設計者會把模型層再細分爲兩層,即服務層( Service )和數據訪問層( DAO )面試
View(視圖)是用於從Model層中返回回來的Beand對象進行數據處理顯示的部分,經過視圖解析器來進行處理的,一般視圖是依據模型數據建立的。spring
Controller(控制器)是用於處理用戶交互的部分。控制器負責從客戶端傳過來的Request請求中讀取數據,控制用戶輸入,並向Model模型發送數據。數據庫
流程和組件是SpringMVC 的核心, SpringMVC的流程是圍繞DispatcherServlet 而工做的,因此在Spring MVC 中DispatcherServlet 就是其最重要的內容。數組
(1)客戶端的全部請求都交給前端控制器DispatcherServlet來處理,它會負責調用系統的其餘模塊來真正處理用戶的請求。 架構
(2)DispatcherServlet收到請求後,將根據請求的信息(包括URL、HTTP協議方法、請求頭、請求參數、Cookie等),經過HandlerMapping機制找處處理該請求的控制器(或其方法)進行響應。只是經過HandlerMapping 返回的是一個HandlerExecutionChain 對象。mvc
HandlerExecutionChain源碼:app
package org.springframework.web.servlet ; /**** imports ****/ public class HandlerExecutionChain { // 日誌 private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class); // 處理器 private final Object handler; // 攔截器數組 @Nullable private HandlerInterceptor[] interceptors; // 攔截器列表 @Nullable private List<HandlerInterceptor> interceptorList; // 攔截器當前下標 private int interceptorIndex = -1; .... }
(3)HandlerAdapter是一個適配器,它用統一的接口對HandlerExecutionChain對象中所包含的處理器進行調用。 框架
(4)Handler完成對用戶請求的處理後,會返回一個ModelAndView對象給DispatcherServlet.
(5) ModelAndView的視圖是邏輯視圖,DispatcherServlet還要藉助ViewResolver視圖解析器完成從邏輯視圖到真實視圖對象的解析工做。
(6)當獲得真正的視圖對象後,DispatcherServlet會利用視圖對象對模型數據進行渲染。
(7)客戶端獲得響應,多是一個普通的HTML頁面,也能夠是XML或JSON字符串,還能夠是一張圖片或者一個PDF文件。