DispatcherServlet 是 Spring MVC 的核心前端控制器,統籌整個請求處理流程。本文通過關鍵源碼節點,梳理其核心執行鏈路。
doDispatch(request, response) 入口HandlerMapping.getHandler() 遍歷映射器查找匹配的 HandlerExecutionChainHandlerAdapter.handle() 執行目標方法,獲得 ModelAndViewprocessDispatchResult → render → ViewResolver.resolveViewName → View.render() 將模型數據填充至請求域並輸出響應protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerExecutionChain mappedHandler = null;
// ... 省略 multipart 處理
mappedHandler = getHandler(processedRequest); // 步驟 2
// ...
ModelAndView mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); // 步驟 3
// ...
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); // 步驟 4
}
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
for (HandlerMapping hm : this.handlerMappings) {
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) return handler;
}
return null;
}
// processDispatchResult → render
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
View view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request); // 視圖解析
view.render(mv.getModelInternal(), request, response); // 視圖渲染,模型數據填充請求域
}
請求 → DispatcherServlet.doDispatch
→ HandlerMapping.getHandler() → HandlerExecutionChain
→ HandlerAdapter.handle() → ModelAndView
→ ViewResolver.resolveViewName() → View
→ View.render(model, request, response) → 響應
HandlerExecutionChain 中的攔截器鏈執行順序HandlerAdapter 如何支援多種 Handler 類型(Controller、HttpRequestHandler、Servlet 等)HandlerExceptionResolver 整合點本文為源碼閱讀入門,建議進一步研讀 DispatcherServlet、RequestMappingHandlerMapping、RequestMappingHandlerAdapter 完整源碼,構建完整心智模型。