聲明:本文匯總 Spring MVC 4.2 幾乎所有核心技術點,作為查閱手冊。篇幅較長,建議使用 Ctrl+F 搜尋關鍵字。歡迎加入 Java 編程交流群:574337670。
核心架構圍繞 DispatcherServlet(前端控制器模式),負責請求分發、處理器映射、視圖渲染、本地化、主題、檔案上傳等。處理器為標註 @Controller、@RequestMapping 的類與方法,Spring 3.0+ 提供豐富註解支援 RESTful 開發。
設計原則:「對擴展開放,對修改關閉」。核心類多標註 final,不建議繼承覆寫。

<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/example-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping>
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
ServletRegistration.Dynamic reg = container.addServlet("dispatcher", new DispatcherServlet());
reg.setLoadOnStartup(1);
reg.addMapping("/example/*");
}
}
每個 DispatcherServlet 持有獨立的 WebApplicationContext,繼承自根 Context(共享 Service、DAO 等)。可在 web.xml 設定 contextConfigLocation 為空,僅使用根 Context。

| Bean 類型 | 職責 |
|---|---|
HandlerMapping | 請求 URL → Handler + 攔截器鏈 |
HandlerAdapter | 統一調用 Handler,屏蔽具體調用細節 |
HandlerExceptionResolver | 異常 → 視圖/響應 |
ViewResolver | 邏輯視圖名 → View 實例 |
LocaleResolver | 解析客戶端 Locale/時區 |
ThemeResolver | 解析主題資源 |
MultipartResolver | 多部分請求(檔案上傳)解析 |
FlashMapManager | 重定向間傳遞閃存屬性 |
WebApplicationContext、LocaleResolver、ThemeResolver 到請求屬性。MultipartHttpServletRequest。HandlerMapping 尋找匹配 Handler,獲取 HandlerExecutionChain。HandlerAdapter 調用 Handler,獲取 ModelAndView。preHandle → postHandle → afterCompletion。<context:component-scan base-package="..."/> 自動掃描註冊。/appointments)。consumes/produces)。{var})、Ant 風格通配符 (*.do)、正則表達式 ({var:regex})、矩陣變量 (;k=v)。支援參數類型: Servlet API 對象、WebRequest、Locale/TimeZone、InputStream/Reader、OutputStream/Writer、HttpMethod、Principal、@PathVariable、@MatrixVariable、@RequestParam、@RequestHeader、@RequestBody、@RequestPart、HttpEntity、Map/Model/ModelMap、RedirectAttributes、命令/表單對象、Errors/BindingResult、SessionStatus、UriComponentsBuilder。
注意: BindingResult 必須緊跟其驗證對象之後。
支援返回類型: ModelAndView、Model/Map、View、String (視圖名)、void (自行寫響應)、@ResponseBody 任意類型 (經 HttpMessageConverter 轉換)、HttpEntity/ResponseEntity、HttpHeaders、異步類型 (Callable, DeferredResult, ListenableFuture, ResponseBodyEmitter, SseEmitter, StreamingResponseBody)。
@RequestParam:綁定查詢參數,required=false 可選,支援 Map/MultiValueMap 批量綁定。@RequestBody:綁定請求體,經 HttpMessageConverter 轉換 (JSON、XML、表單等)。可配合 @Valid 驗證。@ResponseBody:返回值直接寫響應體。@RestController = @Controller + @ResponseBody。HttpEntity:同時存取 Header 與 Body。@ModelAttribute (方法):@RequestMapping 前執行,填充模型公共屬性 (下拉選單、表單預設值)。@ModelAttribute (參數):從模型獲取/實例化命令對象 → 數據綁定 → 驗證 (配合 BindingResult、@Valid)。@SessionAttributes:跨請求保存模型屬性至 Session。@CookieValue、@RequestHeader:綁定 Cookie/Header,支援類型轉換與集合映射。@InitBinder:定制 WebDataBinder,註冊自定義 PropertyEditor 或 Formatter。@ControllerAdvice:全局/切面級 @ExceptionHandler、@InitBinder、@ModelAttribute,支援按註解、包、類型篩選目標 Controller。ResponseBodyEmitter (多對象)、SseEmitter (Server-Sent Events)、StreamingResponseBody (直接寫 OutputStream)。web.xml <async-supported>true</async-supported>,過濾器需支援 ASYNC 分派。Spring MVC 配置 configureAsyncSupport 設定超時、任務執行器、攔截器。RequestMappingHandlerMapping 自動掃描 @RequestMapping。HandlerInterceptor:preHandle (返回 false 終止鏈)、postHandle、afterCompletion。配置於 interceptors 屬性或 MVC 命名空間 <mvc:interceptors>。AsyncHandlerInterceptor、CallableProcessingInterceptor、DeferredResultProcessingInterceptor。ViewResolver 介面:InternalResourceViewResolver (JSP)、VelocityViewResolver、FreeMarkerViewResolver、ContentNegotiatingViewResolver (內容協商) 等。order 控制優先序,InternalResourceViewResolver 應置最後。redirect: 前綴 (解耦)、RedirectAttributes 傳參、FlashAttributes (Session 級閃存)。forward: 前綴 (強制 Servlet/JSP 引擎處理)。Accept Header 選擇視圖/消息轉換器。FlashMap 存儲閃存屬性,FlashMapManager 管理。重定向前暫存 Session,重定向後取用並移除。RedirectView 記錄目標 URL,FlashMapManager 匹配 URL 減少併發誤取風險。
UriComponentsBuilder、ServletUriComponentsBuilder:從請求/模板構建 URI。MvcUriComponentsBuilder:通過方法名/代理構建 Controller 方法鏈接,支援相對路徑、地區前綴等進階場景。LocaleResolver:AcceptHeaderLocaleResolver、CookieLocaleResolver、SessionLocaleResolver。LocaleChangeInterceptor:參數驅動切換語言。ThemeSource (預設 ResourceBundleThemeSource) 定義靜態資源集合,ThemeResolver (Fixed/Session/Cookie) 解析當前主題,JSP 用 <spring:theme> 套用。CommonsMultipartResolver (需 commons-fileupload) 或 Servlet 3.0 StandardServletMultipartResolver (需 multipart-config)。MultipartFile 或 Part 接收。@RequestPart 處理複雜 Multipart 請求 (如 JSON + File 混合),自動套用 HttpMessageConverter。HandlerExceptionResolver 介面,SimpleMappingExceptionResolver (異常→視圖)。@ExceptionHandler:方法級異常處理,支援靈活參數/返回值 (ResponseEntity、@ResponseBody)。DefaultHandlerExceptionResolver:Spring MVC 內建異常 → HTTP 狀態碼 (400, 404, 405, 415, 500 等)。@ResponseStatus:業務異常標註狀態碼。<error-page> 免映射自定義錯誤頁,Controller 可讀 javax.servlet.error.* 請求屬性。CsrfFilter + CsrfRequestDataValueProcessor。ControllerClassNameHandlerMapping:類名 ViewShoppingCartController → /viewshoppingcart*。ModelMap:自動生成鍵名 (類名首字母小寫、集合加 List 後綴)。DefaultRequestToViewNameTranslator:無視圖名時從 URL 推導 (如 /registration.html → registration)。CacheControl 建構器:maxAge、noStore、cachePublic、noTransform 等指令組合。ResourceHttpRequestHandler 配置 CacheControl。ResponseEntity 設 cacheControl/eTag/lastModified,或 WebRequest.checkNotModified() 快速返回 304。ShallowEtagHeaderFilter 過濾器基於響應體 MD5 生成 ETag,節省頻寬但不節省 CPU。WebApplicationInitializer 或繼承 AbstractDispatcherServletInitializer/AbstractAnnotationConfigDispatcherServletInitializer。getServletMappings()、getServletConfigClasses()、getServletFilters() 等。@EnableWebMvc / <mvc:annotation-driven> 啟用預設配置。WebMvcConfigurer / WebMvcConfigurerAdapter 定制:addFormatters、getValidator、addInterceptors、configureContentNegotiation、addViewControllers、configureViewResolvers、configureDefaultServletHandling、configurePathMatch、configureMessageConverters/extendMessageConverters。@EnableWebMvc,繼承 DelegatingWebMvcConfiguration 覆寫 @Bean 方法;XML 用 BeanPostProcessor 後處理 Bean。—— 全文完 ——