SpringMVC的工作流程

作者:q***4825日期:2025/11/24

1.工作流程

(1)用户通过浏览器向服务器发送请求,请求会被Spring MVC的前端控制器DispatcherServlet拦截。

(2)DispatcherServlet拦截到请求后,会调用HandlerMapping(处理器映射器)。

(3)处理器映射器根据请求URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

(4)DispatcherServlet会通过返回信息选择合适的HandlerAdapter(处理器适配器)。

(5) HandlerAdapter会调用并执行Handler(处理器),这里的处理器指的就是程序中编写的Controller类,也被称之为后端控制器。

(6)Controller执行完成后,会返回一个ModelAndView对象,该对象中会包含视图名或包含模型和视图名。

(7)HandlerAdapter将ModelAndView对象返回给DispatcherServlet。

(8)前端控制器请求视图解析器根据逻辑视图名解析真正的视图。

(9)ViewResolver解析后,会向DispatcherServlet中返回具体的View(视图)。

(10)DispatcherServlet对View进行渲染(即将模型数据填充至视图中)。

(11)前端控制器向用户响应结果,浏览器将结果呈现给用户。

在上述过程中,DispatcherServlet、HandlerMapping、HandlerAdapter和ViewResolver对象的工作是在框架内部执行的,开发人员只需要配置DispatcherServlet,完成Controller中的业务处理并在View中展示相应信息。

2.DispatcherServlet****类

DispatcherServlet是前端控制器,是整个流程控制的中心。该类拦截了客户端的请求之后,会根据具体规则将请求交给其他组件处理,从而降低了组件之间的耦合性。

3.Controller****接口

SpringMVC将Controller接口的实现类组件名,作为请求访问的URL进行映射,进而执行handleRequest()方法中的业务逻辑代码。

4.@RequestMapping****注解

@RequestMapping注解用于建立请求URL和Handler(处理器)之间的映射关系,该注解可以标注在方法上和类上。

(1)标注在 方法上 时,注解内 value值 对应到浏览器中输入的 访问地址 (站点名之后 URL 字符串)。


1请求地址:http://localhost:8080/chapter01/hello
2
3@Controller
4public class MyController {
5   private static final Logger logger=Logger.getLogger(MyController.class);      
6    @RequestMapping("/hello")
7    public String sayHello() {
8           logger.info("访问到MyController!"); 
9           return "hello";
10    }
11}
12

(2) 标注在 类名上 时,注解内 value值 相当于设置了本处理器类的 命名空间 ,类中所有请求地址应为命名空间名 + 方法映射地址名。

1请求地址:http://localhost:8080/chapter01/api/hello
2
3@Controller
4@RequestMapping("/api")
5public class MyController {
6    private static final Logger logger=Logger.getLogger(MyController.class);    
7    @RequestMapping("/hello")
8    public String sayHello() {
9           logger.info("访问到MyController!"); 
10           return "hello";
11    }
12}
13

(3)包含的传递参数

属性名

类型

描述

name

String

可选属性,用于为映射地址指定别名。

value

String[]

可选属性,也是默认属性,用于指定请求的URL。

method

RequestMethod[]

可选属性,用于指定该方法可以处理哪种类型的请求方式。

params

String[]

可选属性,用于指定客户端请求中参数的值,必须包含哪些参数的值,才可以通过其标注的方法处理。

headers

String[]

可选属性,用于指定客户端请求中,必须包含哪些header的值,才可以通过其标注的方法处理。

consumes

String[]

可选属性,用于指定处理请求的提交内容类型(Content-type)。

produces

String[]

可选属性,用于指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。

(4) 组合注解

从Spring 4.3版本开始,还可以使用组合注解完成客户端请求方式的限定。

@GetMapping :匹配 GET 方式的请求 ;

@PostMapping :匹配 POST 方式的请求 ;

@PutMapping :匹配 PUT 方式的请求 ;

@DeleteMapping :匹配 DELETE 方式的请求 ;

@PatchMapping :匹配 PATCH 方式的请求 ;

5.ModelAndView****类

ModelAndView类用于封装Controller的处理结果,除了包含数据之外,还包含要跳转的页面。


SpringMVC的工作流程》 是转载文章,点击查看原文


相关推荐


Spring Boot接收参数的19种方式
a***56062025/11/22

