Spring MVC 的执行流程

server/2025/3/4 5:05:17/

Spring MVC 是一个基于 Java 的请求驱动型 Web 框架,其核心设计围绕 前端控制器模式,通过 DispatcherServlet 协调各个组件处理 HTTP 请求。以下是其完整的执行流程,共分为 8 个核心步骤:

1. HTTP请求到达DispatcherServlet

        入口:所有请求首先由 DispatcherServlet(前端控制器)接收。

        配置:在 web.xml 中定义 DispatcherServlet 并映射 URL 路径(如 /):

<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

        作用:确定请求对应的 Controller 方法。

        组件HandlerMapping(如 RequestMappingHandlerMapping)根据 URL 和注解(如 @RequestMapping)匹配处理器。

        Controller方法定义示例:

java">@Controller
public class UserController {@GetMapping("/user/{id}")public String getUser(@PathVariable("id") Long id, Model model) {User user = userService.findById(id);model.addAttribute("user", user);return "user/detail";}
}

3. 调用HandlerAdapter

        作用:适配器模式,执行 Controller 方法。

        组件HandlerAdapter(如 RequestMappingHandlerAdapter)负责调用方法,处理参数绑定(如 @RequestParam@RequestBody)。

        流程

                解析方法参数(通过 ArgumentResolver)。

                执行 Controller 方法。

                处理返回值(通过 ReturnValueHandler)。

4. Controller处理请求

        业务逻辑:Controller 调用 Service 层,处理业务并返回数据。

        返回值类型

        ModelAndView:包含模型数据和视图名。

        String:视图名(如 "redirect:/success")。

        @ResponseBody:直接返回 JSON/XML 数据。

5. 处理返回值和Model

        模型填充:将数据存入 Model 对象,供视图渲染使用。

java">@PostMapping("/user/create")
public String createUser(User user, RedirectAttributes redirectAttrs) {userService.save(user);redirectAttrs.addFlashAttribute("message", "用户创建成功!");return "redirect:/user/list";
}

6. 解析视图(ViewResolver)

        作用:将逻辑视图名(如 "user/detail")解析为实际视图对象(如 JSP、Thymeleaf)。

        配置:在 spring-mvc.xml 中配置视图解析器:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/>
</bean>

7.渲染视图(View)

        模板引擎:将模型数据填充到视图模板,生成 HTML。

        示例:JSP 页面中访问模型数据:

<h1>用户详情</h1>
<p>用户名:${user.name}</p>

8. 返回HTTP响应

        输出:将渲染后的内容写入 HttpServletResponse,返回客户端。

小结

  1. 首先,用户发起一个HTTP请求到Web应用,这个请求会被前端控制器(DispatcherServlet)处理。DispatcherServlet是Spring MVC的核心,负责协调各个组件。
  2. 接下来,DispatcherServlet会查询处理器映射器(HandlerMapping)来确定哪个控制器(Controller)会处理这个请求。
  3. 然后,DispactcherServlet会将请求交给对应的Controller处理。Controller执行具体的业务逻辑,可能会调用Service层,处理数据,并返回一个模型和视图(ModelAndView)对象。
  4. 之后,DispactherServlet会根据视图名称,通过视图解析器(ViewResolver)来解析具体的视图对象。
  5. 最后,视图渲染阶段。将模型数据填充到视图中,生成最终的响应内容,返回给客户端。

http://www.ppmy.cn/server/171956.html

相关文章

Kafka 赋能高效消息队列管理:从原理到实战

Kafka 赋能高效消息队列管理:从原理到实战 作者:Echo_Wish 引言:为什么选择 Kafka? 在现代分布式系统中,消息队列已经成为微服务架构、实时数据处理、日志采集等场景的基石。而 Apache Kafka 以其高吞吐、低延迟、分布式存储的特性,成为众多大厂的首选。 那么,Kafka 究…

ES scroll=1m:表示快照的有效时间为1分钟。怎么理解

在Elasticsearch中&#xff0c;scroll1m 表示你创建的 scroll 上下文 的有效时间为 1分钟。这个参数控制了你可以在多长时间内继续使用这个 scroll_id 来获取更多的数据。 什么是 Scroll 上下文&#xff1f; 当你使用 scroll API 时&#xff0c;Elasticsearch 会为你的查询创…

【Python爬虫(84)】当强化学习邂逅Python爬虫:解锁高效抓取新姿势

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…

Flutter 学习之旅 之 flutter 使用 fluttertoast 的 toast 实现简单的 Toast 效果

Flutter 学习之旅 之 flutter 使用 fluttertoast 的 toast 实现简单的 Toast 效果 目录 Flutter 学习之旅 之 flutter 使用 fluttertoast 的 toast 实现简单的 Toast 效果 一、简单介绍 二、简单介绍 futtertoast 三、安装 fluttertoast 四、简单案例实现 五、关键脚本 一…

HarmonyOS NEXT 原生应用/元服务-自定义运行/调试配置

一、设置调试代码类型 点击Run > Edit Configurations > Debugger&#xff0c;选择相应模块&#xff0c;设置Debug type即可。 工程调试类型默认为Detect Automatically&#xff0c;关于各调试类型的说明如下表所示&#xff1a; 表1 调试类型配置项 二、设置HAP安装方…

一文掌握 Scrapy 框架的详细使用,包括实战案例

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Scrapy 简介2. Scrapy 的核心组件3. 安装 Scrapy4. 创建 Scrapy 项目4.1 创建项目4.2 创建 Spider5. 编写 Spider5.1 定义 Item5.2 编写 Spider 逻辑6. 运行 Scrapy 爬虫6.1 运行爬虫6.2 保存爬取数据7. Scrapy 的高…

【笔记ing】每天50个英语词汇

ex- e-out exclude 排外&#xff0c;排除 expect 期待&#xff0c;期望 单词构成&#xff1a; 前缀&#xff08;prefix&#xff09;&#xff1a;情感&#xff08;emotion&#xff09;方向&#xff08;orientation&#xff09; 词根&#xff08;root&#xff09;&#xf…

设计模式-(状态模式,策略模式,代理模式,责任链模式)

状态模式 概念&#xff1a; 用于管理一个对象在不同状态下的行为变化。它允许对象在内部状态改变时改变其行为&#xff0c;从而让对象看起来像是改变了其类。状态模式的核心思想是将状态封装到独立的类中&#xff0c;每个状态类都定义了在该状态下对象的行为 状态模式主要涉…