07SpringMVC底層形象解析

目錄

一、基于餐廳比喻的代碼示例 ,幫助你理解各組件間的協作關系

1. DispatcherServlet 配置(服務員)

2. HandlerMapping 配置(菜單索引)

3. Controller 實現(廚師)

4. Service 層(廚房)

5. ViewResolver 配置(餐桌索引)

6. View 視圖(餐桌)

7. 客戶端請求流程(顧客點餐)

二、SpringMVC 底層原理與餐廳運作流程的類比

1. 客戶端請求(顧客點餐)

2. DispatcherServlet 接收請求(服務員接單)

3. HandlerAdapter 調用 Controller(服務員傳達廚師)

4. Controller 處理請求(廚師做菜)

5. ModelAndView 返回結果(廚師上菜)

6. ViewResolver 解析視圖(服務員找餐桌)

7. View 渲染數據(擺盤上菜)

總結對比表

請求處理流程圖


引言:以下我將MVC的底層各個流程比作一個餐廳的運作流程,這樣便于我們理解。


一、基于餐廳比喻的代碼示例 ,幫助你理解各組件間的協作關系

1. DispatcherServlet 配置(服務員)

// 在web.xml中配置DispatcherServlet(SpringBoot中自動配置)
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

2. HandlerMapping 配置(菜單索引)

<!-- spring-mvc.xml 配置HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

3. Controller 實現(廚師)

@Controller
@RequestMapping("/food")
public class FoodController {@Autowiredprivate FoodService foodService; // 廚房(Service層)// 處理 "/food/123" 請求(宮保雞丁)@GetMapping("/{id}")public ModelAndView getFood(@PathVariable("id") Long id) {// 從廚房獲取菜品(調用Service)Food food = foodService.getFoodById(id);// 返回視圖名稱和數據(餐盤+菜品)ModelAndView mav = new ModelAndView("foodDetail");mav.addObject("food", food);return mav;}
}

4. Service 層(廚房)

@Service
public class FoodServiceImpl implements FoodService {@Autowiredprivate FoodRepository foodRepository; // 食材庫(DAO)@Overridepublic Food getFoodById(Long id) {// 從食材庫獲取食材,制作菜品return foodRepository.findById(id).orElseThrow(() -> new RuntimeException("菜品不存在"));}
}

5. ViewResolver 配置(餐桌索引)

<!-- spring-mvc.xml 配置ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/" /><property name="suffix" value=".jsp" />
</bean>

6. View 視圖(餐桌)

<!-- /WEB-INF/views/foodDetail.jsp -->
<html>
<head><title>${food.name}</title>
</head>
<body><h1>菜品詳情:${food.name}</h1><p>價格:${food.price} 元</p><p>配料:${food.ingredients}</p><img src="${food.imageUrl}" alt="${food.name}">
</body>
</html>

7. 客戶端請求流程(顧客點餐)

  1. 顧客請求:訪問?http://localhost:8080/food/123

  2. DispatcherServlet?接收到請求,通過?RequestMappingHandlerMapping?找到?FoodController.getFood()?方法。

  3. Controller?調用?FoodService?獲取菜品數據。

  4. Controller?返回?ModelAndView("foodDetail", {food: 宮保雞丁})

  5. DispatcherServlet?通過?InternalResourceViewResolver?解析視圖為?/WEB-INF/views/foodDetail.jsp

  6. JSP?將菜品數據渲染為 HTML 響應給客戶端。


二、SpringMVC 底層原理與餐廳運作流程的類比

SpringMVC 是一個基于 MVC 模式的 Web 框架,其核心是? DispatcherServlet (中央調度器),負責協調請求的處理流程。這個過程可以類比為餐廳的運作:

1. 客戶端請求(顧客點餐)

  • 顧客(客戶端)進入餐廳(Web 應用),向服務員(DispatcherServlet)點餐(發送請求)。
  • 示例:顧客說:“我要一份宮保雞丁!”(對應 URL 請求?/food/123)。

2. DispatcherServlet 接收請求(服務員接單)

  • 服務員(DispatcherServlet)收到訂單后,首先查看菜單索引(HandlerMapping),確定由哪位廚師(Controller)負責制作這道菜。
  • HandlerMapping:將 URL 請求映射到具體的 Controller 方法。
    • 示例:菜單顯示 “宮保雞丁 → 川菜廚師”。

3. HandlerAdapter 調用 Controller(服務員傳達廚師)

  • 服務員(DispatcherServlet)通過對講機(HandlerAdapter)通知川菜廚師(Controller)制作宮保雞丁。
  • HandlerAdapter:負責調用 Controller 方法并獲取返回值。
    • 示例:服務員說:“廚師,麻煩做一份宮保雞丁!”

