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,跳过视图解析
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android里蓝牙使用流程以及问题详解

一、基础流程 请简述 Android 蓝牙开发的基本流程 1. 权限处理&#xff1a;动态申请蓝牙和定位权限&#xff08;注意Android 12新权限&#xff09; 2. 初始化蓝牙适配器&#xff1a;通过BluetoothManager获取BluetoothAdapter 3. 设备发现&#xff1a;- 注册BroadcastReceive…

OpenWrt 上安装Tailscale

在 OpenWrt 上安装 Tailscale 非常简单&#xff0c;主要步骤如下&#xff1a; 1. 确保 OpenWrt 设备可联网 首先&#xff0c;确保你的 OpenWrt 设备已经联网&#xff0c;可以访问外网&#xff0c;并且 SSH 进入你的路由器&#xff08;通常是 192.168.1.1&#xff09;&#xff…

蓝桥杯刷题总结 + 应赛技巧

当各位小伙伴们看到这篇文章的时候想必蓝桥杯也快开赛了&#xff0c;那么本篇文章博主就来总结一下一些蓝桥杯的应赛技巧&#xff0c;那么依旧先来走个流程 那么接下来我们分成几个板块进行总结 首先是一些基本语法 编程语言的基本语法 首先是数组&#xff0c;在存数据的时候…

TCP重传率高与传输延迟问题

目录标题 排查步骤&#xff1a;TCP重传率高与传输延迟问题v1.0通过 rate(node_netstat_Tcp_RetransSegs[3m]) 排查 TCP 重传问题的步骤1. **指标含义与初步分析**2. **关联指标排查**3. **定位具体问题源**4. **解决方案**5. **验证与监控** v2.0一、基础检查二、网络层分析三、…

【LeetCode 热题100】73:矩阵置零(详细解析)(Go语言版)

&#x1f680; 力扣热题 73&#xff1a;矩阵置零&#xff08;详解 多种解法&#xff09; &#x1f4cc; 题目描述 给定一个 m x n 的整数矩阵 matrix&#xff0c;如果一个元素为 0&#xff0c;则将其所在行和列的所有元素都设为 0。请你 原地 使用常量空间解决。 &#x1f3a…

组播网络构建:IGMP、PIM 原理及应用实践

IP组播基础 组播基本架构 组播IP地址 一个组播IP地址并不是表示具体的某台主机&#xff0c;而是一组主机的集合&#xff0c;主机声明加入某组播组即标识自己需要接收目的地址为该组播地址的数据IP组播常见模型分为ASM模型和SSM模型ASM&#xff1a;成员接收任意源组播数据&…

Unity UGUI使用手册

概述 UGUI(Unity Graphical User Interface) :Unity 图像用户界面 在游戏开发中&#xff0c;我们经常需要搭建一些图形用户界面。Unity内置的UGUI可以帮助开发者可视化地拼接界面&#xff0c;提高开发效率。UGUI提供不同样式的UI组件&#xff0c;并且封装了对应功能的API&am…

Python web程序在服务器上面部署详细步骤

在服务器上部署Python web程序通常涉及以下步骤&#xff1a; 设置服务器环境: 选择合适的服务器&#xff0c;如AWS EC2、DigitalOcean Droplet等。配置服务器操作系统&#xff0c;例如Ubuntu、CentOS等。安装必要的软件&#xff0c;如Python、pip、git等。 准备Python web程序…

条件生成对抗网络(Conditional GAN, CGAN)原理及实现(pytorch版)

CGAN 原理及实现 一、CGAN 原理1.1 基本概念1.2 与传统GAN的区别1.3 目标函数1.4 损失函数1.5 条件信息的融合方式1.6 与其他GAN变体的对比1.7 CGAN的应用1.8 改进与变体 二、CGAN 实现2.1 导包2.2 数据加载和处理2.3 构建生成器2.4 构建判别器2.5 训练和保存模型2.6 绘制训练损…

Go语言比较递归和循环执行效率

