Spring MVC設計與實現

DispatcherServlet的初始化與請求處理流程

初始化階段
  • Servlet 生命周期觸發:當 Web 容器(如 Tomcat)啟動時,根據注解/配置,DispatcherServlet 的 init() 方法被調用。

  • 初始化 WebApplicationContext

    • 根 WebApplicationContext:由 ContextLoaderListener 加載,包含 Service、DAO 等非 Web 層 Bean。
    • DispatcherServlet 子上下文:專屬于 Servlet,包含 Controller、ViewResolver 等 Web 層 Bean,繼承根上下文。
  • 初始化策略組件

    • HandlerMapping:將請求映射到處理器(Controller 方法),如 RequestMappingHandlerMapping
    • HandlerAdapter:執行處理器方法,適配不同處理器類型,如 RequestMappingHandlerAdapter
    • HandlerExceptionResolver:處理請求過程中拋出的異常。
    • ViewResolver:解析邏輯視圖名到具體視圖(如 JSP、Thymeleaf)。
    • LocaleResolver:解析客戶端區域信息(國際化)。
    • ThemeResolver:解析主題信息。
    • RequestToViewNameTranslator:請求到視圖名的默認轉換。
    • FlashMapManager:管理 Flash 屬性(重定向時的臨時數據存儲)。
    • MultipartResolver:處理文件上傳請求。
  • 默認組件加載規則

    • 按類型查找:從容器中查找對應類型的 Bean(如 ViewResolver)。
    • 默認策略:若未找到,加載 DispatcherServlet.properties 中定義的默認實現類。
請求處理階段
  • 請求到達與分發:當 HTTP 請求到達時,Servlet 容器的 service() 方法觸發,最終調用

  • 獲取處理器執行鏈(HandlerExecutionChain)

    • HandlerMapping的作用:根據請求 URL 匹配對應處理器(Controller方法),并收集關聯攔截器(HandlerInterceptor)。
    • 匹配優先級RequestMappingHandlerMapping(基于 @RequestMapping)優先于 BeanNameUrlHandlerMapping
  • 獲取處理器適配器(HandlerAdapter)

    • 適配器模式:不同處理器(如基于注解的 @Controller、傳統的 Controller 接口)需要不同的適配器執行。

    • 常用適配器

      RequestMappingHandlerAdapter:處理 @RequestMapping 方法。

      HttpRequestHandlerAdapter:處理 HttpRequestHandler(如靜態資源處理)。

      SimpleControllerHandlerAdapter:處理 Controller 接口實現類。

  • 執行處理器方法

    • 參數解析與綁定HandlerMethodArgumentResolver 解析方法參數(如 @RequestParam@RequestBody)。
    • 返回值處理HandlerMethodReturnValueHandler 處理返回值(如 @ResponseBody 轉 JSON)。
  • 視圖渲染

    • ViewResolver:解析視圖名(如 "home")為 View 對象(如 InternalResourceView)。
    • View:渲染模型數據(如填充 JSP 中的 ${message})。
  • 異常處理

    • HandlerExceptionResolver:捕獲處理器方法或攔截器拋出的異常,生成錯誤視圖或狀態碼(如 @ExceptionHandler)。
    • 默認實現ExceptionHandlerExceptionResolver(處理 @ExceptionHandler 方法)、ResponseStatusExceptionResolver(處理 @ResponseStatus 注解)。
  • 攔截器(Interceptor)的執行順序

    • preHandle():請求處理前執行(如權限校驗)。
    • postHandle():處理器方法執行后,視圖渲染前執行(如修改模型數據)。
    • afterCompletion():整個請求完成后執行(如資源清理)。

HandlerMapping與HandlerAdapter的職責解析

HandlerMapping:請求與處理器的映射器
  • 核心職責

    • 請求路由:根據HTTP請求的URL、請求方法(GET/POST等)、請求頭等信息,找到對應的處理器(Handler)。

    • 處理器鏈構建:返回一個HandlerExecutionChain對象,包含目標處理器及其關聯的攔截器(HandlerInterceptor)。

    • 多策略支持:支持不同類型的映射策略(如基于注解、基于XML配置、基于Bean名稱等)。

  • 常見實現類

    • RequestMappingHandlerMapping:處理@RequestMapping注解(包括@GetMapping@PostMapping等衍生注解)。
    • BeanNameUrlHandlerMapping:根據Bean名稱與URL匹配(如Bean名以/開頭)。
    • SimpleUrlHandlerMapping: 通過XML或Java配置顯式映射URL到處理器(如靜態資源處理)。
  • 工作流程

    • 請求匹配:遍歷所有注冊的HandlerMapping,調用其getHandler()方法,直到找到匹配的處理器。
    • 攔截器綁定:將匹配的處理器與配置的攔截器組合成HandlerExecutionChain
    • 優先級控制:通過Order注解或實現Ordered接口調整多個HandlerMapping的執行順序。
