SpringMVC处理流程介绍

news2024/9/22 7:33:04

SpringMVC请求处理流程

image.png

  1. 发起请求到前端控制器(DispatcherServlet)
  2. 前端控制器请求HandlerMapping查找Handler(可以根据xml配置,注解进行查找)

对应Spring源码

//在类DispatcherServlet里面
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

    try {
        try {
            ModelAndView mv = null;
            Exception dispatchException = null;

            try {
                processedRequest = this.checkMultipart(request);
                multipartRequestParsed = processedRequest != request;
                mappedHandler = this.getHandler(processedRequest);
                //getHandler方法内部会遍历配置的HandlerMapping实例来找到请求相匹配的Handler
                
            //...其余代码省略
}
  1. 处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

对应Spring源码

@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
    if (this.handlerMappings != null) {
        Iterator var2 = this.handlerMappings.iterator();

        while(var2.hasNext()) {
            HandlerMapping mapping = (HandlerMapping)var2.next();
            HandlerExecutionChain handler = mapping.getHandler(request);
            if (handler != null) {
                return handler;
            }
        }
    }

    return null;
}
  1. 前端控制器调用处理器去执行Handler
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
   //代码省略......
                mappedHandler = this.getHandler(processedRequest);
                if (mappedHandler == null) {
                    this.noHandlerFound(processedRequest, response);
                    return;
                }

                HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());

    //代码省略
  1. 处理器适配器HandlerAdapter将会根据适配去执行Handler
  2. Handler执行完成给适配器返回ModelAndView
  3. 处理器适配器向前端控制器返回ModelAndView(ModelAndView是SpringMVC框架的一个底层对象,包括Model和view)