一、概念 1.递归 递归是指一个函数在其定义中直接或间接调用自身的编程方法 。简单来说&#xff0c;就是函数自己调用自己。递归主要用于将复杂的问题分解为较小的、相同类型的子问题&#xff0c;通过不断缩小问题的规模&#xff0c;直到遇到一个最简单、最基础的情况&#x…

keepalived高可用介绍

keepalived 是 Linux 一个轻量级的高可用解决方案&#xff0c;提供了心跳检测和资源接管、检测集群中的系统服务&#xff0c;在集群节点间转移共享IP 地址的所有者等。 工作原理 keepalived 通过 VRRP&#xff08;virtual router redundancy protocol&#xff09;虚拟路由冗余…

数据分享:汽车测评数据

说明&#xff1a;如需数据可以直接到文章最后关注获取。 1.数据背景 Car Evaluation汽车测评数据集是一个经典的机器学习数据集&#xff0c;最初由 Marko Bohanec 和 Blaz Zupan 创建&#xff0c;并在 1997 年发表于论文 "Classifier learning from examples: Common …

NLP简介及其发展历史

自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是人工智能和计算机科学领域中的一个重要分支&#xff0c;致力于实现人与计算机之间自然、高效的语言交流。本文将介绍NLP的基本概念以及其发展历史。 一、什么是自然语言处理&#xff1f…

HOOPS Visualize:跨平台、高性能的三维图形渲染技术解析

在当今数字化时代&#xff0c;三维可视化技术已成为众多行业的核心竞争力。HOOPS Visualize作为一款功能强大的三维图形渲染引擎&#xff0c;凭借其卓越的渲染能力、跨平台支持、丰富的交互功能、高度定制化以及快速部署等特性&#xff0c;为开发人员提供了构建高质量、高性能3…

蓝桥杯速成刷题清单(上)

一、1.排序 - 蓝桥云课 &#xff08;快速排序&#xff09;算法代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 5e5 10; int a[N];int main() {int n;cin >> n;for (int i 0; i < n; i) {cin >> a[i];}sort(a, a n);for …

Java面试黄金宝典44

1. 查看进程的运行堆栈信息命令 gstack gstack 是 Linux 系统下用于查看指定进程运行时堆栈信息的工具。当程序出现崩溃、死锁或者性能瓶颈等问题时,借助 gstack 可以查看进程中各个线程的调用栈,从而辅助开发人员定位问题。 定义 gstack 本质上是一个封装了底层 ptrace 系统…

嵌入式硬件篇---TOF陀螺仪SPI液晶屏

文章目录 前言1. TOF传感器&#xff08;Time of Flight&#xff09;原理STM32使用方法硬件连接SDASCLVCC\GND 软件配置初始化I2C外设库函数驱动&#xff1a;读取数据 2. 陀螺仪&#xff08;如MPU6050&#xff09;原理STM32使用方法硬件连接SDA/SCLINTVCC/GND 软件配置初始化I2C…

【scikit-learn基础】--『预处理』之 正则化

数据的预处理是数据分析&#xff0c;或者机器学习训练前的重要步骤。 通过数据预处理&#xff0c;可以 提高数据质量&#xff0c;处理数据的缺失值、异常值和重复值等问题&#xff0c;增加数据的准确性和可靠性整合不同数据&#xff0c;数据的来源和结构可能多种多样&#xff…

LeetCode Hot100 刷题笔记(2)—— 子串、普通数组、矩阵

目录 前言 一、子串 1. 和为 K 的子数组 2. 滑动窗口最大值 3. 最小覆盖子串 二、普通数组 4. 最大子数组和 5. 合并区间 6. 轮转数组 7. 除自身以外数组的乘积 8. 缺失的第一个正数 三、矩阵 9. 矩阵置零 10. 螺旋矩阵 11. 旋转图像 12. 搜索二维矩阵 II 前言 一、子串&#…

【Git 常用操作指令指南】

一、初始化与配置 1. 设置全局账户信息 git config --global user.name "用户名" # 设置全局用户名 git config --global user.email "邮箱" # 设置全局邮箱 --global 表示全局生效&#xff0c;若需针对单个仓库配置&#xff0c;可省略该参数 2.…