HandlerAdapter:處理器的適配執行器
  • 核心職責

    • 處理器適配:將不同類型的處理器(如@ControllerHttpRequestHandler)統一適配為可執行的邏輯。

    • 方法調用:反射調用處理器方法,處理參數綁定、返回值轉換等細節。

    • 異常處理:捕獲處理器執行過程中的異常,轉換為統一的處理流程。

  • 常見實現類

    • RequestMappingHandlerAdapter:適配基于@RequestMapping的處理器方法(最常用)。
    • HttpRequestHandlerAdapter:適配HttpRequestHandler接口(如處理靜態資源的ResourceHttpRequestHandler)。
    • SimpleControllerHandlerAdapter:適配實現Controller接口的傳統處理器。
  • 工作流程

    • 適配器選擇:根據處理器類型選擇對應的HandlerAdapter
    • 參數解析:通過HandlerMethodArgumentResolver解析請求參數(如@RequestParam@RequestBody)。
    • 方法執行:反射調用處理器方法,獲取返回值。
    • 返回值處理:通過HandlerMethodReturnValueHandler處理返回值(如@ResponseBody轉JSON)。

視圖解析與渲染

ViewResolver(視圖解析器)
  • 作用:將控制器返回的 邏輯視圖名(如 "home")解析為具體的 View 對象
  • 核心方法View resolveViewName(String viewName, Locale locale)
  • 實現類
    • InternalResourceViewResolver:解析 JSP、HTML 等內部資源視圖。
    • ThymeleafViewResolver:解析 Thymeleaf 模板。
    • ContentNegotiatingViewResolver:根據請求的媒體類型(如 Accept 頭)協商視圖。
    • JsonViewResolver:返回 JSON 視圖(如結合 @ResponseBody)。
View(視圖)
  • 作用:負責將模型數據(Model)渲染為具體的響應內容(如生成 HTML、寫入 JSON)。
  • 核心方法void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
  • 實現類
    • InternalResourceView:渲染 JSP 頁面。
    • ThymeleafView:渲染 Thymeleaf 模板。
    • MappingJackson2JsonView:將模型數據轉為 JSON 響應。
    • AbstractPdfView:生成 PDF 文件。
視圖解析與渲染流程
  • 控制器返回視圖名:控制器方法返回 String 類型的視圖名(如 return "home";)或 ModelAndView 對象。
  • DispatcherServlet 委托 ViewResolver 解析DispatcherServlet 遍歷所有注冊的 ViewResolver,調用 resolveViewName() 方法,直到找到第一個非 nullView 對象。
    • 優先級控制:通過 Order 注解或實現 Ordered 接口調整 ViewResolver 的執行順序。
  • View 渲染模型數據:獲取 View 對象后,調用其 render() 方法,將模型數據與響應結合:
  • 響應返回客戶端:最終生成的 HTML、JSON 或其他內容通過 HttpServletResponse 返回客戶端。

參數綁定與數據轉換

參數綁定
  • 作用:將外部輸入(如 HTTP 請求參數、配置文件值)映射到方法參數或對象屬性。
  • 場景:控制器方法通過@RequestParam綁定請求參數;配置文件通過@Value注入屬性值;AOP切面中攔截方法參數進行修改驗證。
數據轉換
  • 作用:將字符串或其他類型的輸入數據轉換為目標類型(如 StringDate)。
  • 核心組件
    • Converter<S, T>:通用類型轉換接口(如 StringInteger)。
    • Formatter<T>:面向區域(Locale)的格式化接口(如 Date ? String)。
    • ConversionService:統一管理所有轉換器,提供類型轉換服務。
Converter 與 Formatter
  • Converter(類型轉換器):適用于通用的類型轉換邏輯,無需考慮區域(Locale)。
  • Formatter(格式化器):需考慮區域化的格式化(如日期、貨幣)。
  • 自動生效:Spring 在參數綁定時自動調用 ConversionService 完成轉換。

異常處理機制

核心組件與職責
  • HandlerExceptionResolver:解析異常并生成錯誤視圖或響應,是異常處理的頂層接口。
  • @ExceptionHandler:注解在方法上,標記該方法用于處理特定類型的異常(通常結合 @ControllerAdvice)。
  • @ControllerAdvice:定義全局異常處理類,集中處理多個控制器的異常。
  • DefaultHandlerExceptionResolver:Spring 默認實現,處理標準 Spring MVC 異常。
  • ResponseStatusExceptionResolver:根據 @ResponseStatus 注解設置 HTTP 狀態碼和錯誤信息。
  • ExceptionHandlerExceptionResolver:處理 @ExceptionHandler 注解標記的方法,最常用的異常處理器。