try {
    try {
        ModelAndView mv = null;
        //代码省略....
        mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
        //代码省略....
  1. 前端控制器请求视图解析器去进行视图解析(根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更换视图解析器即可
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
   //代码省略....

            this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);
   //代码省略///

  1. 视图解析器向前端控制器返回view
  2. 前端控制器进行视图渲染(视图渲染将模型数据(在ModelAndView对象中)填充到request域)
  3. 前端控制器向用户响应结果

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

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

相关文章

Leetcode102二叉树的层序遍历(java实现)

今天分享的题目是lee102题,题目的描述如下: 可能做到这道题的小伙伴写过其他关于二叉树的题目,但是一般是使用递归的方式做一个深度遍历,而层序遍历我们该如何做呢? 解题思路:使用一个队列来记录本层节点&a…

浅谈新能源汽车充电桩安装以及防范

摘要:随着国家对绿色环保的倡导,新能源电动汽车应运而生,它们采用清洁能源替代传统能源,有效避免了对自然环境的污染,并减少了资源消耗,实现了资源的高效利用。新能源电动汽车的普及降低了使用成本&#xf…

Rust Linux开发人员自比道路建设者和寻路者的区别

红帽公司(Red Hat)的长期直接渲染管理器(Direct Rendering Manager,DRM)子系统维护者大卫-艾尔里(David Airlie)撰写了一篇有趣的博文,将开发人员的类型与筑路工人、寻路者与酒店进行…

800G OSFP光模块发展概述

在快速发展的高速网络领域,800G OSFP光模块的演变象征着创新与进步。自诞生以来,800G OSFP光模块凭借哪些独特优势脱颖而出?本文将重点介绍800G OSFP光模块的发展路径。 800G OSFP光模块发展路径 路径一:EML 路由 800G DR8 OSF…

Python进阶07-高级语法

零、文章目录 Python进阶07-高级语法 1、with语句 (1)文件操作 文件使用完后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的 # 第一步:打开文件 f open(python.txt…

另一种关于类的小例

前言 我们还是以一段关于构造函数的代码作为开端,我们以之前银行家的小项目为背景 class Account {constructor(owner, currency, pin) {this.owner owner;this.currency currency;this.pin pin;} }const ITshare new Account(ITshare, EUR, 21211); console.…

堆垛机及AGV能力计算

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料,请球友到知识星球【智能仓储物流技术研习社】自行下载。 这份文件是关于堆垛机和AGV(…

第六课,模运算进阶,计算机存储单位

一,模运算的进阶知识 先复习一下已知的模运算知识: ①符号是%,但作为模运算符号时应念作“模”而非“百分之”或“百分号” ②参与模运算的数必须是两个整数,其作用是计算余数 然后新学几个模运算知识: ③当被除数是…

IPv4和子网掩码

目录 IP地址: IP概念: 网络号与主机号: 网关与跨网通信: IP地址的分类: 子网掩码: 如何确定两个IP地址是否在同一网段; 练习: 补充: IP地址: IP概念&#xff1…

哪家宠物空气净化器能吸毛除臭?希喂、352真实测评分享

自从家里同时迎来了猫咪与狗狗,生活的色彩确实丰富了许多,但这份喜悦的背后,也有每天理都理不断的“盛况”。每当结束了一天的忙碌,满心期待着家的温馨与安宁,推开家门的那一刻,猫和狗先迎接我的反而是它们…

Python实战项目:天气数据爬取+数据可视化(完整代码)_python爬虫实战

一、选题的背景 随着人们对天气的关注逐渐增加,天气预报数据的获取与可视化成为了当今的热门话题,天气预报我们每天都会关注,天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…

聊一聊质量测试框架

目录 质量测试框架的概述: 质量测试框架相关术语: 质量测试框架的构成及特性: 质量测试参考模型: 质量的生存周期的QM: 测量结果的应用: 常见的质量测试框架有哪些? 质量测试框架在使用…

springboot启动很慢,加载xml时卡住 或者 {dataSource-1} inited卡住 或者 primary数据库配置错误,很久启动不起来

springboot启动很慢,加载xml时卡住 或者 {dataSource-1} inited卡住 或者 primary数据库配置错误,很久启动不起来 1.第一步先rebuild一下2.如果还是很慢,可能是你debug启动的同时加了很多断点,需要把断点去掉。3.如果还是不行&…

设计模式-结构型模式-享元模式

1.享元模式定义 摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,从而让我们能在有限的内存容量中载入更多对象; 1.1 享元模式优缺点 优点 极大减少内存中相似或相同对象数量,节约系统资源&#xff0c…

Ascend C算子开发(入门)—— 算子开发初体验

文章目录 Ascend C算子开发(入门)—— 算子开发初体验Host与Device核函数什么是核函数如何编写核函数? 核函数实现例子——Hello World完整核函数泛讲 Ascend C算子开发(入门)—— 算子开发初体验 Host与Device Host…

从零开始学cv-9:图像滤波

文章目录 前言一、简介:二、图像滤波实现:2.1 均值滤波:2.2 高斯滤波:2.3 中值滤波:2.4 锐化滤波: 前言 在信息化时代,图像已成为人们获取信息、沟通交流的重要载体。随着科技的飞速发展&#…

《高等代数》范德蒙德行列式的证明

说明:此文章用于本人复习巩固,如果也能帮助到大家那就更加有意义了。 注:1)利用数学归纳法证明范德蒙德行列式。 2)将范德蒙德行列式最后一列除了“1”以外都化为“0”,再按照最后一列展开。 3&#xff09…

Python编码系列—Python项目架构的艺术:最佳实践与实战应用

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

线段树解决区间合并类问题

如果只维持一段区间连续1的最长字串长度是无法被线段树维护的:所以可以增加信息来共同维护 1.维护三个信息:连续1的最长字串长度、连续1的最长前缀长度、连续1的最长后缀长度 2.如果一段区域连续1的长度小于区域的总长度: 3.如果一段区域连续…

力扣376-摆动序列(java详细题解)

题目链接:https://leetcode.cn/problems/wiggle-subsequence/ 前情提要: 因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。 贪心方法:局部最优推出全局最优。 如果一个题你觉得可以用局部最优推出全局最优,并且…