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

Spring MVC 核心原理與實戰全解析:從入門到精通

     編輯:Java 綜合教學

Spring MVC 核心原理與實戰全解析:從入門到精通

概述:為什麼選擇 Spring MVC?

Spring MVC 憑藉注解驅動開發與REST 風格 URL 支持,成為 Spring 3.0 最亮眼的特性之一。它讓普通 POJO 通過注解即可化身請求處理器,無需實現任何接口,極大降低了開發門檻。

核心架構:DispatcherServlet 總導演

Spring MVC 採用經典的前端控制器模式,DispatcherServlet 作為核心調度者:

  • 攔截所有匹配的 HTTP 請求
  • 委派給對應的處理器(Controller)
  • 協調視圖解析、模型數據綁定、異常處理等組件
  • 最終返回渲染後的視圖給客戶端

三大核心問題深度解析

問題一: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>

問題二:Web 容器與業務容器如何關聯?

通過 ContextLoaderListener 啟動業務層容器(ApplicationContext),DispatcherServlet 啟動 Web 層容器(WebApplicationContext)。Web 容器作為業務容器的子容器,可引用業務層 Bean,反之不可。

問題三:組件如何初始化並裝配到 DispatcherServlet?

DispatcherServlet 啟動時自動掃描上下文 Bean,按名稱/類型匹配自定義組件(HandlerMapping、HandlerAdapter、ViewResolver 等),找不到則使用默認組件(定義在 DispatcherServlet.properties)。

快速構建第一個 Spring MVC 應用

  1. 配置 web.xml:定義 DispatcherServlet 與業務層配置文件
  2. 編寫 Controller:@Controller + @RequestMapping 處理請求,返回視圖名
  3. 創建視圖:JSP 頁面放置於 /WEB-INF/views/
  4. 配置 Spring MVC:視圖解析器(InternalResourceViewResolver)添加前綴/後綴

核心功能模塊詳解

1. 請求過濾與映射(@RequestMapping)

支持 URL、參數、HTTP 方法、請求頭四個維度精準匹配:

@RequestMapping(value = "/user/{id}", method = RequestMethod.GET, params = "version=1", headers = "Accept=application/json")

2. 參數綁定與類型轉換

  • 基本類型/包裝類:自動匹配請求參數名與方法參數名
  • POJO 自動裝箱:請求參數自動填充對象屬性
  • 日期/集合等複雜類型:@InitBinder 註冊自定義編輯器(如 CustomDateEditor)

3. 請求體處理:HttpMessageConverter 家族

核心接口 HttpMessageConverter<T> 負責 HTTP 報文與 Java 對象雙向轉換:

  • StringHttpMessageConverter:字符串處理
  • FormHttpMessageConverter:表單數據 → MultiValueMap
  • MappingJacksonHttpMessageConverter:JSON 處理(依賴 Jackson)
  • Jaxb2RootElementHttpMessageConverter:XML 處理(依賴 JAXB)

兩大註解利器:

  • @RequestBody / @ResponseBody:直接處理報文體
  • HttpEntity<T> / ResponseEntity<T>:同時訪問報文頭與體

4. 模型數據傳遞四大方式

方式適用場景關鍵點
ModelAndView需同時控制視圖與模型手動構建對象,返回即可
@ModelAttribute預處理模型數據、表單回顯方法級:預執行;參數級:綁定模型
Map/Model/ModelMap靈活操作模型數據隱含模型自動注入,可增刪改查
@SessionAttributes跨請求共享模型數據需配合 @ModelAttribute 預置數據,否則拋出 HttpSessionRequiredException

5. 異常處理體系

  • 局部異常:Controller 內 @ExceptionHandler 方法
  • 全局異常:@ControllerAdvice + @ExceptionHandler 處理所有 Controller 異常
  • 配置式:SimpleMappingExceptionResolver 映射異常類到錯誤視圖

6. 攔截器機制

實現 HandlerInterceptor 接口(preHandle、postHandle、afterCompletion),在 MVC 配置中映射路徑,實現權限檢查、日誌記錄、性能監控等橫切關注點。

7. 表單驗證與國際化

  • 整合 Hibernate Validator(@NotEmpty、@Past 等)
  • @Valid 觸發驗證,BindingResult 收集錯誤
  • 錯誤消息國際化:ResourceBundleMessageSource + locale.properties/locale_zh_CN.properties
  • JSP 中使用 <fmt:message> 顯示國際化文本

Spring MVC 與 Struts 2 核心差異

維度Spring MVCStruts 2
開發基礎方法級類級
線程安全單例安全(方法參數隔離)多例(屬性共享導致線程不安全)
性能高(輕量級)較低(標簽庫開銷大)
REST 支持原生優秀需插件支持

Spring IOC 與 Spring MVC 整合最佳實踐

關鍵在於掃描策略分離:

  • 業務層容器(ContextLoaderListener):掃描 Service、DAO、Component,**排除** @Controller/@ControllerAdvice
  • Web 層容器(DispatcherServlet):**僅掃描** @Controller/@ControllerAdvice

避免重複掃描導致 Bean 重複創建、事務失效、內存洩漏等問題。

總結

Spring MVC 以其優雅的設計、強大的擴展性、完美的 Spring 生態整合,成為 Java Web 開發的事實標準。掌握其核心原理(DispatcherServlet 工作流、九大組件協作)、註解驅動開發、數據綁定轉換、異常處理、攔截器機制,並遵循 IOC/MVC 容器分離原則,是成為高級 Java 開發者的必修課。

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