Spring MVC 憑藉注解驅動開發與REST 風格 URL 支持,成為 Spring 3.0 最亮眼的特性之一。它讓普通 POJO 通過注解即可化身請求處理器,無需實現任何接口,極大降低了開發門檻。
Spring MVC 採用經典的前端控制器模式,DispatcherServlet 作為核心調度者:
在 web.xml 配置 Servlet 映射,例如所有 .html 後綴請求:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
通過 ContextLoaderListener 啟動業務層容器(ApplicationContext),DispatcherServlet 啟動 Web 層容器(WebApplicationContext)。Web 容器作為業務容器的子容器,可引用業務層 Bean,反之不可。
DispatcherServlet 啟動時自動掃描上下文 Bean,按名稱/類型匹配自定義組件(HandlerMapping、HandlerAdapter、ViewResolver 等),找不到則使用默認組件(定義在 DispatcherServlet.properties)。
@Controller + @RequestMapping 處理請求,返回視圖名/WEB-INF/views/支持 URL、參數、HTTP 方法、請求頭四個維度精準匹配:
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET, params = "version=1", headers = "Accept=application/json")
@InitBinder 註冊自定義編輯器(如 CustomDateEditor)核心接口 HttpMessageConverter<T> 負責 HTTP 報文與 Java 對象雙向轉換:
StringHttpMessageConverter:字符串處理FormHttpMessageConverter:表單數據 → MultiValueMapMappingJacksonHttpMessageConverter:JSON 處理(依賴 Jackson)Jaxb2RootElementHttpMessageConverter:XML 處理(依賴 JAXB)兩大註解利器:
@RequestBody / @ResponseBody:直接處理報文體HttpEntity<T> / ResponseEntity<T>:同時訪問報文頭與體| 方式 | 適用場景 | 關鍵點 |
|---|---|---|
ModelAndView | 需同時控制視圖與模型 | 手動構建對象,返回即可 |
@ModelAttribute | 預處理模型數據、表單回顯 | 方法級:預執行;參數級:綁定模型 |
Map/Model/ModelMap | 靈活操作模型數據 | 隱含模型自動注入,可增刪改查 |
@SessionAttributes | 跨請求共享模型數據 | 需配合 @ModelAttribute 預置數據,否則拋出 HttpSessionRequiredException |
@ExceptionHandler 方法@ControllerAdvice + @ExceptionHandler 處理所有 Controller 異常SimpleMappingExceptionResolver 映射異常類到錯誤視圖實現 HandlerInterceptor 接口(preHandle、postHandle、afterCompletion),在 MVC 配置中映射路徑,實現權限檢查、日誌記錄、性能監控等橫切關注點。
@NotEmpty、@Past 等)@Valid 觸發驗證,BindingResult 收集錯誤ResourceBundleMessageSource + locale.properties/locale_zh_CN.properties<fmt:message> 顯示國際化文本| 維度 | Spring MVC | Struts 2 |
|---|---|---|
| 開發基礎 | 方法級 | 類級 |
| 線程安全 | 單例安全(方法參數隔離) | 多例(屬性共享導致線程不安全) |
| 性能 | 高(輕量級) | 較低(標簽庫開銷大) |
| REST 支持 | 原生優秀 | 需插件支持 |
關鍵在於掃描策略分離:
ContextLoaderListener):掃描 Service、DAO、Component,**排除** @Controller/@ControllerAdviceDispatcherServlet):**僅掃描** @Controller/@ControllerAdvice避免重複掃描導致 Bean 重複創建、事務失效、內存洩漏等問題。
Spring MVC 以其優雅的設計、強大的擴展性、完美的 Spring 生態整合,成為 Java Web 開發的事實標準。掌握其核心原理(DispatcherServlet 工作流、九大組件協作)、註解驅動開發、數據綁定轉換、異常處理、攔截器機制,並遵循 IOC/MVC 容器分離原則,是成為高級 Java 開發者的必修課。