Spring MVC 请求流程

SpringMVC 请求流程

  • 一、DispatcherServlet 是一个 Servlet
  • 二、Spring MVC 的完整请求流程


  • Spring MVC 框架是基于 Servlet 技术的。以请求为驱动,围绕 Servlet 设计的。Spring MVC 处理用户请求与访问一个 Servlet 是类似的,请求发送给 Servlet,执行 doService 方法,最后响应结果给浏览器完成一次请求处理。

一、DispatcherServlet 是一个 Servlet

  • DispatcherServlet 是核心对象,称为中央调度器(前端控制器 Front Controller)。负责接收所有对 Controller 的请求,调用开发者的 Controller 处理业务逻辑,将 Controller 方法的返回值经过视图处理后响应给浏览器。
  • DispacherServlet 作为 Spring MVC 中的 Controller 的职责:
    • ① 是一个门面,接收请求,控制请求的处理过程。所有请求都必须由 DispatcherServlet 控制。Spring MVC 对外的入口。可以看作门面设计模式。
    • ② 访问其他的控制器。这些控制器处理业务逻辑。
    • ③ 创建合适的视图,将 ② 中得到的业务结果放到视图,响应给用户。
    • ④ 解耦了其他组件,所有组件只与 DispatcherServlet 交互。彼此之间没有关系。
    • ⑤ 实现 ApplicationContextAware,每个 DispatcherServlet 都拥有自己的 WebApplicationContext,它继承了 ApplicationContext。WebApplicationContext 包含了 Web 相关的 Bean 对象,比如开发人员用注释 @Controller 的类,视图解析器,视图对象等等。DispatcherServlet 访问容器中的 Bean 对象。
    • ⑥ Servlet + Spring IOC 组合。
  • DispatcherServlet 的继承关系图:
    在这里插入图片描述

二、Spring MVC 的完整请求流程

