首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC 4.2 核心技術參考手冊:從 DispatcherServlet 到異步處理全景解析

     編輯:Java 綜合教學

Spring MVC 4.2 核心技術參考手冊:從 DispatcherServlet 到異步處理全景解析

聲明:本文匯總 Spring MVC 4.2 幾乎所有核心技術點,作為查閱手冊。篇幅較長,建議使用 Ctrl+F 搜尋關鍵字。歡迎加入 Java 編程交流群:574337670。

21.1 Spring Web MVC 框架簡介

核心架構圍繞 DispatcherServlet(前端控制器模式),負責請求分發、處理器映射、視圖渲染、本地化、主題、檔案上傳等。處理器為標註 @Controller、@RequestMapping 的類與方法,Spring 3.0+ 提供豐富註解支援 RESTful 開發。

設計原則:「對擴展開放,對修改關閉」。核心類多標註 final,不建議繼承覆寫。

DispatcherServlet 處理流程圖

核心優勢

  • 職責清晰分離(Controller、Validator、ViewResolver 等各司其職)
  • 強大的 Bean 配置與跨上下文引用
  • 非侵入式、靈活的方法簽名與註解支援
  • 可復用業務碼,無需繼承框架基類
  • 可定制數據綁定、驗證、類型轉換
  • 靈活的 HandlerMapping、ViewResolver 策略
  • Map 模型解耦視圖技術(JSP、Velocity、FreeMarker、JSON、XML...)
  • 完善的 JSP 標籤庫支援
  • 請求/會話/全局會話 Scope Bean

21.2 DispatcherServlet 核心配置與處理流程

web.xml 傳統配置

<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>

