| 組件 | 角色 | 核心職責 |
|---|---|---|
| DispatcherServlet | 前置控制器 | 統一入口,協調各組件處理請求 |
| HandlerMapping | 請求映射器 | URL → Controller 映射 |
| HandlerAdapter | 處理器適配器 | 統一調用 Controller 方法 |
| Controller | 控制器 | 業務邏輯處理 |
| HandlerInterceptor | 攔截器 | 預處理/後處理/視圖渲染前 |
| ViewResolver | 視圖解析器 | 邏輯視圖名 → 具體 View |
| View | 視圖 | 模型數據渲染輸出 |
context-param 中的 contextConfigLocationServletContext(鍵:WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)<servlet-name>-servlet.xml(預設)或自定義配置initStrategies 方法):protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context); // 文件上傳解析
initLocaleResolver(context); // 國際化解析
initThemeResolver(context); // 主題解析
initHandlerMappings(context); // 請求映射
initHandlerAdapters(context); // 處理器適配
initHandlerExceptionResolvers(context); // 異常解析
initRequestToViewNameTranslator(context); // 請求轉視圖名
initViewResolvers(context); // 視圖解析
initFlashMapManager(context); // 重定向數據傳遞
}


protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
for (HandlerMapping hm : this.handlerMappings) {
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) {
return handler; // 首個匹配即返回
}
}
return null;
}
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
for (HandlerAdapter ha : this.handlerAdapters) {
if (ha.supports(handler)) {
return ha;
}
}
throw new ServletException("No adapter for handler [" + handler + "]");
}
HandlerAdapter 調用攔截器鏈與 Controller 方法,最終返回 ModelAndView。
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
Locale locale = this.localeResolver.resolveLocale(request);
response.setLocale(locale);
View view;
if (mv.isReference()) {
// 邏輯視圖名解析
view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
} else {
// 直接使用 View 物件
view = mv.getView();
}
// 委派 View 渲染
view.render(mv.getModelInternal(), request, response);
}

SpringMVCDemo
├── src
│ └── me.cyan
│ └── WelcomeController.java
├── web
│ └── WEB-INF
│ ├── applicationContext.xml
│ ├── dispatcher-servlet.xml
│ └── web.xml
├── index.jsp
└── pom.xml
org.springframework
spring-webmvc
${spring-version}
commons-logging
commons-logging
1.2
contextConfigLocation
/WEB-INF/applicationContext.xml
org.springframework.web.context.ContextLoaderListener
dispatcher
org.springframework.web.servlet.DispatcherServlet
1
dispatcher
/
@Controller
public class WelcomeController {
@RequestMapping("/hello")
@ResponseBody
public String sayHello(@RequestParam String hello) {
return "hello Spring MVC! " + hello;
}
}

@RestController、@PathVariable、HTTP 動詞語義化@ControllerAdvice + @ExceptionHandler 實現全局異常捕獲@Valid + BindingResult 自動校驗Callable、DeferredResult、WebAsyncTask 釋放 Servlet 線程