Spring Boot是一个强大的框架,允许开发人员通过多种方式接收和处理参数。无论是HTTP请求参数、路径变量,还是请求体中的数据,Spring Boot都能提供灵活的处理方式。本文将介绍19种不同的方式来接收参数。 1. 查询参数(Query Parameters) 使用@RequestParam注解接收查询参数。适用于GET请求。 @GetMapping("/greet") public String greet(@RequestParam String name) { retur


为什么 VARCHAR(1000) 存不了 1000 个汉字? —— 详解主流数据库“字段长度”的底层差异
G探险者2025/11/20

大家好,我是G探险者! 在开发过程中,我们经常遇到这样的灵异现象:明明数据库字段设置为 VARCHAR(1000),前端校验也限制了 1000 个字,但用户提交时后端却报错:“Data too long”。 这并非因为数据库坏了,而是因为不同的数据库对**“长度(Length)”**的定义完全不同。有的按“人眼看到的字”算,有的按“计算机存储的字节”算。 本文将横向对比主流数据库(MySQL, Oracle, SQL Server, PostgreSQL, 达梦)的字段长度表现,并给出避坑建议。


django测试缓存命令的解读
一路生花工作室2025/11/19

命令如下: python manage.py test_cache_performance --clear-cache --iterations 5 是 Django 自定义管理命令(custom management command) 的一种调用方式,用于测试缓存性能。下面逐部分解释其含义: 🔹 1. python manage.py Django 项目的标准命令行入口。所有 Django 内置或自定义的管理命令都通过它执行。 🔹 2. test_cache_performa


深入浅出蓝桥杯:算法基础概念与实战应用(三)搜索
铭哥的编程日记2025/11/18

算法基础概念与实战应用(三)搜索 文章目录 算法基础概念与实战应用(三)搜索1.1 深度优先搜索 - DFS1.1.1 枚举⼦集1.1.2 组合型枚举1.1.3 枚举排列1.1.4 全排列问题 1.2 DFS1.2.1 选数1.2.2 ⻜机降落 整体源代码总结 1.1 深度优先搜索 - DFS 1.1.1 枚举⼦集 代码如下(示例): #include <iostream> using namespace std; int n;


Snapchat 开源全新跨平台框架 Valdi ,一起来搞懂它究竟有什么特别之处
恋猫de小郭2025/11/17

最近看到好几篇在推 Valdi 的文章,大致意思就是 「RN/Flutter 的地位将受到威胁」,「Valdi 将成为全新的跨平台流行架构」云云,这不仅就让我好奇这个新框架有什么魔力,还能在 2025 的跨平台领域玩出新花样? 首先,Valdi 是由 Snapchat 开源的跨平台框架,其核心技术已在 Snap 的生产应用中验证长达 8 年,号称在不牺牲开发速度的前提下提供原生性能 ,那它是怎么做到的? 简单来说,Valdi 是一个 “用 TypeScript(TSX)写 UI,然后编


Java游戏高级编程 | 深入探索游戏引擎与优化技巧
mfnart_2822025/11/15

在线编译C语言|探索在线编译器的优势与应用在线编译C语言是一项非常实用的技术,它使得程序员能够在没有本地开发环境的情况下直接在浏览器中编写、调试和执行C语言代码。在线编译器通过提供一个即时反馈的开发环境,大大提高了学习和工作的效率,尤其对于初学者而言,更是降低了编程的门槛。相比传统的桌面编译器,在线编译器的优势在于其便捷性和灵活性。用户不需要安装任何开发工具,只需在浏览器中输入代码,点击“编译”按钮,就可以立即看到运行结果。这种即时性大大减少了开发中的等待时间,尤其是在调试阶段,可以快速查看修改


前端图形引擎架构设计:双引擎架构设计
猪猪拆迁队2025/11/14

ECS渲染引擎架构文档 写在前面 之前写过一篇ECS文章,为什么还要再写一个,本质上因为之前的文档,截止到目前来说,变化巨大,底层已经改了很多很多,所以有必要把一些内容拎出来单独去说。 由于字体文件较大,加载时间会比较久😞 另外如果有性能问题,我会及时修复,引擎改造时间太仓促,只要不是内存泄漏,暂时没去处理。 还有很多东西要做。 体验地址:baiyuze.github.io/design/#/ca… 项目概览 Duck-Core 是一个基于 ECS(Entity-Component-Sy


GPT-5.1 凌晨突袭,奥特曼听劝!全网呼唤的人味回来了
新智元2025/11/13

「【新智元导读】今天,OpenAI GPT-5.1「全家桶」突然登场,Instant 和 Thinking 王炸组合同步上线。这一次,模型情商智商双核升级,不仅更聪明,而且聊天更有人味了。」 没有直播,OpenAI 一早放大招,让所有人猝不及防。 就在刚刚,GPT-5.1 正式发布,GPT-5 系列重大升级版登场! 一共有三个版本,目前已经上线了前两个: · GPT-5.1 Instant :最常用的模型,语气更亲切、更智能,更善于遵循指令。 · GPT-5.1 Thinking :先进的推理模


李飞飞最新长文:AI的下一个十年——构建真正具备空间智能的机器
机器之心2025/11/11

就在昨晚,关于其投身的空间智能,斯坦福大学教授李飞飞发表了一篇长篇博客《From Words to Worlds: Spatial Intelligence is AI’s Next Frontier》。 在文中,李飞飞详细解读了「空间智能究竟是什么?它为什么重要?我们如何构建它?我们又如何使用它?」她同时阐述了真正的空间智能世界模型必须实现的核心框架:构建具有故事讲述者想象力的 AI、具备第一响应者流畅性的 AI 以及以科学精确性进行空间推理。 以下为全文翻译: 1950 年,当计算机还只


调用服务出现网络错误的问题排查与解决
360_go_php2025/11/10

在分布式系统和微服务架构中,服务之间的调用是常见的操作。然而,有时在调用某个外部服务时,可能会遇到网络错误或连接失败的情况。这类问题可能与网络环境、域名解析、DNS 配置等因素相关,给服务的稳定性和可用性带来影响。​编辑 本文将介绍如何排查和解决调用服务时出现网络错误的问题,最终通过 ping 命令确认错误接口的域名,并通过本地 hosts 文件检查和修改解析,解决了因 DNS 配置问题引起的服务调用失败。 1. 问题背景​编辑 在调用某个外部服务时,应用程序报错,提示无法访问目标服务,或者出现

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读