4. Controller 處理請求(廚師做菜)

  • 川菜廚師(Controller)根據訂單(請求參數),從廚房(Service/DAO)獲取食材(數據),制作宮保雞丁(處理業務邏輯)。
  • Controller:處理請求,調用 Service 層獲取數據,并返回一個視圖名稱(如?foodDetail)和模型數據(如菜品詳情)。
    • 示例:廚師從冰箱取雞肉、花生,烹飪后裝盤。

5. ModelAndView 返回結果(廚師上菜)

  • 廚師(Controller)將做好的菜(Model 數據)放在餐盤(ViewName)上,交給服務員(DispatcherServlet)。
  • ModelAndView:包含視圖名稱和模型數據。
    • 示例:廚師說:“宮保雞丁做好了,放在 3 號桌對應的餐盤上!”

6. ViewResolver 解析視圖(服務員找餐桌)

  • 服務員(DispatcherServlet)根據餐盤編號(ViewName),通過餐桌索引(ViewResolver)找到對應的餐桌(View)。
  • ViewResolver:將視圖名稱映射到具體的視圖實現(如 JSP、Thymeleaf)。
    • 示例:服務員查看索引表:“3 號桌 → 大廳東側靠窗位置”。

7. View 渲染數據(擺盤上菜)

  • 服務員(DispatcherServlet)將菜(Model 數據)擺放在指定餐桌(View)上,顧客(客戶端)看到最終的菜品(HTML 頁面)。
  • View:將模型數據填充到模板中,生成 HTML 響應。
    • 示例:服務員把宮保雞丁放在餐桌上,顧客看到色香味俱全的菜品。

總結對比表

?

請求處理流程圖

通過這個餐廳類比,你可以直觀理解 SpringMVC 的核心流程: 中央調度、請求分發、業務處理、視圖渲染
這種設計模式讓 Web 應用的職責分離,代碼更易維護和擴展。

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

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

相關文章

eclipse 生成函數說明注釋

在Eclipse中生成函數說明注釋&#xff08;JavaDoc風格&#xff09;可以通過以下方法實現&#xff1a; 快捷鍵方式&#xff1a; 將光標放在函數上方輸入/**后按回車鍵Eclipse會自動生成包含參數和返回值的注釋模板 菜單方式&#xff1a; 選中函數點擊菜單欄 Source > Gen…

【題解-洛谷】P6180 [USACO15DEC] Breed Counting S

題目:P6180 [USACO15DEC] Breed Counting S 題目描述 Farmer John 的 N N N 頭奶牛,從左到右編號為 1 …

基于Android的XX校園交流APP

開發語言&#xff1a;Java框架&#xff1a;ssmAndroidJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat12開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系統展示 APP登錄 APP首頁…

25、工業防火墻 - 工控網絡保護 (模擬) - /安全與維護組件/industrial-firewall-dcs-protection

76個工業組件庫示例匯總 工業防火墻 - 工控網絡保護 (模擬) 概述 這是一個交互式的 Web 組件,旨在模擬工業防火墻在保護關鍵工控網絡(特別是 DCS - 分布式控制系統)免受網絡攻擊(如勒索軟件傳播)方面的核心功能。組件通過可視化簡化的網絡拓撲、模擬網絡流量、應用防火…

kotlin flow的兩種SharingStarted策略的區別

一 兩種 SharingStarted 策略的區別&#xff1a; SharingStarted.Eagerly: 立即開始收集上游流&#xff0c;即使沒有下游訂閱者持續保持活躍狀態&#xff0c;直到 ViewModel 被清除優點&#xff1a;響應更快&#xff0c;數據始終保持最新缺點&#xff1a;消耗更多資源&#x…

Windows_RustRover Rust語言開發環境構建

Windows_RustRover Rust語言開發環境構建 一、Rust語言簡介&#xff08;一&#xff09;起源與發展&#xff08;二&#xff09;語言特點&#xff08;三&#xff09;應用場景&#xff08;四&#xff09;社區與生態 二、RustRover&#xff08;一&#xff09;主要功能&#xff08;二…

XCOSnTh-fatfsShell

#include "XCOSnTh.h" #include "ff.h" #include "stdio.h" static char pwd[1024]"1:"; static char pwdCount2; FRESULT lsExe(char *path,int(*printf)(const char* format, ...)) {FRESULT res;DIR dir;FILINFO fno;// 打開根目錄…

篇章十 消息持久化(二)

目錄 1.消息持久化-創建MessageFileManger類 1.1 創建一個類 1.2 創建關于路徑的方法 1.3 定義內部類 1.4 實現消息統計文件讀寫 1.5 實現創建消息目錄和文件 1.6 實現刪除消息目錄和文件 1.7 實現消息序列化 1. 消息序列化的一些概念&#xff1a; 2. 方案選擇&#xf…

中間件-seata

