Spring MVC 作為 Java Web 開發事實標準,其核心在於 DispatcherServlet 作為前端控制器,統籌請求處理全流程。本文通過兩張流程圖深度解析 MVC 與 Spring MVC 執行鏈路。

ModelAndView (模型數據 + 邏輯視圖名)
| 組件 | 角色 | 關鍵接口/類 | 說明 |
|---|---|---|---|
| 前端控制器 | 統一入口、調度核心 | DispatcherServlet | 繼承 FrameworkServlet,載入 WebApplicationContext |
| 處理器映射器 | URL → Controller 映射 | HandlerMapping (RequestMappingHandlerMapping) | 掃描 @RequestMapping 建立映射關係 |
| 處理器適配器 | 統一調用 Controller 方法 | HandlerAdapter (RequestMappingHandlerAdapter) | 支援多種 Controller 類型,參數綁定、返回值處理 |
| 頁面控制器 | 業務邏輯入口 | @Controller + @RequestMapping | POJO 形式,無需實現接口 |
| 視圖解析器 | 邏輯視圖名 → 視圖實例 | ViewResolver (InternalResourceViewResolver) | 前綴 + 後綴拼接 JSP 路徑 |
| 視圖 | 渲染輸出 | View (JspView, ThymeleafView...) | 合併模型數據輸出 HTML/JSON/XML |
DispatcherServlet.doDispatch()// 簡化核心邏輯 HandlerExecutionChain chain = handlerMapping.getHandler(request); HandlerAdapter adapter = getHandlerAdapter(chain.getHandler()); ModelAndView mv = adapter.handle(request, response, chain.getHandler()); processDispatchResult(request, response, mv);
HandlerAdapter 利用 HandlerMethodArgumentResolver 解析方法參數@RequestParam, @PathVariable, @RequestBody, @ModelAttribute, POJO 綁定等ConversionService + FormatterHandlerMethodReturnValueHandler 處理不同返回類型ModelAndView、View、String (視圖名)、@ResponseBody (直接寫回響應體)、ResponseEntity、void (自行處理響應)<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
邏輯視圖名 "user/list" → /WEB-INF/jsp/user/list.jsp
<!-- 1. 載入 Spring MVC 配置 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern> <!-- 攔截所有請求 -->
</servlet-mapping>
<!-- 2. 編碼過濾器 (必須在最前) -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
將深入剖析:@RequestMapping 進階匹配規則、參數綁定原理、異常統一處理 (@ControllerAdvice)、攔截器鏈、文件上傳、RESTful API 設計。