03-MVC执行流程-参数解析与Model

重要组件



准备Model,Controller

@Configuration
public class WebConfig {

    @ControllerAdvice
    static class MyControllerAdvice {

        @ModelAttribute("b")
        public String bar() {
            return "bar";
        }

    }

    @Controller
    static class Controller1 {

        @ResponseStatus(HttpStatus.OK)  // 添加此注解  这里不测试返回值处理器
        public ModelAndView foo(@ModelAttribute("u") User user) {
            System.out.println("Controller1.foo");
            System.out.println("user = " + user);
            return null;
        }

    }

    @Data
    static class User {
        private String name;
    }
}

准备参数解析器

private static HandlerMethodArgumentResolverComposite argumentResolverComposite(AnnotationConfigApplicationContext annotationConfigApplicationContext) {
        DefaultListableBeanFactory beanFactory = annotationConfigApplicationContext.getDefaultListableBeanFactory();
        HandlerMethodArgumentResolverComposite resolverComposite = new HandlerMethodArgumentResolverComposite();
        resolverComposite.addResolvers(
                // @RequestParam参数解析器       false表示参数上必须有注解才会解析
                new RequestParamMethodArgumentResolver(beanFactory, false),
                // @PathVariable
                new PathVariableMethodArgumentResolver(),
                // @RequestHeader
                new RequestHeaderMethodArgumentResolver(beanFactory),
                // @CookieValue
                new ServletCookieValueMethodArgumentResolver(beanFactory),
                // Spring表达式参数解析器
                new ExpressionValueMethodArgumentResolver(beanFactory),
                // HttpServletRequest
                new ServletRequestMethodArgumentResolver(),
                // 是否不需要注解@ModelAttribute false:需要  即没有@ModelAttribute的实体参数不解析
                new ServletModelAttributeMethodProcessor(false),
                // @RequestBody
                new RequestResponseBodyMethodProcessor(CollUtil.newArrayList(new MappingJackson2HttpMessageConverter())),
                /**
                 *是否不需要注解@ModelAttribute true:不需要  即没有@ModelAttribute的实体参数也解析
                 * 注意!!!  这个解析器必须放在@RequestBody解析器后面,否则这个解析器将会优先被使用去解析
                 */
                new ServletModelAttributeMethodProcessor(true),
                /**
                 * @RequestParam 参数解析器 true表示参数上没有注解也会解析
                 * 注意!!!  这个解析器必须放在后面 否则其它类型参数将使用这个解析器解析
                 */
                new RequestParamMethodArgumentResolver(beanFactory, true)
        );
        return resolverComposite;
    }

测试MVC流程

// 1. 准备容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(WebConfig.class);

// 2. 准备RequestMappingHandlerAdapter  测试:获取模型工厂并获取初始化时配置在ControllerAdvice中的模型数据
RequestMappingHandlerAdapter requestMappingHandlerAdapter = new RequestMappingHandlerAdapter();
requestMappingHandlerAdapter.setApplicationContext(applicationContext);
requestMappingHandlerAdapter.afterPropertiesSet();
Method getModelFactoryMethod = RequestMappingHandlerAdapter.class.getDeclaredMethod("getModelFactory", HandlerMethod.class, WebDataBinderFactory.class);
getModelFactoryMethod.setAccessible(true);

// 3. 准备请求
MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();
mockHttpServletRequest.setParameter("name", "zhoujunlin");
ServletWebRequest servletWebRequest = new ServletWebRequest(mockHttpServletRequest);

