Spring MVC 作為 Java Web 開發中最主流的框架之一,其核心執行流程圍繞 DispatcherServlet 展開。理解這一流程不僅有助於排查問題,更能讓開發者在擴展框架功能時遊刃有餘。本文將結合架構圖解,逐步拆解從 HTTP 請求發起到視圖渲染完成的完整鏈路。

客戶端發起 HTTP 請求,Web 容器(如 Tomcat)解析請求路徑。若匹配 web.xml 中配置的 DispatcherServlet 映射路徑(常見為 / 或 *.do),容器將請求轉交給 DispatcherServlet。此時 DispatcherServlet 繼承自 HttpServlet,其 service() 方法會委派給 doDispatch() 開啟核心流程。
DispatcherServlet 根據請求資訊(URL、HTTP Method、Header、Parameter、Cookie 等)結合 HandlerMapping 介面的實現類(如 RequestMappingHandlerMapping),尋找能處理該請求的 Handler(通常是 @Controller 標註類中的 @RequestMapping 方法)。若找不到則拋出 NoHandlerFoundException,觸發 404 流程。
找到 Handler 後,DispatcherServlet 並不直接調用,而是透過 HandlerAdapter(如 RequestMappingHandlerAdapter)進行適配調用。這一設計體現了適配器模式,使框架能支援多種 Handler 類型(Controller、HttpRequestHandler、Servlet 等)。適配器負責參數綁定、類型轉換、數據驗證,最終執行目標方法並獲得返回值。
Controller 執行完業務邏輯後,封裝模型數據與邏輯視圖名,返回 ModelAndView 物件。若方法直接返回 String、View 或 void(自行渲染),框架內部會自動包裝為 ModelAndView。
ModelAndView 中的視圖名僅為邏輯名稱(如 "user/list"),非實際視圖物件。DispatcherServlet 委派 ViewResolver(如 InternalResourceViewResolver)將其解析為具體 View 實例(如 JstlView、FreeMarkerView、MappingJackson2JsonView 等)。
最終,DispatcherServlet 調用 View.render(model, request, response),將模型數據填充至模板,生成最終輸出(HTML、JSON、XML、PDF 等)並寫入 HTTP 響應流,完成一次完整的請求處理週期。
HandlerInterceptor 可在預處理、後處理、視圖渲染後三個階段插入邏輯(權限校驗、日誌、性能監控)@ControllerAdvice + @ExceptionHandler 實現全域異常統一處理HandlerMethodArgumentResolver / HandlerMethodReturnValueHandler 自定義參數綁定與響應封裝ContentNegotiationManager 依據 Accept Header 自動選擇 JSON/XML/HTML 輸出Spring MVC 以 DispatcherServlet 為核心,通過 HandlerMapping → HandlerAdapter → Controller → ViewResolver → View 的標準化流程,實現了請求處理的高度解耦與擴展性。掌握這一流程,是進階 Spring 開發、排查疑難雜症、設計高性能 Web 應用的基石。