別背八股了,用這個故事讓你徹底理解Spring MVC核心機制!
開場白:來自面試官的一擊靈魂拷問
說出來你可能不信,我在社招面試的第一輪、第二輪、第三輪,都被問到了這道題:
“你能詳細說說 Spring MVC 的工作原理嗎?DispatcherServlet 在其中起什么作用?”
聽到這個問題我心里一緊,嘴上在笑,腦子飛速地回想當年背過的知識點:“視圖解析器...攔截器...處理器映射...誒,不對,得講順啊!”
這題乍一看不難,但想答得“條理清晰 + 術語準確 + 帶點源碼味道”,真不容易。
所以我決定把這篇文章寫出來,給正在準備面試的你打打氣、補補刀。
先講一個小故事:我們為什么需要 Spring MVC?
設想你是個餐廳老板。客戶點菜 -> 廚房做菜 -> 上菜 -> 客戶吃飯。
這個流程是不是很像我們平時寫 Web 應用的處理流程?
- 用戶在瀏覽器發出請求(點菜);
- 系統需要有人接單并決定誰來做菜(控制器);
- 根據客戶點的菜找到做這道菜的廚師(處理器映射);
- 做好之后上菜(返回視圖);
- 吃完之后結賬走人(返回響應);
而這個“整個點菜 - 做菜 - 上菜”的流程管理者,就是我們今天的主角——DispatcherServlet,也就是 Spring MVC 的調度中心。
正菜來啦:Spring MVC 的整體工作流程
下面是最最核心的一句話總結:
Spring MVC 是基于前端控制器(Front Controller)設計模式的 Web 框架,它的核心就是 DispatcherServlet,它把請求分發給真正的處理者(Controller),再將結果返回給用戶。
整個流程分為七步(強烈建議你能畫圖!):
1. 用戶發起請求(比如訪問 /user/list)
用戶在瀏覽器輸入一個地址,例如:
這個請求先被 Web 容器(Tomcat)接收,再被轉交給 Spring MVC 的核心組件——DispatcherServlet。
2. DispatcherServlet 拿到請求,第一件事:找 HandlerMapping
DispatcherServlet 的第一步,是找誰來處理這個請求。
它會遍歷所有的 HandlerMapping,比如:
- RequestMappingHandlerMapping
- BeanNameUrlHandlerMapping
- 你自定義的 HandlerMapping...
找出一個與請求匹配的處理器(Handler),也就是我們平時寫的那個 @Controller + @RequestMapping 的方法。
這時候,它還會找出與之綁定的 HandlerAdapter(適配器),方便后續執行。
3. DispatcherServlet 調用 HandlerAdapter 執行控制器方法
拿到處理器(Controller 方法)后,并不是 DispatcherServlet 親自去調的。
而是通過 HandlerAdapter 去執行它。這樣做的好處是:可以適配不同類型的處理器(比如普通 Controller、注解式 Controller、HttpRequestHandler等)
執行控制器方法時,會用上各種參數解析器(ArgumentResolvers)幫你自動注入:
- @RequestParam
- @PathVariable
- HttpServletRequest
- Model、Map...
4. Controller 方法執行完畢,返回一個 ModelAndView
這是 Controller 層的出口。
比如你寫了:
圖片
返回的 ModelAndView 里有兩個東西:
- View Name(視圖名,如 "userList")
- Model 數據(比如 users)
5. DispatcherServlet 把視圖名交給 ViewResolver 找真正的 View
“userList” 到底是哪一個頁面?HTML?JSP?Thymeleaf?還是 PDF?
這時候,就要靠 ViewResolver 來解析了!
Spring 提供了很多 ViewResolver 的實現:
- InternalResourceViewResolver:用于 JSP
- ThymeleafViewResolver:用于 Thymeleaf
- 你也可以自定義視圖解析器
ViewResolver 根據名字找到了真正的 View 對象,然后交還給 DispatcherServlet。
6. DispatcherServlet 渲染視圖(View.render)
接下來就是 DispatcherServlet 和 View 的合作時刻了!
DispatcherServlet 把之前從 Controller 那里得到的 Model 數據傳給 View,View 會將它“渲染”為 HTML 頁面。
這一步,頁面模板技術(JSP / Thymeleaf / Freemarker)發揮了關鍵作用!
7. 最后一步:響應返回給瀏覽器
渲染出來的 HTML 會被寫入 HttpServletResponse,返回給客戶端。
用戶在瀏覽器看到頁面啦!
總結一下:Spring MVC 的工作流程
一圖勝千言,文字版總結如下:
圖片
是不是一整個 前后端協同、模塊解耦、職責清晰的系統設計 呢?這就是 Spring MVC 牛的地方!
專門講講 DispatcherServlet 的“調度之道”
好啦,咱們前面把整體流程理了一遍,下面來重點看看面試官特別關心的 DispatcherServlet。
DispatcherServlet 本質上是一個 Servlet,它繼承了 HttpServlet,但是又通過 doDispatch 方法完成了整個 MVC 流程的調度。
DispatcherServlet 的職責列表
- 初始化所有 MVC 組件(在容器啟動時):
ThemeResolver(主題)
LocaleResolver(多語言)
MultipartResolver(處理上傳)
異常處理器(HandlerExceptionResolver)
ViewResolver
HandlerAdapter
HandlerMapping
- 接收請求,執行 doDispatch() 方法;
- 找處理器(Controller 方法);
- 調用處理器;
- 找視圖;
- 渲染視圖;
- 異常處理;
是不是一個超級“全能選手”?
DispatcherServlet 的源碼探秘(輕量版)
你要是想進一步 impress 面試官,可以提到它的源碼中的 doDispatch() 方法:
圖片
是不是感覺它就像一個調度中心,把各個模塊串聯起來、執行流程控制、處理異常,是整個 Spring MVC 的“心臟”。
面試加分Tips:如何把這道題答得更“香”?
如果你想讓面試官眼前一亮,可以:
- 先用一句話講清楚:“Spring MVC 是典型的前端控制器模式,DispatcherServlet 是請求分發的核心”;
- 然后講清楚七步流程;
- 再補充 DispatcherServlet 的職責、常見組件、源碼入口;
- 最后加上一兩點拓展,比如攔截器、國際化、異常處理等;
比如這樣答:
“Spring MVC 的核心是 DispatcherServlet,它作為前端控制器,負責將用戶請求分發到具體的 Controller 方法。整個流程包括請求接收、處理器查找、方法執行、視圖解析和頁面渲染,形成一個高內聚低耦合的處理鏈。而 DispatcherServlet 是整個鏈條的調度中心,貫穿了請求的始末。”
是不是既專業又完整?
小米的碎碎念:理解比背誦重要
我以前背過各種 MVC 步驟,流程圖都畫過好幾版,但一到面試就卡殼。
后來我把 DispatcherServlet 比作餐廳里的“大堂經理”,理解了每一步的角色和職責,才真正明白了它是如何調度整個流程的。
所以你不要死記硬背,而是去理解“它為什么這么設計”“各個模塊如何協作”。
結尾:反問面試官的一句話
最后分享一個我在面試時反問面試官的小技巧:
“我對 Spring MVC 的 DispatcherServlet 比較熟悉,請問你們在實際項目中有沒有做過定制?比如擴展 HandlerAdapter 或 ViewResolver?”
這句話既展示了你對原理的掌握,又體現了你思考落地應用的能力,真的很加分!
最后一口飯:記住這三句話!
- DispatcherServlet 是 Spring MVC 的核心調度器,負責請求的分發與響應的輸出;
- MVC 的每一步(Mapping、Adapter、View、Render)都解耦且可擴展;
- 理解架構設計思路,比背套路題更重要!