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

Spring Framework 參考文檔翻譯:15.2 DispatcherServlet 核心流程解析

     編輯:Java 綜合教學

前言

Spring Web MVC 的核心是 DispatcherServlet,它扮演前端控制器角色,統一接收 HTTP 請求並委派給下游組件處理。本文基於官方文檔 15.2 節,結合源碼關鍵點,梳理其核心工作流程與配置要點。

DispatcherServlet 請求處理流程

  1. 請求進入:DispatcherServlet.doDispatch() 接收 HttpServletRequest/HttpServletResponse。
  2. 多部分解析:若為 multipart 請求(檔案上傳),委派 MultipartResolver 解析。
  3. 處理器映射:遍歷 HandlerMapping 列表,根據 URL 找到 HandlerExecutionChain(含 Controller + 攔截器鏈)。
  4. 處理器適配:遍歷 HandlerAdapter 列表,找到支援該 Controller 的適配器(如 RequestMappingHandlerAdapter)。
  5. 攔截器預處理:按順序調用 HandlerInterceptor.preHandle(),任一返回 false 中斷流程。
  6. 執行 Controller:適配器調用 Controller 方法,完成參數綁定、驗證、業務邏輯,返回 ModelAndView。
  7. 攔截器後處理:調用 HandlerInterceptor.postHandle(),可修改模型或視圖。
  8. 視圖解析:遍歷 ViewResolver,將邏輯視圖名解析為具體 View 實例(JSP、Thymeleaf、JSON 等)。
  9. 視圖渲染:View.render(model, request, response) 輸出最終響應。
  10. 攔截器完成回調:調用 HandlerInterceptor.afterCompletion(),釋放資源、記錄日誌等。

關鍵組件配置要點

組件典型實現配置方式
HandlerMappingRequestMappingHandlerMapping<mvc:annotation-driven/> 自動註冊
HandlerAdapterRequestMappingHandlerAdapter同上自動註冊,支援 @RequestBody、@ResponseBody
ViewResolverInternalResourceViewResolver (JSP)配置 prefix/suffix,或 ThymeleafViewResolver
MultipartResolverStandardServletMultipartResolverServlet 3.0+ 容器自動支援,或 CommonsMultipartResolver
LocaleResolverAcceptHeaderLocaleResolver可自定 Cookie/Session 策略
ThemeResolverFixedThemeResolver主題切換較少用,可忽略

web.xml 部署描述

<servlet>
    <servlet-name>spring</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>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

contextConfigLocation 指向 Spring MVC 配置檔;load-on-startup 確保容器啟動時初始化。

Spring MVC 配置檔精簡範例

<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:mvc="https://www.springframework.org/schema/mvc"
       xmlns:context="https://www.springframework.org/schema/context"
       xsi:schemaLocation="...">

    <!-- 掃描 Controller -->
    <context:component-scan base-package="com.example.controller"/>

    <!-- 註解驅動:HandlerMapping + HandlerAdapter + 消息轉換器 -->
    <mvc:annotation-driven/>

    <!-- 視圖解析器 (JSP) -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 靜態資源映射 -->
    <mvc:resources mapping="/static/**" location="/static/"/>
</beans>

常見問題與調試技巧

  • 404 無法找到 Handler:檢查 @RequestMapping 路徑、component-scan 包路徑、url-pattern 是否為 / 而非 /*。
  • 參數綁定失敗:開啟 org.springframework.web DEBUG 日誌,觀察 HandlerMethodArgumentResolver 執行情況。
  • 視圖解析異常:確認 ViewResolver 順序、邏輯視圖名拼寫、JSP 檔案實際路徑。

總結

DispatcherServlet 以「策略模式」組合 HandlerMapping、HandlerAdapter、ViewResolver 等介面,實現高度可擴展的請求處理管線。理解其流程與核心組件職責,是排查 Spring MVC 問題、進行深度定製的基礎。

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