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

Spring MVC 學習筆記 (一):核心流程圖解與 DispatcherServlet 請求處理鏈路

     編輯:Java 綜合教學

Spring MVC 學習筆記 (一):核心流程圖解與 DispatcherServlet 請求處理鏈路

Spring MVC 作為 Java Web 開發事實標準,其核心在於 DispatcherServlet 作為前端控制器,統籌請求處理全流程。本文通過兩張流程圖深度解析 MVC 與 Spring MVC 執行鏈路。

經典 MVC 流程 (概念模型)

MVC 概念流程圖

  1. 用戶發起請求 → 前端控制器
  2. 前端控制器 根據 URL 決定選擇哪個頁面控制器,委托處理
  3. 頁面控制器 收集綁定請求參數 → 命令對象 → 驗證 → 委托業務對象
  4. 業務處理完成 返回 ModelAndView (模型數據 + 邏輯視圖名)
  5. 前端控制器 根據邏輯視圖名選擇視圖渲染器,注入模型數據
  6. 視圖渲染輸出 → 響應返回用戶

Spring MVC 具體執行流程

Spring MVC 詳細流程圖

核心組件職責解析

組件角色關鍵接口/類說明
前端控制器統一入口、調度核心DispatcherServlet繼承 FrameworkServlet,載入 WebApplicationContext
處理器映射器URL → Controller 映射HandlerMapping (RequestMappingHandlerMapping)掃描 @RequestMapping 建立映射關係
處理器適配器統一調用 Controller 方法HandlerAdapter (RequestMappingHandlerAdapter)支援多種 Controller 類型,參數綁定、返回值處理
頁面控制器業務邏輯入口@Controller + @RequestMappingPOJO 形式,無需實現接口
視圖解析器邏輯視圖名 → 視圖實例ViewResolver (InternalResourceViewResolver)前綴 + 後綴拼接 JSP 路徑
視圖渲染輸出View (JspView, ThymeleafView...)合併模型數據輸出 HTML/JSON/XML

關鍵流程細節

1. 請求進入 DispatcherServlet.doDispatch()

// 簡化核心邏輯
HandlerExecutionChain chain = handlerMapping.getHandler(request);
HandlerAdapter adapter = getHandlerAdapter(chain.getHandler());
ModelAndView mv = adapter.handle(request, response, chain.getHandler());
processDispatchResult(request, response, mv);

2. 參數綁定與類型轉換

  • HandlerAdapter 利用 HandlerMethodArgumentResolver 解析方法參數
  • 支援:@RequestParam, @PathVariable, @RequestBody, @ModelAttribute, POJO 綁定等
  • 類型轉換服務:ConversionService + Formatter

3. 返回值處理策略

  • HandlerMethodReturnValueHandler 處理不同返回類型
  • ModelAndView、View、String (視圖名)、@ResponseBody (直接寫回響應體)、ResponseEntity、void (自行處理響應)

4. 視圖解析與渲染

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/jsp/"/>
  <property name="suffix" value=".jsp"/>
</bean>

邏輯視圖名 "user/list" → /WEB-INF/jsp/user/list.jsp

配置要點 (XML 風格)

<!-- 1. 載入 Spring MVC 配置 -->
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/spring-mvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern> <!-- 攔截所有請求 -->
</servlet-mapping>

<!-- 2. 編碼過濾器 (必須在最前) -->
<filter>
  <filter-name>characterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>

下一篇預告

將深入剖析:@RequestMapping 進階匹配規則、參數綁定原理、異常統一處理 (@ControllerAdvice)、攔截器鏈、文件上傳、RESTful API 設計。

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