【老王读SpringMVC-5】Controller method 是如何执行的?

news2024/9/21 16:39:25

通过前面对 Controller method 参数绑定的分析,我们知道, 被 @RequestMapping 标记 handler method 的执行是通过调用 RequestMappingHandlerAdapter#handle()

RequestMappingHandlerAdapter#handle() 具体的调用过程如下:
RequestMappingHandlerAdapter2.png

参数解析、handler method 的执行 和 对返回值的处理,最终是通过 ServletInvocableHandlerMethod#invokeAndHandle() 来处理的。

ServletInvocableHandlerMethod#invokeAndHandle() 的处理过程如下:
ServletInvocableHandlerMethod2.png

// org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest
public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
        Object... providedArgs) throws Exception {

    Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
    if (logger.isTraceEnabled()) {
        logger.trace("Arguments: " + Arrays.toString(args));
    }
    return doInvoke(args);
}

1、首先,通过 HandlerMethodArgumentResolver 解析出方法执行所需要的参数,然后通过反射调用 handler method 来执行。
2、如果 handler method 的返回值为空,则看是否跳过返回值处理和视图解析,直接返回
3、通过 HandlerMethodReturnValueHandler 来处理 handler method 的返回值
4、通过 ModelAndViewContainer 对象组装出 ModelAndView 对象进行返回。
(如果 requestHandled=true,则直接返回 null,不经过视图解析)

补充:SpringMVC 相关的对象、实体

ModelAndViewContainer

ModelAndViewContainer 用于记录 HandlerMethodArgumentResolverHandlerMethodReturnValueHandler 在调用 handler method 过程中做出的与模型和视图相关的决策。

public class ModelAndViewContainer {

    // 在重定向的时候是否使用默认 Model 的内容
    private boolean ignoreDefaultModelOnRedirect = false;

    @Nullable
    private Object view;

    // 默认模型在实例化时自动创建
    private final ModelMap defaultModel = new BindingAwareModelMap();

    // 重定向的 Model 
    @Nullable
    private ModelMap redirectModel;

    // 标记是否是重定向的场景
    // 如果是重定向场景,getModel()返回重定向模型而不是默认模型
    private boolean redirectModelScenario = false;

    @Nullable
    private HttpStatus status;

    private final SessionStatus sessionStatus = new SimpleSessionStatus();

    // 用于标记请求已被直接处理,不需要视图解析
    private boolean requestHandled = false;
}

ModelAndView

ModelAndView 是 Spring MVC 框架中模型和视图的持有者,用于表示 handler method 返回的模型和视图,最终会由 DispatcherServlet 解析。

public class ModelAndView {

    /** View instance or view name String. 
     * View 对象 或者 String 类型的 view name。
     * */
    @Nullable
    private Object view;

    /** Model Map. */
    @Nullable
    private ModelMap model;

    /** Optional HTTP status for the response. */
    @Nullable
    private HttpStatus status;
}

View:

视图可以采用 String 类型的视图名称 或者直接指定 View 对象,需要由 ViewResolver 解析。

Model:

模型采用的是 Map 类型,允许使用名称来访问值对象,也就是使用 Map 的形式访问整个模型对象。

Model.png

BindingAwareModelMap 是 SpringMVC 向 handler method 暴露的类。
通常是通过 Model 接口来声明使用的,不需要在用户代码中构建它。

RedirectAttributesModelMap 是重定向属性的 ModelMap 实现。
提供了一个它提供了闪存 mode 属性的地方,这样重定向的model 属性就可以在重定向中生存,而无需嵌入重定向URL中。

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

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

相关文章

【Java基础篇】运算符

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用&…

由浅入深Dubbo网络通信深入解析

