Spring MVC 框架流程與原理深度解析:從 DispatcherServlet 到視圖渲染
請求處理全流程

- 用戶發送請求 → DispatcherServlet(前端控制器)
- DispatcherServlet 根據 URL 選擇 HandlerMapping → 獲取
HandlerExecutionChain(Handler + Interceptors)
- 通過 HandlerAdapter 適配 Handler → 執行預處理攔截器
- HandlerAdapter 調用 Controller 業務方法 → 返回
ModelAndView
- DispatcherServlet 根據邏輯視圖名 → ViewResolver 解析具體
View
- View 渲染模型數據 → 返回響應給用戶
核心架構組件

DispatcherServlet 核心源碼解析
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {
// 1. 檢查 multipart(文件上傳)
processedRequest = checkMultipart(request);
// 2. HandlerMapping 獲取 HandlerExecutionChain
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) { noHandlerFound(...); return; }
// 3. HandlerAdapter 適配
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 4. 執行預處理攔截器
if (!mappedHandler.applyPreHandle(processedRequest, response)) return;
// 5. 執行 Handler(Controller)
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 6. 執行後處理攔截器
mappedHandler.applyPostHandle(processedRequest, response, mv);
// 7. 處理結果:視圖解析與渲染
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
關鍵策略模式應用
| 組件 | 策略接口 | 作用 |
| HandlerMapping | getHandler(request) | 請求 → Handler 映射,支援多種映射策略 |
| HandlerAdapter | supports(handler)/handle() | 適配不同類型 Handler(Controller、HttpRequestHandler 等) |
| ViewResolver | resolveViewName(name, locale) | 邏輯視圖名 → 具體 View 實現,支援 JSP、Velocity、Thymeleaf 等 |
視圖渲染源碼
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) {
Locale locale = localeResolver.resolveLocale(request);
response.setLocale(locale);
View view;
if (mv.isReference()) {
// 邏輯視圖名 → 解析 View
view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
} else {
view = mv.getView();
}
// 渲染:將 Model 數據傳入 View
view.render(mv.getModelInternal(), request, response);
}
核心開發步驟總結
web.xml 配置 DispatcherServlet
- 配置 HandlerMapping(或採用
@RequestMapping 註解)
- 配置 HandlerAdapter(通常自動註冊)
- 配置 ViewResolver(如
InternalResourceViewResolver)
- 編寫 Controller 處理業務,返回 ModelAndView

附錄:Spring IOC 與 AOP 核心概念回顧
IOC(控制反轉)
- 依賴注入 (DI):Setter 注入、構造器注入
- 依賴查找 (DL)
- 容器負責組件裝配,業務代碼與依賴配置分離
AOP(面向切面編程)
- 預編譯 + 運行期動態代理
- 隔離橫切關注點(事務、日誌、權限),降低耦合,提高復用
參考資源