異常處理流程
  • 查找匹配的 @ExceptionHandler:在拋出異常的控制器類中查找 @ExceptionHandler 方法;若未找到,在 @ControllerAdvice 全局類中查找。
  • 遍歷 HandlerExceptionResolver鏈:Spring 內置的解析器按以下順序嘗試處理異常:
    • ExceptionHandlerExceptionResolver:處理 @ExceptionHandler 方法。
    • ResponseStatusExceptionResolver:處理 @ResponseStatus 注解。
    • DefaultHandlerExceptionResolver:處理標準 Spring 異常。
  • 生成錯誤響應
    • 解析器返回 ModelAndView(如錯誤頁面)或直接修改 HttpServletResponse(如設置狀態碼)。
    • 若所有解析器均無法處理異常,由 Servlet 容器(如 Tomcat)返回默認錯誤頁(如 500 頁面)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904601.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904601.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

64.微服務保姆教程 (七) RocketMQ--分布式消息中間件

RocketMQ–分布式消息中間件 一、MQ 1、什么是MQ MQ(Message Queue)消息隊列,是基礎數據結構中“先進先出”的一種數據結構。指把要傳輸的數據(消息)放在隊列中,用隊列機制來實現消息傳遞——生產者產生消息并把消息放入隊列,然后由消費者去處理。消費者可以到指定隊…

java算法的核心思想及考察的解題思路

一、Java算法的核心思想 1. 分而治之 (Divide and Conquer) 將大問題分解為小問題&#xff0c;遞歸解決小問題后合并結果 典型應用&#xff1a;歸并排序、快速排序、二分查找 2. 動態規劃 (Dynamic Programming) 將問題分解為重疊子問題&#xff0c;存儲子問題的解避免重復…

linux查java進程CPU高的原因

問題&#xff1a;linux查java進程CPU高的原因 解決&#xff1a;用jdk帶的工具分析 被查的java最好也使用jdk啟動 systemctl啟動的注意要去掉PrivateTmptrue /opt/jdk1.8.0_441/bin/jps -l top -Hp 8156 printf "%x" 8533 /opt/jdk1.8.0_441/bin/jstack 8156 |…

體育培訓的實驗室管理痛點 質檢LIMS如何重構體育檢測價值鏈

在競技體育與全民健身并行的時代背景下&#xff0c;體育培訓機構正面臨雙重挑戰&#xff1a;既要通過科學訓練提升學員競技水平&#xff0c;又需嚴格把控運動安全風險。作為實驗室數字化管理的核心工具&#xff0c;質檢LIMS系統憑借其標準化流程管控與智能化數據分析能力&#…

linux下MySql的安裝與配置

一鍵三聯&#xff0c;把mysql的安裝與配置也寫了&#xff0c;供各位參考。 --------------------------------------MySql的安裝與配置-------------------------------------- 1 將下載的 壓縮包解壓到指定目錄 tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz 卸載…

數據庫原理與應用實驗二 題目七

利用sql建立教材數據庫,并定義以下基本表: 學生(學號,年齡,性別,系名) 教材(編號,書名,出版社編號,價格) 訂購(學號,書號,數量) 出版社(編號,名稱,地址) 1定義主碼、外碼、和價格、數量的取值范圍。 2 在三個表中輸入若干記錄,注意如果輸入違反完整…

什么是 HSQLDB?

大家好&#xff0c;這里是架構資源棧&#xff01;點擊上方關注&#xff0c;添加“星標”&#xff0c;一起學習大廠前沿架構&#xff01; Java開發人員學習Java數據庫連接&#xff08;JDBC&#xff09;的最簡單方法是試驗HyperSQL數據庫&#xff08;又名HSQLDB&#xff09;。 …

shell腳本--2

1、實時監控cpu、內存的shell腳本 #!/bin/bash# 獲取當前時間 DATE$(date "%Y-%m-%d %H:%M:%S")# 獲取CPU使用情況 CPU_USAGE$(top -b -n1 | grep "Cpu(s)" | awk {print $2 $4})# 獲取內存使用情況 MEMORY_USAGE$(free | grep Mem | awk {print $3/$2 *…

性能比拼: HTTP/2 vs. HTTP/3

本內容是對知名性能評測博主 Anton Putra HTTP/2 vs. HTTP/3 performance benchmark 內容的翻譯與整理, 有適當刪減, 相關指標和結論以原作為準 在本內容中&#xff0c;我們將比較 HTTP/2 和 HTTP/3 協議。 我們將使用 Terraform 和 Ansible 在 Google Cloud Platform (GCP) …

【Vue】組件自定義事件 TodoList 自定義事件數據傳輸