分布式事務seata 角色組成角色指責AT模式TCC模式 角色組成 TC&#xff1a;事務協調者&#xff0c;維護全局和分支事務的狀態&#xff0c;驅動全局事務提交或回滾。TM&#xff1a;事務管理者&#xff0c;定義全局事務的范圍&#xff1a;開始全局事務、提交或回滾全局事務。RM&am…

python代碼繪制某只股票最近90天的K線圖、均線、量能圖

運行代碼&#xff0c;要求輸入股票代碼和名稱&#xff0c;其他參數可省略 import akshare as ak import matplotlib.pyplot as plt import pandas as pd import mplfinance as mpf import matplotlib.dates as mdates import numpy as np import os from datetime import date…

Xilinx 7Series\UltraScale 在線升級FLASH STARTUPE2和STARTUPE3使用

一、FPGA 在線升級 FPGA 在線升級FLASH時&#xff0c;一般是通過邏輯生成SPI接口操作FLASH&#xff0c;當然也可以通過其他SOC經FPGA操作FLASH&#xff0c;那么FPGA就要實現在啟動后對FLASH的控制。 對于7Series FPGA&#xff0c;只有CCLK是專用引腳&#xff0c;SPI接口均為普…

Azure 應用服務中的異常處理、日志記錄和通知:綜合指南

簡介 Azure 應用服務是基于云的應用程序&#xff0c;使開發人員能夠在云上構建、部署和管理應用程序。與任何應用程序一樣&#xff0c;制定適當的異常處理、日志記錄和通知實踐至關重要&#xff0c;以確保應用程序平穩運行&#xff0c;并快速識別和解決任何問題。在本篇博文中&…

Java 應用如何實現 HTTPS:加密數據傳輸的實用指南

Java 應用如何實現 HTTPS&#xff1a;加密數據傳輸的實用指南 在當今的互聯網環境中&#xff0c;數據安全至關重要&#xff0c;HTTPS 作為加密的數據傳輸協議&#xff0c;為 Java 應用提供了安全通信的保障。本文將深入探討 Java 應用如何實現 HTTPS&#xff0c;通過詳細代碼實…

域名與DNS詳解

域名與DNS詳解 一、核心概念 域名&#xff08;Domain Name&#xff09; 定義&#xff1a;人類可讀的網絡地址標識&#xff08;如 www.google.com&#xff09;作用&#xff1a;替代復雜IP地址&#xff08;類似"手機通訊錄"功能&#xff09; DNS&#xff08;Domain …

c++20引入的三路比較操作符<=>

目錄 一、簡介 二、三向比較的返回類型 2.1 std::strong_ordering 2.2 std::weak_ordering 2.3 std::partial_ordering 三、對基礎類型的支持 四、自動生成的比較運算符函數 4.1 std::rel_ops的作用 4.2 使用<> 五、兼容他舊代碼 一、簡介 c20引入了三路比較操…

計算機網絡相關面試題

一、HTTP1.1和HTTP2的區別 HTTP/1&#xff08;主要指 HTTP/1.1&#xff09;和 HTTP/2 是 Web 協議發展中的兩個重要版本&#xff0c;二者在性能、協議機制和功能特性上有顯著差異。以下從多個維度對比分析&#xff0c;并結合具體案例說明&#xff1a; 一、連接與請求處理方式 1…

圖論算法精解(Java 實現):從基礎到高頻面試題

一、圖的基礎表示方法 1.1 鄰接矩陣&#xff08;Adjacency Matrix&#xff09; 鄰接矩陣是表示圖的一種直觀方式&#xff0c;它使用一個二維數組來存儲節點之間的連接關系。對于一個有 n 個節點的圖&#xff0c;鄰接矩陣是一個 nn 的矩陣&#xff0c;其中 matrix [i][j] 表示…

江科大TIM定時器hal庫實現

定時器相關hal庫函數 hal庫的定時器函數相比于標準庫&#xff0c;多了很多的中斷回調函數&#xff0c;同時對于定時器的初始化也改成使用句柄一次性順帶連帶DMA等功能一起初始化了 typedef struct {uint32_t Prescaler; /*定時器的預分頻值*/uint32_t CounterMode; …

CentOS 10:啟動telnet服務

參考&#xff0c; 鳥哥私房菜 - 第七章、網路安全與主機基本防護&#xff1a;限制埠口, 網路升級與 SELinux 7.3.3 埠口與服務的啟動/關閉及開機時狀態設定 我們知道系統的 Telnet 服務通常是以 super daemon 來控管的&#xff0c;請您啟動您系統的 telnet 試看看。 1 要啟動 …

Taro 安全區域

目錄 一、問題描述 二、問題解決 1、頂部劉海區 2、底部小黑條 一、問題描述 安全區域主要是為了避免劉海屏或底部欄遮擋&#xff0c;而造成的不良顯示效果。 本次將針對以下兩點進行考量&#xff1a; 1、頂部劉海屏區 2、蘋果X底部小黑條 二、問題解決 通過Taro.getS…