在这里插入图片描述

  • ① 红色 DispatcherServlet 是框架创建的核心对象(可配置它的属性 contextPath)。
  • ② 蓝色的部分框架已经提供多个对象。开发人员可自定义,替换默认的对象。
  • ③ 绿色的部分是开发人员自己创建的对象,控制器 Controller 和视图对象。
  • 流程说明:
    • (1)DispatcherServlet 接收从客户端发送的请求。判断是普通请求还是上传文件的请求。
    • (2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。
    • (3 HandlerMapping 根据请求 URI 找到对应的控制器以及拦截器,组装成 HandlerExecutionChain 对象。将此对象返回给 DispatcherServlet 做下一步处理。
    • (4)DispatcherServlet 调用 HandlerAdapter 处理器适配器。这里是适配器设计模式,进行接口转换,将对一个接口调用转换为其他的方法。
    • (5)HandlerAdapter 根据执行控制器方法,也就是开发人员写的 Controller 类中的方法,并返回一个 ModelAndView 对象。
    • (6)HandlerAdapter 返回 ModelAndView 给DispatcherServlet。
    • (7)DispatcherServlet 调用 HandlerExceptionResolver 处理异常,有异常返回包含异常的 ModelAndView。
    • (8)DispatcherServlet 调用 ViewResolver 视图解析器来解析 ModelAndView。
    • (9)ViewResolver 解析 ModelAndView 并返回真正的 View 给 DispatcherServlet。
    • (10)DispatcherServlet 将得到的视图进行渲染,将 Model 中的数据填充到 request 域。
    • (11)返回给客户端响应结果。

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

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

相关文章

leetcode-2865美丽塔

题目链接 2865. 美丽塔 I - 力扣(LeetCode) 解题思路 根据题意可以知道,假设数组的长度为n,对于山状数组heights定义如下: 假设heights[i]为数组中的最大值,则i左边的值均小于等于heights[i],i右边的值…

【vue3】Vue3 + Vite 项目搭建

Vue3 Vite 项目搭建 创建项目添加Vue Router 4路由配置添加Vant UI 组件库移动端rem适配添加iconfont字体图标库二次封装Axios请求库添加CSS预处理器Less添加全局状态管理插件Vuex 1.创建项目 Vite方式 1.1 进入开发目录, 执行指令创建新项目 更行node版本18 npm 7.x版本 su…

Leetcode. 212 单词搜索II

题目信息 LeetoCode地址: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目理解 该题目也是匹配字符串,但是高级一点。首先,要找到的字符串不再是单一一个,而是一个列表words,最大有3 *10^4个。其…

ThinkPhp3.2(qidian)部署文档

宝塔环境部署 申请域名以及域名解析 具体配置,可百度之 在宝塔面板中创建网站 上传代码导入数据配置运行目录 注意:(如果版本:thinkphp3.2 )配置 运行目录要特别注意:运行目录要选择根目录“/”&#xff…

什么是数据库的三级模式两级映象?

三级模式两级映象结构图 概念 三级模式 内模式:也称为存储模式,是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。定义所有的内部记录类型、索引和文件组织方式,以及数据控制方面的细节。模式:又称概念…

计算机今年炸了,究竟炸到什么程度呢❓

小兄弟,计算机哪年不爆炸啊! 尤其是19年,20年,21年,可以说是计算机最卷的几年,这几年也刚好是互联网企业风头正盛的几年 从这里大家可以看出来,任何一个行业都有他的周期,任何一个专…

中等题 ------ 数组以及字符串

以前刷的都是一些简单题,从一些基本的数据结构到算法,得有400多道了,简单题就先这样吧,从今天以后就开始着手中等题和困难题了。 做了一些中等题,感觉确实和简单题没法比,简单题有些直接模拟,暴…

vue3框架基本使用

一、安装包管理工具 vite和vue-cli一样,都是脚手架。 1.node版本 PS E:\vuecode\vite1> node -v v18.12.12.安装yarn工具 2.1 yarn简单介绍 yarn是一个包管理工具,也是一个构建、打包工具 yarn需要借助npm进行安装:执行的命令行npm i…

linux安装docker-compose

前言 如果你的docker版本是23,请移步到linux安装新版docker(23)和docker-compose这篇博客 查看docker版本命令: docker --version今天安装docker-compose的时候,找了很多教程,但是本地一直报错&#xff0…

c++学习第十三讲---STL常用容器---string容器

string容器: 一、string的本质: string和char*的区别: char*是一个指针 string是一个类,封装了char*,管理这个字符串,是char*的容器。 二、string构造函数: string() ; …

C#常见内存泄漏

背景 在开发中由于对语言特性不了解或经验不足或疏忽,往往会造成一些低级bug。而内存泄漏就是最常见的一个,这个问题在测试过程中,因为操作频次低,而不能完全被暴露出来;而在正式使用时,由于使用次数增加&…

STM32之IIC总线控制ATC24C04

一、存储器介绍 1、电子密码存储概述 单片机的电子密码存储是一种将密码信息以电子形式存储在单片机内部的技术。它通常用于需要保护敏感信息或限制访问权限的应用程序,如安全系统、门禁系统、电子锁等。 电子密码存储可以通过多种方式实现,以下是其中…

Linux内核进程管理

什么是进程 进程的概念 进程是处于执行期的程序和他所占用资源的总称。进程就是运行的代码,进程的声明从代码开始运行那一刻开始;单纯的程序并非是是一个进程,一个程序也可能不只包含一个进程。 进程和线程的区别,与联系 线程…

Redis常用数据类型--String

String 常用命令SETGETMGETMSETSETNXINCR/DECRINCRBY/DECRBYINCRBYFLOATAPPENDGETRANGESETRANGESTRLEN 内部编码典型应用场景 常用命令 SET 将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,⽆论原来的数据类型是什么。之 前关于此 k…

mysql8安装基础操作(一)

一、下载mysql8.0 1.查看系统glibc版本 这里可以看到glibc版本为2.17,所以下载mysql8.0的版本时候尽量和glibc版本对应 [rootnode2 ~]# rpm -qa |grep -w glibc glibc-2.17-222.el7.x86_64 glibc-devel-2.17-222.el7.x86_64 glibc-common-2.17-222.el7.x86_64 gl…

PingCode:引领敏捷开发的项目管理新范式

引言: 在快速变化的软件开发行业中,项目管理工具的选择对于团队的协作效率和项目的成功率至关重要。PingCode作为一款集成了敏捷开发理念的项目管理工具,正逐渐成为业界的新宠。本文将深入探讨PingCode的核心功能、使用场景以及如何利用这款工…

.NET高级面试指南专题三【线程和进程】

在C#中,线程(Thread)和进程(Process)是多任务编程中的重要概念,它们用于实现并发执行和多任务处理。 进程(Process): 定义: 进程是正在运行的程序的实例&…

js的编码和解码

在 JavaScript 中,可以使用以下内置函数来进行编码和解码: 编码 encodeURIComponent(): 该函数用于对 URI 组件进行编码,它可以将字符串中的特殊字符转换为对应的编码形式。例如,空格会被编码为 %20。 var originalString &qu…

volatile内存语义

文章目录 volatile写的内存语义volatile读的内存语义:volatile内存语义的实现原理volatile禁止重排序规则volatile禁止重排序场景有序性案例分析案例描述错误代码:如何纠正:纠正后 volatile写的内存语义 当写一个volatile变量时,J…

鸿蒙架构Android架构分析

鸿蒙(HarmonyOS)和Android是两种主要的智能设备操作系统,它们在架构设计、功能特性和开发者支持等方面展现出不同的理念和优势。以下是对鸿蒙架构和Android架构的详细分析: 架构设计 鸿蒙OS架构: 鸿蒙OS采用微内核设…