目錄 一、綁定 二、解綁 組件自定義事件總結 TodoList案例對數據傳輸事件的修改 總結不易~ 本章節對我有很大收獲&#xff0c; 希望對你也是&#xff01;&#xff01;&#xff01; 本章節素材已上傳Gitee&#xff1a;yihaohhh/我愛Vue - Gitee.com 前面我們學習的clikc、…

Windows遠程連接MySQL報錯,本地navicat能連接MySQL

一、報錯 telnet 119.87.111.79 3306??“無法打開到主機的連接。在端口 3306: 連接失敗”?? 表明無法通過 TCP 協議連接到目標服務器的 3306 端口。 二、目的 &#xff08;1&#xff09;??Telnet 測試的目的?? Telnet 僅用于測試 ??TCP 端口是否開放??&#xff…

電池管理系統BMS三級架構——BMU、BCU和BAU詳解

儲能電站的電池管理系統&#xff08;BMS&#xff09;通常采用三級架構&#xff1a;從控&#xff08;BMU&#xff09;、主控&#xff08;BCU&#xff09;、總控&#xff08;BAU&#xff09;。這種分層設計實現了電池模組、簇、堆的分級管理和控制&#xff0c;確保系統運行的安全…

C++ 基礎復習

基礎復習 1.const引用為什么能引用臨時對象2.內聯函數的額外作用3. nullptr 1.const引用為什么能引用臨時對象 臨時對象&#xff08;Temporary Object&#xff09;是在表達式求值過程中隱式創建的對象&#xff0c;例如&#xff1a; 函數返回非引用類型的值 類型轉換&#xff0…

AI的出現,是否能替代IT從業者?

闡述觀點&#xff1a;AI 的出現不會完全替代 IT 從業者&#xff0c;但會深刻改變 IT 行業的工作方式和崗位結構。 AI 不會完全替代 IT 從業者的原因 AI 本身需要人來開發與維護 AI 模型、系統架構、數據管道等都需要 IT 專業人員來構建和優化。 例如&#xff1a;AI 工程師、M…

【服務器通信-socket】——int socket(int domain, int type, int protocol);

#include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 這是大多數用來產生socket的協議&#xff0c;使用TCP或UDP來傳輸&#xff0c;用IPv4的地址 AF_INET6 與上面類似&#xff0c;不過是來用IPv6的地…

Python基本環境搭配

Python3 環境搭建 | 菜鳥教程 里面有直接跳轉 Fitten Code 按下 Tab 鍵接受所有補全建議&#xff1a; 按下 Ctrl→ 鍵(mac系統為Command→)接收單個詞補全建議&#xff1a; 用戶可通過點擊左上角工具欄中的Fitten Code – 開始對話或者使用快捷鍵CtrlAltC(mac系統為Contr…

C++負載均衡遠程調用學習之HOOK注冊機制

目錄 1.larV0.7-hook流程的說明 2.larV0.7-TCP_server集成鏈接HOOK函數 3.larV0.7-TCP_client集成鏈接HOOK注冊功能 1.larV0.7-hook流程的說明 ### 7.1 數據庫表相關查詢方法實現 ? 我們先實現一些基本的數據表達查詢方法&#xff1a; > lars_dns/src/dns_rout…

Rust 與 Golang 深度對決:從語法到應用場景的全方位解析

一、引言 在軟件開發的快速發展浪潮中&#xff0c;Rust 和 Golang&#xff08;Go 語言&#xff09;脫穎而出&#xff0c;成為開發者熱議的編程語言。Rust 憑借強大的內存安全性與卓越的性能備受贊譽&#xff0c;Golang 則以簡潔的語法和出色的并發處理能力贏得開發者青睞。本文…

C++負載均衡遠程調用學習之訂閱功能與發布功能

目錄 1.lars-DnsV0.1回顧 2.Lars-DnsV0.2-訂閱功能的訂閱模塊分析 3.Lars-DnsV0.2-訂閱模塊的類的單例創建及方法屬性初始化 4.Lars-DnsV0.2-發布功能的實現 5.Lars-DnsV0.2-發布功能的總結 6.Lars-DnsV0.2-訂閱流程復習 7.Lars-DnsV0.2-訂閱模塊的集成 8.Lars-DnsV0.2訂…

SurfSense開源程序是NotebookLM / Perplexity / Glean的開源替代品,連接到外部來源,如搜索引擎

?一、軟件介紹 文末提供程序和源碼下載 雖然 NotebookLM 和 Perplexity 等工具令人印象深刻&#xff0c;并且對于對任何主題/查詢進行研究都非常有效&#xff0c;但 SurfSense 通過與你的個人知識庫集成來提升這種能力。它是一個高度可定制的 AI 研究代理&#xff0c;連接到外…