目录 1 dubbo中数据格式2 消费方发送请求3 提供方接收请求4 提供方返回调用结果5 消费方接收调用结果6 异步转同步7 异步多线程数据一致8 心跳检查 1 dubbo中数据格式 解决socket中数据粘包拆包问题,一般有三种方式 定长协议(数据包长度一致&#xff09…

5GNR——RACH随机接入流程(1):随机接入的原因

1、随机接入触发原因 1- Initial access from RRC_IDLE; 2- RRC Connection Re-establishment procedure; 3- DL or UL data arrival during RRC_CONNECTED when UL synchronisation status is “non-synchronised”; 4- UL data arrival during RRC_CONNECTED when there are …

Java之运算符

+加号的作用 1.表示正数 2.相加运算符 3.进行字符串的拼接 4.自增 Tips: 运算运算符优于 扩展赋值运算符 byte a ; int b ; ab; 右侧为byte,无需强制转换 aab; 右侧为int,需强制转换为byte,赋给左边…

解码区块链:探索去中心化世界的奥秘与潜力

🐟 区块链技术的基本原理🐟 区块链技术的应用场景🐟 区块链技术的挑战与前景 区块链技术作为一项创新性的技术,引领着数字时代的变革。它以其去中心化、透明性和安全性的特点,为各行业带来了无限可能。在本篇博客中&am…

《程序员面试金典(第6版)》面试题 02.05. 链表求和(构建一个新链表)

题目解析 给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。 题目传送门:面试题 02.05. 链表求和 示例: 输入&#x…

漏洞管理基础知识

漏洞管理对于端点安全至关重要,是在安全漏洞导致漏洞之前清除安全漏洞的最主动方法之一。 什么是漏洞 漏洞是软件中的错误代码段,会导致软件崩溃或以程序员从未预料到的方式做出响应。黑客可以利用漏洞对计算机系统进行未经授权的访问或对计算机系统执行…

第五十天学习记录:C语言进阶:位段

位段 什么是位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 1、位段的成员可以是int,unsigned int或signed int。 2、位段的成员名后边有一个冒号和一个数字。 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>//位段-二进制位 struct A {int …

用脚本采集ChatGPT免翻免费镜像

新建了一个网站 ChatGPT人工智能中文站 - ChatGPT人工智能中文站 每天给大家更新可用的国内可用chatGPT免费镜像站 昨天发布了一个教程 本地安装 ChatGPT&#xff01;无需API、 免翻墙、完全免费使用纯正OpenAI的全部功能&#xff01; 支持 Windows、 Mac、NAS、Linux系统 …

led钨丝灯项目笔记

基于ESP-12E的LED钨丝灯作品 原理图&#xff1a; PCB&#xff1a; 嘉立创上面有些封装没有&#xff0c;需要自己画 画完这两个&#xff0c;此时它们还没有相关联&#xff0c;需要将它们关联起来 在封装管理器中将它们关联起来 在这里面就可以找到自己画的封装 如&#xff1a;…

MySQL数据库从入门到精通学习第5天(创建数据表,查看,修改表结构,删除表)

创建数据表&#xff0c;查看&#xff0c;修改表结构 创建数据表查看表结构修改表结构删除表 创建数据表 在对MySQL数据表进行操作之前我们需要创建数据库&#xff0c;并使用USE语句选择数据库。 创建数据库使用CREATE TABLE语句&#xff1a; 语法&#xff1a;CREATE [TEMPOR…

机试打卡 -06 异位词分组(哈希表)

最容易想到的是利用 ord( ) 函数&#xff0c;按照字母计数的特征归类&#xff0c;代码如下&#xff1a; class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:ans_list[]# 哈希表 {word_count:ans_list中的索引}word_count_dictdict()# 遍历strfo…

NR RLC(三) TM and UM mode

欢迎关注同名微信公众号“modem协议笔记”。 实网下VOLTE通话时常会出现通话无声或者断续的情况&#xff0c;通常的做法是通过检查MO/MT UL发送和DL接收&#xff0c;进一步排查问题原因&#xff0c;modem就避免不了要查看RLC的收发情况&#xff0c;而voice配置一般都是RLC UM …

【Linux系统编程(文件编程)】之读、写文件、文件光标移动

文章目录 一、文件写入二、文件读取三、文件光标移动使用 lseek() 计算文件大小 一、文件写入 write() writes up to count bytes from the buffer starting at buf to the file referred to by the file descriptor fd.write() write() 函数&#xff0c;将从buf缓冲区开始&…

开发实例:Spring Boot、MyBatis和Layui打造增删改查项目

目录导航 1. 技术栈介绍1.1 Springboot1.2 MyBatis1.3 Layui 2. 开发环境2.1 前端示例代码2.2 后端示例代码2.3 数据库建表语句 3. 项目截图4. 运行截图4.1 查询界面4.2 新增界面4.3 修改界面4.4 删除界面 5. 小结6. 完整代码下载 通过学习这个实例项目&#xff0c;我们将积累点…

[HarekazeCTF2019]baby_rop2

小白垃圾笔记&#xff0c;不建议阅读。 这道题学到了两个思想吧&#xff1a; 1.一个是有的函数泄露libc打印不写出来。 2.另一个是printf函数的利用吧。 3.栈对齐好像是只有system有。 分析下题目吧&#xff1a; 64位 绕过nx 本来以为第10行&#xff0c;有坑呢。结果好像是…

简单三招教你音频怎么翻译

随着世界全球化的加速发展和文化交流的增多&#xff0c;音频翻译这项技术变得越来越重要。在国际商务和学术会议中&#xff0c;语言的沟通至关重要。不同国家或地区的参与者会用不同的语言进行交流&#xff0c;这时候&#xff0c;使用音频翻译就可以帮助他们更好地沟通&#xf…

2023年最强测试工程师Linux面试题及答案

前言&#xff1a; 大家好&#xff0c;前段时间有很多朋友给我私信留言&#xff1a;在面试软件测试工作时&#xff0c;部分的liunx的问题答不上来&#xff0c;于是雷叔快马加鞭&#xff0c;连夜给大家整理了一份关于linux的面试题&#xff0c;请看好了。 正文&#xff1a; 1.三…

算法分析基础

问题&#xff1a;如何比较不同算法的性能&#xff1f; 分析算法的运行时间 算法分析的原则 归纳基本操作 如:运算、赋值、比较 统一机器性能 假设基本操作代价均为1 统一机器性能后&#xff0c;算法运行时间依赖于问题输入规模与实例 相同输入规模&#xff0c…

python神经网络实现手写数字识别实验

手写数字识别实验是机器学习中最常见的一个示例&#xff0c;可以有很多种办法实现&#xff0c;最基础的其实就是利用knn算法&#xff0c;根据数字图片对应矩阵与经过训练的数字进行距离计算&#xff0c;最后这个距离最短&#xff0c;那么就认为它是哪个数字。 这里直接通过神经…