// 4. 准备servletInvocableHandlerMethod
ServletInvocableHandlerMethod servletInvocableHandlerMethod = new ServletInvocableHandlerMethod(new Controller1(), Controller1.class.getDeclaredMethod("foo", WebConfig.User.class));
// 这里没有特殊参数绑定  入参传null
ServletRequestDataBinderFactory servletRequestDataBinderFactory = new ServletRequestDataBinderFactory(null, null);
servletInvocableHandlerMethod.setDataBinderFactory(servletRequestDataBinderFactory);
servletInvocableHandlerMethod.setParameterNameDiscoverer(new DefaultParameterNameDiscoverer());
servletInvocableHandlerMethod.setHandlerMethodArgumentResolvers(argumentResolverComposite(applicationContext));
// 暂不研究返回值处理器

// 5. 准备ModelAndViewContainer容器
ModelAndViewContainer modelAndViewContainer = new ModelAndViewContainer();

// 6. 获取模型工厂并初始化模型数据
ModelFactory modelFactory = (ModelFactory) getModelFactoryMethod.invoke(requestMappingHandlerAdapter, servletInvocableHandlerMethod, servletRequestDataBinderFactory);
modelFactory.initModel(servletWebRequest, modelAndViewContainer, servletInvocableHandlerMethod);

// 7. 方法执行
servletInvocableHandlerMethod.invokeAndHandle(
        servletWebRequest,
        modelAndViewContainer);

System.out.println("modelAndViewContainer.getModel() = " + modelAndViewContainer.getModel());

// 8. 关闭容器
applicationContext.close();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CUDA的基础知识

文章目录 数据精度CUDA概念线程&线程块&线程网络&计算核心GPU规格参数内存 GPU并行方式数据并行流水并行张量并行混合专家系统 数据精度 FP32 是单精度浮点数,用8bit 表示指数,23bit 表示小数;FP16 是半精度浮点数,用…

SpringBoot常用注解与注意事项

Spring Boot 是一个用于快速开发、运行和管理 Spring 应用程序的框架。它大量使用了注解(Annotations)来简化配置和开发流程。 以下是一些 Spring Boot 中常用的注解及其注意事项: 1.常用注解 SpringBootApplication 这是一个组合注解&#…

OpenHarmony 项目实战:智能体重秤

一、简介 本 demo 基于 OpenHarmony3.1Beta 版本开发,该样例能够接入数字管家应用,通过数字管家应用监测体重秤上报数据,获得当前测量到的体重,身高,并在应用端形成一段时间内记录的体重值,以折线图的形式…

vivado Aurora 8B/10B IP核(4)-数据流接口(Streaming Interface)

Streaming 接口 Transmitting and Receiving Data(发送和接收数据) 流式接口允许将Aurora 8B/10B通道用作管道。 初始化后,通道始终可用于写入,除非发送时 钟补偿序列。 核心数据传输符合AXI4-Stream协议。当s_axi_tx_tvalid被取…

OpenHarmony 实战开发——分布式购物车案例展示~

简介 分布式购物车demo 模拟的是我们购物时参加满减活动,进行拼单的场景;实现两人拼单时,其他一人添加商品到购物车,另外一人购物车列表能同步更新,且在购物车列表页面结算时,某一人结算对方也能实时知道结…

基于单片机的多功能电子万年历系统

摘要:该题目要求学生综合运用单片机原理、低频电子线路、数字电路与逻辑设计等相关知识,设计完成多功能电子万年历系统。通过完成设计任务,使学生掌握单片机设计开发的基本流程,增强学生动手实践能力,培养学生分析和解决实际问题的能力,为后续课程的学习和工作打下良好基础。 关…

特征的前期融合与后期融合在召回、粗排、精排应用

前期融合:先对所有特征做concat,再输入DNN,一般常见于精排模型 特点:线上推理代价大,若有n个候选item需要做n次模型计算 后期融合:把用户和物品特征分别输入不同的神经网络,不对用户和物品做融…

基于Springboot的玩具租赁系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的玩具租赁系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

多用户商城系统哪个好,2024多用户商城系统这样选

在2024年选择适合的多用户商城系统是一项至关重要的决策,因为一个优秀的商城系统不仅可以提升用户体验,还能够帮助企业实现业务目标并取得长期成功。然而,在众多的选择中挑选出最适合的一个并不容易,需要综合考虑各种因素&#xf…