Servlet 3.0+ 程式化配置

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/*");
    }
}

WebApplicationContext 層級關係

每個 DispatcherServlet 持有獨立的 WebApplicationContext,繼承自根 Context(共享 Service、DAO 等)。可在 web.xml 設定 contextConfigLocation 為空,僅使用根 Context。

Context 層級關係 單一根 Context 配置

DispatcherServlet 依賴的特殊 Bean 類型

Bean 類型職責
HandlerMapping請求 URL → Handler + 攔截器鏈
HandlerAdapter統一調用 Handler,屏蔽具體調用細節
HandlerExceptionResolver異常 → 視圖/響應
ViewResolver邏輯視圖名 → View 實例
LocaleResolver解析客戶端 Locale/時區
ThemeResolver解析主題資源
MultipartResolver多部分請求(檔案上傳)解析
FlashMapManager重定向間傳遞閃存屬性

請求處理流程 (doDispatch 簡化版)

  1. 綁定 WebApplicationContext、LocaleResolver、ThemeResolver 到請求屬性。
  2. 若為 Multipart 請求,包裝為 MultipartHttpServletRequest。
  3. 遍歷 HandlerMapping 尋找匹配 Handler,獲取 HandlerExecutionChain。
  4. 若無 Handler,返回 404。
  5. 透過 HandlerAdapter 調用 Handler,獲取 ModelAndView。
  6. 執行攔截器 preHandle → postHandle → afterCompletion。
  7. 視圖渲染或直接寫響應流。

21.3 Controller 實現詳解(註解驅動)

@Controller 定義控制器

  • 標識類為控制器角色,無需繼承基類或實現介面。
  • 配合 <context:component-scan base-package="..."/> 自動掃描註冊。

@RequestMapping 映射請求

  • 類級別:基礎路徑前綴(如 /appointments)。
  • 方法級別:細化 HTTP 方法、參數條件、Header 條件、媒體類型 (consumes/produces)。
  • 支援 URI 模板 ({var})、Ant 風格通配符 (*.do)、正則表達式 ({var:regex})、矩陣變量 (;k=v)。
  • 路徑匹配優先序:變量/通配符少 → 路徑長 → 通配符少 → 非預設模式。

Handler 方法簽名完全指南

支援參數類型: 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。

異步請求處理 (Servlet 3.0+)

  • Callable:Spring MVC 管理線程池執行,返回值異步產生。
  • DeferredResult:任意線程 (JMS、定時任務) 設值,適合事件驅動。
  • HTTP Streaming:ResponseBodyEmitter (多對象)、SseEmitter (Server-Sent Events)、StreamingResponseBody (直接寫 OutputStream)。
  • 配置:web.xml <async-supported>true</async-supported>,過濾器需支援 ASYNC 分派。Spring MVC 配置 configureAsyncSupport 設定超時、任務執行器、攔截器。

21.4 HandlerMapping 與攔截器

  • 註解驅動下 RequestMappingHandlerMapping 自動掃描 @RequestMapping。
  • HandlerInterceptor:preHandle (返回 false 終止鏈)、postHandle、afterCompletion。配置於 interceptors 屬性或 MVC 命名空間 <mvc:interceptors>。
  • 異步攔截需實現 AsyncHandlerInterceptor、CallableProcessingInterceptor、DeferredResultProcessingInterceptor。

21.5 視圖解析體系

  • ViewResolver 介面:InternalResourceViewResolver (JSP)、VelocityViewResolver、FreeMarkerViewResolver、ContentNegotiatingViewResolver (內容協商) 等。
  • 視圖鏈:多 Resolver 串聯,order 控制優先序,InternalResourceViewResolver 應置最後。
  • 重定向:redirect: 前綴 (解耦)、RedirectAttributes 傳參、FlashAttributes (Session 級閃存)。
  • 轉發:forward: 前綴 (強制 Servlet/JSP 引擎處理)。
  • 內容協商:根據副檔名或 Accept Header 選擇視圖/消息轉換器。

21.6 FlashAttributes 跨重定向傳值

FlashMap 存儲閃存屬性,FlashMapManager 管理。重定向前暫存 Session,重定向後取用並移除。RedirectView 記錄目標 URL,FlashMapManager 匹配 URL 減少併發誤取風險。

21.7 URI 構建與控制器鏈接

  • UriComponentsBuilder、ServletUriComponentsBuilder:從請求/模板構建 URI。
  • MvcUriComponentsBuilder:通過方法名/代理構建 Controller 方法鏈接,支援相對路徑、地區前綴等進階場景。

21.8 國際化 (Locale) 與 21.9 主題

  • LocaleResolver:AcceptHeaderLocaleResolver、CookieLocaleResolver、SessionLocaleResolver。
  • LocaleChangeInterceptor:參數驅動切換語言。
  • 主題:ThemeSource (預設 ResourceBundleThemeSource) 定義靜態資源集合,ThemeResolver (Fixed/Session/Cookie) 解析當前主題,JSP 用 <spring:theme> 套用。

21.10 Multipart 檔案上傳支援

  • CommonsMultipartResolver (需 commons-fileupload) 或 Servlet 3.0 StandardServletMultipartResolver (需 multipart-config)。
  • Controller 參數用 MultipartFile 或 Part 接收。
  • @RequestPart 處理複雜 Multipart 請求 (如 JSON + File 混合),自動套用 HttpMessageConverter。

21.11 異常處理體系

  • HandlerExceptionResolver 介面,SimpleMappingExceptionResolver (異常→視圖)。
  • @ExceptionHandler:方法級異常處理,支援靈活參數/返回值 (ResponseEntity、@ResponseBody)。
  • DefaultHandlerExceptionResolver:Spring MVC 內建異常 → HTTP 狀態碼 (400, 404, 405, 415, 500 等)。
  • @ResponseStatus:業務異常標註狀態碼。
  • Servlet 3.0 <error-page> 免映射自定義錯誤頁,Controller 可讀 javax.servlet.error.* 請求屬性。

21.12 Web 安全、21.13 約定優於配置

  • CSRF 防護:CsrfFilter + CsrfRequestDataValueProcessor。
  • ControllerClassNameHandlerMapping:類名 ViewShoppingCartController → /viewshoppingcart*。
  • ModelMap:自動生成鍵名 (類名首字母小寫、集合加 List 後綴)。
  • DefaultRequestToViewNameTranslator:無視圖名時從 URL 推導 (如 /registration.html → registration)。

21.14 HTTP 快取支援

  • CacheControl 建構器:maxAge、noStore、cachePublic、noTransform 等指令組合。
  • 靜態資源:ResourceHttpRequestHandler 配置 CacheControl。
  • Controller 中:ResponseEntity 設 cacheControl/eTag/lastModified,或 WebRequest.checkNotModified() 快速返回 304。
  • 淺 ETag:ShallowEtagHeaderFilter 過濾器基於響應體 MD5 生成 ETag,節省頻寬但不節省 CPU。

21.15 程式化 Servlet 容器初始化

  • 實現 WebApplicationInitializer 或繼承 AbstractDispatcherServletInitializer/AbstractAnnotationConfigDispatcherServletInitializer。
  • 覆寫 getServletMappings()、getServletConfigClasses()、getServletFilters() 等。

21.16 MVC Java Config / XML 命名空間高階配置

  • @EnableWebMvc / <mvc:annotation-driven> 啟用預設配置。
  • WebMvcConfigurer / WebMvcConfigurerAdapter 定制:addFormatters、getValidator、addInterceptors、configureContentNegotiation、addViewControllers、configureViewResolvers、configureDefaultServletHandling、configurePathMatch、configureMessageConverters/extendMessageConverters。
  • 高階定制:移除 @EnableWebMvc,繼承 DelegatingWebMvcConfiguration 覆寫 @Bean 方法;XML 用 BeanPostProcessor 後處理 Bean。

—— 全文完 ——

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved