当前位置: 首页 > article >正文

Spring MVC 框架 的核心概念、组件关系及流程的详细说明,并附表格总结

以下是 Spring MVC 框架 的核心概念、组件关系及流程的详细说明,并附表格总结:


1. 核心理念

Spring MVC 是基于 MVC(Model-View-Controller)设计模式 的 Web 框架,其核心思想是 解耦

  • Model:数据模型,负责业务逻辑和数据处理。
  • View:视图层,负责数据展示(如 HTML、JSON)。
  • Controller:控制器,负责接收请求、调用 Model、选择 View。

2. 核心组件详解

2.1 DispatcherServlet(前端控制器)
  • 作用
    Spring MVC 的核心,处理所有请求的入口点。
  • 功能
    • 接收 HTTP 请求。
    • 分发请求到合适的 Handler(处理器)。
    • 组合 Model 和 View,返回最终响应。
  • 配置
    web.xml 中配置为 Servlet,或通过 @SpringBootApplication 自动配置。
2.2 HandlerMapping(处理器映射器)
  • 作用
    根据请求 URL 找到对应的 Handler(处理器)
  • 功能
    • 将请求 URL 映射到具体的 Controller 方法。
    • 支持多种映射方式(如 @RequestMapping@GetMapping)。
  • 示例
    @Controller
    @RequestMapping("/user")
    public class UserController {@GetMapping("/list")public String list() { ... }
    }
    
2.3 HandlerAdapter(处理器适配器)
  • 作用
    调用 Handler(处理器)并获取处理结果(ModelAndView)。
  • 功能
    • 将请求参数绑定到方法参数(如 @RequestParam@PathVariable)。
    • 调用 Controller 方法,处理业务逻辑。
    • 将返回值(如 StringModelAndView)转换为 ModelAndView 对象。
  • 适用场景
    适配不同类型的处理器(如 @Controller@RestController)。
2.4 ViewResolver(视图解析器)
  • 作用
    将逻辑视图名(如 "user/list")转换为具体的 View 对象。
  • 功能
    • 根据配置规则(如前缀、后缀)查找视图资源。
    • 支持多种视图技术(如 Thymeleaf、JSP、FreeMarker)。
  • 配置示例
    spring.mvc.view.prefix=/WEB-INF/views/
    spring.mvc.view.suffix=.jsp
    
2.5 Model(模型)
  • 作用
    存储数据,供视图渲染使用。
  • 功能
    • 通过 ModelModelAndView@ModelAttribute 注入数据。
    • 示例:
      @Controller
      public class UserController {@GetMapping("/user/{id}")public String getUser(@PathVariable Long id, Model model) {User user = userService.findById(id);model.addAttribute("user", user); // 存入 Modelreturn "user/detail";}
      }
      
2.6 View(视图)
  • 作用
    将 Model 中的数据渲染为最终的响应(如 HTML 页面、JSON 数据)。
  • 实现方式
    • Thymeleaf<div th:text="${user.name}"></div>
    • JSP<%= user.getName() %>
    • JSON:通过 @ResponseBody@RestController 直接返回对象。
2.7 Controller(控制器)
  • 作用
    处理 HTTP 请求,调用 Model 并选择 View。
  • 功能
    • 通过 @Controller@RestController 标记。
    • 使用 @RequestMapping 系列注解定义请求映射。
    • 示例:
      @RestController
      public class UserController {@GetMapping("/api/user/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);}
      }
      
2.8 拦截器(HandlerInterceptor)
  • 作用
    在请求处理前后执行自定义逻辑(如权限校验、日志记录)。
  • 功能
    • 实现 HandlerInterceptor 接口。
    • 通过 WebMvcConfigurer 注册拦截器。
    • 示例:
      public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 权限校验return true; // 继续处理请求}
      }
      

3. 核心组件关系图

用户请求 → DispatcherServlet → HandlerMapping → Handler(Controller)↓HandlerAdapter → 处理请求 → Model + View名称↓ViewResolver → 解析View → 渲染响应 → 返回客户端

4. 请求处理流程

  1. 请求到达 DispatcherServlet
    客户端发送 HTTP 请求到 DispatcherServlet
  2. 映射处理器
    HandlerMapping 根据 URL 找到对应的 Handler(如 UserControllerlist() 方法)。
  3. 调用处理器
    HandlerAdapter 调用 Handler 方法,获取 ModelAndView(包含数据和逻辑视图名)。
  4. 解析视图
    ViewResolver 将逻辑视图名(如 "user/list")转换为具体的 View(如 /WEB-INF/views/user/list.jsp)。
  5. 渲染响应
    View 使用 Model 数据生成最终响应(HTML、JSON 等),返回给客户端。

5. 表格总结

组件作用角色示例/配置
DispatcherServlet接收请求,分发到 Handler,组合 Model 和 View。中央调度器,核心组件。@SpringBootApplication 自动配置。
HandlerMapping映射请求 URL 到对应的 Handler(Controller)。请求路由的桥梁。@RequestMapping@GetMapping
HandlerAdapter调用 Handler 方法,处理参数绑定和返回值转换。调用处理器的适配器。支持 @RequestParam@PathVariable
ViewResolver将逻辑视图名转换为具体的 View 对象。视图解析器,支持多种模板引擎。spring.mvc.view.prefix=/views/spring.mvc.view.suffix=.jsp
Model存储数据,供视图渲染。数据容器。Model@ModelAttribute
View渲染最终的响应(HTML、JSON 等)。响应生成器。Thymeleaf、JSP、FreeMarker。
Controller处理请求,调用 Model,选择 View。业务逻辑处理器。@Controller@RestController
HandlerInterceptor在请求处理前后执行拦截逻辑(如权限校验)。请求拦截器。实现 HandlerInterceptor 接口,通过 WebMvcConfigurer 注册。

6. 关键概念关系图

用户请求 → DispatcherServlet → HandlerMapping(找到 Controller) → HandlerAdapter(调用 Controller 方法)↓Model(存储数据) → ViewResolver(解析视图) → View(渲染响应)

7. 注意事项

  • 注解驱动:通过 @EnableWebMvc@SpringBootApplication 启用注解支持。
  • 异步处理:通过 @AsyncDeferredResult 实现异步请求。
  • 异常处理:通过 @ControllerAdvice 统一处理全局异常。

通过以上组件和流程,Spring MVC 实现了请求的解耦和高效处理,是构建现代化 Web 应用的首选框架。

在这里插入图片描述

一、Spring MVC 请求处理全流程详解

1. 请求参数接收
  • 实现方式:通过方法参数注解(如 @RequestParam, @PathVariable, @RequestBody)直接绑定请求参数。

    @GetMapping("/user/{id}")
    public String getUser(@PathVariable String id, @RequestParam String name) {// 参数绑定到方法参数
    }
    
  • 核心类ServletInvocableHandlerMethod 负责参数解析,通过 HandlerMethodArgumentResolver 解析不同注解的参数。


2. 请求分发到控制器方法
  • 流程DispatcherServlet 通过 HandlerMapping 定位处理器(Controller方法)。
    • 关键类RequestMappingHandlerMapping 根据 @RequestMapping 注解匹配 URL 和 HTTP 方法。
    • 匹配逻辑:解析 @RequestMappingpathmethod 等属性,生成 HandlerExecutionChain
    // 示例:匹配到 UserController 的 getUser 方法
    @Controller
    @RequestMapping("/user")
    public class UserController {@GetMapping("/{id}")public String getUser(@PathVariable String id) { ... }
    }
    

3. 视图定位与渲染
  • 视图解析ViewResolver 根据逻辑视图名(如 user/list)解析为实际视图(如 JSP 文件)。

    • 核心类InternalResourceViewResolver 将视图名转换为 /WEB-INF/views/user/list.jsp
    // 配置视图解析器
    @Bean
    public ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;
    }
    
  • 视图类型:JSP、Thymeleaf、FreeMarker 等,通过 View 接口实现。


二、流程可省略与可自定义部分

1. 可省略的流程
流程阶段省略条件替代处理方式
视图解析返回值添加 @ResponseBodyHttpMessageConverter 直接序列化返回
视图渲染返回 JSON/XML 等数据格式无需渲染,直接写入响应体
Session管理无会话需求(如 REST API)关闭 Session 支持(@Controller 不继承 @SessionAttributes

2. 可自定义的流程
流程阶段自定义方式实现类/注解
参数绑定自定义参数解析器HandlerMethodArgumentResolver
处理器映射自定义请求到方法的匹配规则HandlerMapping
视图解析自定义视图解析逻辑ViewResolver
异常处理自定义全局异常处理器@ControllerAdvice + @ExceptionHandler

三、DispatcherServlet.properties 定义的类及作用

1. 核心类列表
类名作用
RequestMappingHandlerMapping根据 @RequestMapping 注解匹配 Controller 方法
RequestMappingHandlerAdapter调用 Controller 方法并处理方法参数和返回值
BeanNameUrlHandlerMapping根据 Bean 名称直接映射 URL(如 loginController 对应 /loginController
SimpleUrlHandlerMapping简单的 URL 映射配置(通过 XML 配置 URL 和 Controller 关联)
DefaultAnnotationHandlerMapping旧版注解处理器映射(Spring 3.0 后逐步被 RequestMappingHandlerMapping 替代)
InternalResourceViewResolver解析 JSP 视图,将逻辑视图名转换为实际资源路径
ContentNegotiatingViewResolver根据请求的 Accept 头选择合适视图(如 JSON 或 HTML)
HandlerExceptionResolver全局异常处理,将异常转换为视图或 HTTP 状态码
2. 流程总结表格
流程阶段是否可省略是否可自定义默认实现类
参数绑定ServletModelAttributeMethodProcessor
请求分发RequestMappingHandlerMapping
视图解析InternalResourceViewResolver
视图渲染JstlView(JSP)
异常处理DefaultHandlerExceptionResolver

四、关键代码注释示例

// 1. Controller 方法参数绑定示例
@GetMapping("/search")
public String search(@RequestParam String keyword, @RequestBody User user) { // @RequestParam 绑定查询参数,@RequestBody 绑定 JSON 请求体
}// 2. 自定义视图解析器(实现 ViewResolver 接口)
public class CustomViewResolver implements ViewResolver {@Overridepublic View resolveViewName(String viewName, Locale locale) {// 自定义逻辑:根据 viewName 返回自定义 View 实现return new CustomView();}
}// 3. @ResponseBody 省略视图流程
@GetMapping("/api/user")
@ResponseBody
public User getUserAsJson() {// 直接返回对象,由 Jackson 转换为 JSON,跳过视图解析
}

相关文章:

Spring MVC 框架 的核心概念、组件关系及流程的详细说明,并附表格总结

以下是 Spring MVC 框架 的核心概念、组件关系及流程的详细说明&#xff0c;并附表格总结&#xff1a; 1. 核心理念 Spring MVC 是基于 MVC&#xff08;Model-View-Controller&#xff09;设计模式 的 Web 框架&#xff0c;其核心思想是 解耦&#xff1a; Model&#xff1a;数…...

使用 redis 实现消息队列

方案1: 使用list做消息队列问题1: 如何保证消息不丢失问题 2: 重复消费/幂等 方案 2: zset实现消息队列方案 3: 发布/订阅(pub/sub)问题1: 如何保证消息不丢失问题 2: 重复消费/幂等 方案 4: Stream 实现消息队列问题1: 如何保证消息不丢失问题 2: 重复消费/幂等 方案1: 使用li…...

金融数据分析(Python)个人学习笔记(6):安装相关软件

python环境的安装请查看Python个人学习笔记&#xff08;1&#xff09;&#xff1a;Python软件的介绍与安装 一、pip 在windows系统中检查是否安装了pip 打开命令提示符的快捷键&#xff1a;winR&#xff0c;然后输入cmd 在命令提示符中执行如下命令 python -m pip --version…...

Android Material Design 3 主题配色终极指南:XML 与 Compose 全解析

最小必要颜色配置 <!-- res/values/themes.xml --> <style name"Theme.MyApp" parent"Theme.Material3.DayNight"><!-- 基础三原色 --><item name"colorPrimary">color/purple_500</item><item name"col…...

PyTorch参数管理详解:从访问到初始化与共享

本文通过实例代码讲解如何在PyTorch中管理神经网络参数&#xff0c;包括参数访问、多种初始化方法、自定义初始化以及参数绑定技术。所有代码可直接运行&#xff0c;适合深度学习初学者进阶学习。 1. 定义网络与参数访问 1.1 定义单隐藏层多层感知机 import torch from torch…...

页面简单传参

#简单的情景&#xff1a;你需要在帖子主页传递参数给帖子详情页面&#xff0c;携带在主页获得的帖子ID。你有以下几种传递方法# #使用Vue3 TS# 1. 通过 URL 参数传递&#xff08;Query 参数&#xff09; 这是最简单、最常用的方法&#xff0c;ID 会显示在 URL 中的 ? 后面…...

nginx路径匹配的优先级

在 Nginx 配置中&#xff0c;当请求 /portal/agent/sse 时&#xff0c;会匹配 location ~* /sse$ 规则&#xff0c;而不是 location /portal。原因如下&#xff1a; 匹配规则解析 location ~* /sse$ ~* 表示 不区分大小写的正则匹配/sse$ 表示以 /sse 结尾的路径匹配结果&#…...

一周学会Pandas2 Python数据处理与分析-Pandas2一维数据结构-Series

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Pandas提供Series和DataFrame作为数组数据的存储框架。 Series&#xff08;系列、数列、序列&#xff09;是一个带有…...

DApp实战篇:前端技术栈一览

前言 在前面一系列内容中&#xff0c;我们由浅入深地了解了DApp的组成&#xff0c;从本小节开始我将带领大家如何完成一个完整的DApp。 本小节则先从前端开始。 前端技术栈 在前端开发者速入&#xff1a;DApp中的前端要干些什么&#xff1f;文中我说过&#xff0c;即便是在…...

leetcode6.Z字形变换

题目说是z字形变化&#xff0c;但其实模拟更像n字形变化&#xff0c;找到字符下标规律就逐个拼接就能得到答案 class Solution {public String convert(String s, int numRows) {if(numRows1)return s;StringBuilder stringBuilder new StringBuilder();for (int i 0; i <…...

HarmonyOS应用开发者高级-编程题-001

题目一:跨设备分布式数据同步 需求描述 开发一个分布式待办事项应用,要求: 手机与平板登录同一华为账号时,自动同步任务列表任一设备修改任务状态(完成/删除),另一设备实时更新任务数据在设备离线时能本地存储,联网后自动同步实现方案 // 1. 定义分布式数据模型 imp…...

鸿蒙开发者高级认证编程题库

题目一:跨设备分布式数据同步 需求描述 开发一个分布式待办事项应用,要求: 手机与平板登录同一华为账号时,自动同步任务列表任一设备修改任务状态(完成/删除),另一设备实时更新任务数据在设备离线时能本地存储,联网后自动同步实现方案 // 1. 定义分布式数据模型 imp…...

Ubuntu(CentOS、Rockylinux等)快速进入深度学习pytorch环境

这里写自定义目录标题 安装进入系统&#xff08;如Ubuntu22.04&#xff09;安装anacondapip、conda换源pip换源conda换源 安装nvidia安装pytorch环境针对于wsl的优化 安装进入系统&#xff08;如Ubuntu22.04&#xff09; docker 、 wsl 、 双系统 、服务器系统 推荐 Ubuntu 20…...

[实战] 天线阵列波束成形原理详解与仿真实战(完整代码)

天线阵列波束成形原理详解与仿真实战 1. 引言 在无线通信、雷达和声学系统中&#xff0c;波束成形&#xff08;Beamforming&#xff09;是一种通过调整天线阵列中各个阵元的信号相位和幅度&#xff0c;将电磁波能量集中在特定方向的技术。其核心目标是通过空间滤波增强目标方…...

Android开发okhttp添加头部参数

Android开发okhttp添加头部参数或者是头文件 private static class RequestHeaderInterceptor implements Interceptor {Overridepublic Response intercept(Chain chain) throws IOException {Request original chain.request();//添加头部信息Request request original.new…...

Halcon图像采集

Halcon是一款强大的机器视觉软件&#xff0c;结合C#可以开发出功能完善的视觉应用程序。 基本设置 确保已经安装了Halcon和Halcon的.NET库&#xff08;HalconDotNet&#xff09;。 1. 添加引用 在C#项目中&#xff0c;需要添加对HalconDotNet.dll的引用&#xff1a; 右键点…...

自动提取pdf公式 ➕ 输出 LaTeX

# 创建打包脚本的主内容 script_content """ from doc2x.extract_formula import extract_formula_imgs from pix2text import Pix2Text from PIL import Image import osdef main():pdf_path "your_file.pdf" # 将你的PDF命名为 your_file.pdf 并…...

(十)安卓开发中的Activity之间的通信使用详解

在 Android 开发中&#xff0c;Activity 之间的通信是非常常见且核心的功能之一&#xff0c;常见的方式包括&#xff1a; 使用显式 Intent 传递数据使用隐式 Intent 实现跨组件调用使用 startActivityForResult&#xff08;或新版 Activity Result API&#xff09;回传数据传递…...

python 浅拷贝copy与深拷贝deepcopy 理解

一 浅拷贝与深拷贝 1. 浅拷贝 浅拷贝只复制了对象本身&#xff08;即c中的引用&#xff09;。 2. 深拷贝 深拷贝创建一个新的对象&#xff0c;同时也会创建所有子对象的副本&#xff0c;因此新对象与原对象之间完全独立。 二 代码理解 1. 案例一 a 10 b a b 20 print…...

基于neo4j存储知识树-mac

1、安装jdk21 for mac(jdk-21_macos-aarch64_bin.dmg) 2、安装neo4j for mac(neo4j-community-5.26.0-unix.tar.gz) 3、使用默认neo4j/neo4j登录http://localhost:7474 修改登录密码&#xff0c;可以使用生成按钮生成密码&#xff0c;连接数据库&#xff0c;默认设置为neo4j…...

Tiktok 关键字 视频及评论信息爬虫(1) [2025.04.07]

&#x1f64b;‍♀️Tiktok APP的基于关键字检索的视频及评论信息爬虫共分为两期&#xff0c;希望对大家有所帮助。 第一期见下文。 第二期&#xff1a;基于视频URL的评论信息爬取 1. Node.js环境配置 首先配置 JavaScript 运行环境&#xff08;如 Node.js&#xff09;&#x…...

基于人工智能的高中教育评价体系重构研究

基于人工智能的高中教育评价体系重构研究 一、引言 1.1 研究背景 在科技飞速发展的当下&#xff0c;人工智能技术已广泛渗透至各个领域&#xff0c;教育领域亦不例外。人工智能凭借其强大的数据处理能力、智能分析能力和个性化服务能力&#xff0c;为教育评价体系的创新与发…...

【学习笔记】文件上传漏洞--二次渲染、.htaccess、变异免杀

目录 第十二关 远程包含地址转换 第十三关 突破上传删除 条件竞争 第十四关 二次渲染 第十五关 第十六关 第十七关 .htaccess 第十八关 后门免杀 第十九关 日志包含 第十二关 远程包含地址转换 延续第十一关&#xff0c;加一个文件头&#xff0c;上传成功&#xff0c…...

C++ 基础进阶

C 基础进阶 内容概述&#xff1a; 函数重载&#xff1a;int add(int x, inty);&#xff0c;long long add(long long x, long long y);&#xff0c;double add(double x, double y);模板函数&#xff1a;template<typename T> 或 template<class T>结构体&#x…...

【OS】Process Management(3)

《计算机操作系统&#xff08;第三版&#xff09;》&#xff08;汤小丹&#xff09;学习笔记 文章目录 5、进程通信&#xff08;Inter-Process Communication&#xff09;5.1、进程通信的类型5.1.1、共享存储器系统&#xff08;Shared Memory System&#xff09;5.1.2、消息传递…...

单reactor实战

前言&#xff1a;reactor作为一种高性能的范式&#xff0c;值得我们学习 本次目标 实现一个基于的reactor 具备echo功能的服务器 核心组件 Reactor本身是靠一个事件驱动的框架,无疑引出一个类似于moduo的"EventLoop "以及boost.asio中的context而言&#xff0c;不断…...

初阶C++笔记第一篇:C++基础语法

虽然以下大多数知识点都在C语言中学过&#xff0c;但还是有一些知识点和C语言不同&#xff0c;比如&#xff1a;代码格式、头文件、关键字、输入输出、字符串类型等... 1. 初识C 1.1 第一个C程序 编写C分为4个步骤&#xff1a; 创建项目创建文件编写代码运行程序 C的第一条…...

java基础 流(Stream)

Stream Stream 的核心概念核心特点 Stream 的操作分类中间操作&#xff08;Intermediate Operations&#xff09;终止操作&#xff08;Terminal Operations&#xff09; Stream 的流分类顺序流&#xff08;Sequential Stream&#xff09;并行流&#xff08;Parallel Stream&…...

【AI】prompt engineering

prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定义 Prompt 工程&#xff08;Prompt Engineering&#xff09;是指在使用语言模型&#xff08;如 ChatGPT、文心一言等&#xff09;等人工智能工具时&#xff0c;设计和优化输入提…...

无需libpacp库,BPF指令高效捕获指定数据包

【环境】无libpacp库的Linux服务器 【要求】高效率读取数据包&#xff0c;并过滤指定端口和ip 目前遇到两个问题 一是手写BPF&#xff0c;难以兼容&#xff0c;有些无法正常过滤二是性能消耗问题&#xff0c;尽可能控制到1% 大方向&#xff1a;过滤数据包要在内核层处理&…...