SpringMVC的工作流程

一、简介:

MVC:是一种架构模式,将业务逻辑和页面展示分离,使程序分层、分工合作,既相互独立,又协同合作。

MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计 规范

Model(模型) :数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或 JavaBean组件,不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

View(视图):负责进行模型的展示,将逻辑视图解析成物理视图并渲染。

Controller(控制器):接收用户请求,委托给模型进行处理,处理完毕后把返回的模型数据返回给视图,由视图负责展示。起调度作用。

二、流程图

1. 请求到达: 客户端发起一个HTTP请求到服务器,请求被Spring MVC的前端控制器DispatcherServlet拦截。
2. 查找处理器 :DispatcherServlet接收到请求后,会查询HandlerMapping处理器映射器来确定请求应该由哪个控制器(Controller)来处理。处理器映射器会根据请求的URL路径找到与之匹配的处理器。
3. 处理器适配与执行 :找到合适的处理器后,DispatcherServlet会将请求传递给HandlerAdapter处理器适配器。处理器适配器负责调用控制器中的具体方法来处理请求,并处理方法的返回值。
4. 模型数据准备: 控制器在处理请求时,可能会操作模型数据(Model),这些数据会被封装到一个对象中,并通过ModelAndView对象传给视图解析器。同时,控制器会指定逻辑视图名,指示下一步应呈现哪个视图。
5. 视图解析 :DispatcherServlet根据ModelAndView中的视图名,通过ViewResolver视图解析器找到实际的视图对象(如JSP页面)。视图解析器会将逻辑视图名转换成实际的视图对象。
6. 渲染视图: 视图对象负责渲染模型数据,即将模型数据填充到响应页面中。这个过程中,视图可能需要访问之前存入模型中的数据。
7. 响应客户端:最终,填充好的视图(通常是HTML页面)作为HTTP响应体的一部分,由DispatcherServlet发送回客户端,完成整个请求处理流程。

三、SpringMVC核心组件

SpringMVC框架的核心组件主要包括以下五个部分:
1. DispatcherServlet(前端控制器):

作为整个Spring MVC应用的入口点,负责接收HTTP请求并响应。

分发请求到具体的处理器(Controller)。

联合其他组件协同工作,完成请求的处理流程。
2. HandlerMapping(处理器映射器):

负责将接收到的请求映射到具体的处理器(Controller的处理方法)。

支持不同的映射策略,如基于URL路径、注解等。
3. HandlerAdapter(处理器适配器):

用于调用处理器(Controller方法)并处理其返回的结果。

适配不同类型的处理器,使得DispatcherServlet能与各种类型的控制器协同工作。
4. ViewResolver(视图解析器):

根据逻辑视图名解析出实际的视图对象(如JSP、Thymeleaf模板等)。

将模型数据传递给视图,准备渲染。
5. Controller(控制器):

实现业务逻辑,处理来自用户的请求。

负责向模型添加属性,并决定视图名称(或直接返回视图)。

参考:SpringMVC工作流程 --- 详解-腾讯云开发者社区-腾讯云 (tencent.com)

相关推荐
Kuo-Teng7 分钟前
LeetCode 198: House Robber
java·算法·leetcode·职场和发展·动态规划
小七mod23 分钟前
【Spring】Spring Boot自动配置的案例
java·spring boot·spring·自动配置·源码·ioc·aop
java干货24 分钟前
Spring Boot 为什么“抛弃”了 spring.factories?
spring boot·python·spring
红石榴花生油31 分钟前
Docker + Nginx 部署 Java 项目(JAR 包 + WAR 包)实战笔记
java·tomcat·maven
带刺的坐椅35 分钟前
Solon AI 开发学习 - 1导引
java·ai·openai·solon·mcp
sg_knight37 分钟前
RabbitMQ 中的预取值(prefetch)详解:如何真正提升消费端性能?
java·spring boot·spring·spring cloud·消息队列·rabbitmq·预取值
Dxxyyyy1 小时前
零基础学JAVA--Day34(Map接口+HashTable+HashMap+TreeSet+TreeMap+开发中如何选择集合实现类?(重要))
java·开发语言
spencer_tseng1 小时前
Tomcat Source Code Distributions
java·tomcat
烤麻辣烫2 小时前
23种设计模式(新手)-5里氏替换原则
java·学习·设计模式·intellij-idea·里氏替换原则
喵手2 小时前
网络编程:Java中的TCP与UDP通信!
java·udp·网络编程·tcp