DispatcherServlet 是 Spring MVC 的核心控制器,採用前端控制器模式,統一接收 HTTP 請求、委派處理、渲染視圖。本文梳理其初始化流程與請求處理管線。
HttpServlet
└─ HttpServletBean // init()、initBeanWrapper()
└─ FrameworkServlet // initServletBean()、initWebApplicationContext()
└─ DispatcherServlet // initFrameworkServlet()、doService()
init() → initBeanWrapper():綁定 Servlet 初始化參數到 Bean 屬性initServletBean() → initWebApplicationContext():建立/取得 WebApplicationContextinitFrameworkServlet() → 依序初始化九大核心組件:| 順序 | 組件 | 功能 |
|---|---|---|
| 1 | MultipartResolver | 檔案上傳解析(CommonsMultipartResolver/StandardServletMultipartResolver) |
| 2 | LocaleResolver | 國際化區域解析 |
| 3 | ThemeResolver | 主題解析 |
| 4 | HandlerMapping | 請求 URL 映射到處理器(RequestMappingHandlerMapping) |
| 5 | HandlerAdapter | 處理器適配器(支援 @Controller、HttpRequestHandler 等) |
| 6 | HandlerExceptionResolver | 異常處理(ExceptionHandlerExceptionResolver、DefaultHandlerExceptionResolver) |
| 7 | ViewResolver | 視圖解析(InternalResourceViewResolver、ThymeleafViewResolver) |
| 8 | FlashMapManager | 重導向屬性傳遞 |
| 9 | RequestResponseBodyMethodProcessor | @ResponseBody 處理(Spring 4+ 內建) |
doService())六大步驟構成完整管線:
multipart/form-data,包裝為 MultipartHttpServletRequestgetHandler(request) 取得 HandlerExecutionChain(含攔截器)preHandle(),任一返回 false 中斷流程HandlerAdapter.handle() 呼叫控制器方法,獲得 ModelAndViewpostHandle(),可修改模型/視圖processDispatchResult() → render() 輸出回應HandlerAdapter 屏蔽不同處理器類型差異DispatcherServletAutoConfiguration 替代手動 XML 註冊WebMvcAutoConfiguration 提供預設組件,支援 WebMvcConfigurer 客製化DispatcherServlet理解 DispatcherServlet 初始化順序與請求管線,有助於排查映射失效、攔截器不生效、視圖解析異常等常見問題。核心思想:約定優於配置,策略介面可替換。