static page 项目

static page 项目 作者:不染心 博客地址:https://blog.csdn.net/qq_38234785 源码地址:https://mbd.pub/o/bread/ZpWVlJps 未经允许,不得转载 文档版本v1,还没写完持续更新 一、引言 1. 软件概述和背景 本软件是…

Python-软件设计-“帮助”小孩子自我行为(电脑端看短视频)约束

目录 前言一、方式一:网站访问拦截二、方式二:SW(电脑软件简称)启动拦截三、使用代码的方式将方式一和方式二结合成自动化程序部署四、其他拓展知识1.程序打包2、开机自启文件夹 五、报错的解决方式1、打包成软件后,运行那个软件时不执行或报…

【论文阅读】ViTAE:Vision transformer advanced by exploring intrinsic inductive bias

ViTAE:Vision transformer advanced by exploring intrinsic inductive bias 论文地址摘要:简介:3 方法论3.1 重温视觉变压器3.2 ViTAE3.3 缩减单元3.4 Normal cell3.5 模型细节 4 训练4.1 Implementation details4.2 Comparison with the state-of-the-…

Linxu系统服务管理,systemd知识/进程优先级/平均负载/php进程CPU100%怎么解决系列知识!

shell脚本(命令)放后台 sleep 300& 放到后台运行,脚本或命令要全路径 nohup:用户推出系统进程继续工作 【功能说明】 nohup 命令可以将程序以忽略挂起信号的方式运行起来,被运行程序的输出信息将不会显示到终端 如…

华为鸿蒙应用--封装通用标题栏:CommonTitleBar(鸿蒙工具)-ArkTs

0、效果图 自定义通用标题栏 支持左、中、右常规标题栏设置; 支持自定义视图; 支持搜索功能 一、CommTitleBar代码 import router from ohos.router; import { Constants } from ../../constants/Constants; import { StyleConstants } from ../../…

PostgreSQL 把多余字段转JSON

核心SQL: json_agg(json_build_object(kgrq, a.kgrq, jgrq, a.jgrq, sgdd, a.sgdd))

理解与使用Linux设备树编译器(DTC)

这里写目录标题 设备树简介设备树编译器(DTC)安装DTC使用DTC实例:编辑设备树小结参考资料 Linux设备树编译器(DTC)是一个关键工具,用于处理嵌入式Linux系统中的设备树文件。本文将介绍设备树的概念、DTC的基…

基于Docker + Locust的数据持久化性能测试系统

前几天给大家分享了如何使用Locust进行性能测试,但是在实际使用中会发现存在压测的结果无法保存的问题,比如在分布式部署情况下进行压测,每轮压测完成需要释放资源删除容器重新部署后,这段时间的压测结果就都丢失了,如…

一文讲解Android车载系统camera架构 - EVS

Android的camera开发中,使用最多的是camera2 以及现在Google主推的cameraX 架构,而这两个架构主要针对的是手机移动端上camera的流程。 而今天介绍的EVS(Exterior View System)架构是不同于camera2上的手机架构,针对Automotive的版本&#x…

【源码阅读】 Golang中的database/sql库源码探究

Note:文章待完结 文章目录 前言一、整体目录结构二、driver包1、驱动相关driver.Driver2、驱动连接:driver.Conn3、预处理结构:Stmt4、执行结果 driver.Result5、查询结果:driver.Rows6、driver.RowsAffected7、driver.Value8、Va…

vue-quill-editor富文本插件控制字数显示

最终效果 富文本编辑框&#xff0c;只统计内容&#xff0c;不包含标签以及样式&#xff0c;超出最大字数限制提示。 具体代码 html <div class"relative"><quillEditorv-model"form.nutriSuggestion"ref"myQuillEditor7":options&quo…
最新文章