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.mzph.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…