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

重要组件



准备Model,Controller

@Configuration
public class WebConfig {@ControllerAdvicestatic class MyControllerAdvice {@ModelAttribute("b")public String bar() {return "bar";}}@Controllerstatic class Controller1 {@ResponseStatus(HttpStatus.OK)  // 添加此注解  这里不测试返回值处理器public ModelAndView foo(@ModelAttribute("u") User user) {System.out.println("Controller1.foo");System.out.println("user = " + user);return null;}}@Datastatic 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),// @PathVariablenew PathVariableMethodArgumentResolver(),// @RequestHeadernew RequestHeaderMethodArgumentResolver(beanFactory),// @CookieValuenew ServletCookieValueMethodArgumentResolver(beanFactory),// Spring表达式参数解析器new ExpressionValueMethodArgumentResolver(beanFactory),// HttpServletRequestnew ServletRequestMethodArgumentResolver(),// 是否不需要注解@ModelAttribute false:需要  即没有@ModelAttribute的实体参数不解析new ServletModelAttributeMethodProcessor(false),// @RequestBodynew 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.mzph.cn/diannao/4252.shtml

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

相关文章

windows环境下安装Apache

首先apache官网下载地址:http://www.apachelounge.com/download/按照自己的电脑操作系统来安装 这里我安装的是win64 主版本是2.4的apache。 然后解压压缩包到一个全英文的路径下!!!一定一定不要有中文 中文符号也不要有&#xff…

ansible-copy用法

目录 概述实践不带目录拷贝带目录拷贝 概述 ansible copy 常用用法举例 不带目录拷贝,拷贝的地址要写全 带目录拷贝,拷贝路径不要写在 dest 路径中 实践 不带目录拷贝 # with_fileglob 是 Ansible 中的一个循环关键字,用于处理文件通配符匹…

【Vue3+Tres 三维开发】02-Debug

预览 介绍 Debug 这里主要是讲在三维中的调试,同以前threejs中使用的lil-gui类似,TRESJS也提供了一套可视化参数调试的插件。使用方式和之前的组件相似。 使用 通过导入useTweakPane 即可 import { useTweakPane, OrbitControls } from "@tresjs/cientos"const {…

数字文旅重塑旅游发展新格局:以数字化转型为突破口,提升旅游服务的智能化水平,为游客带来全新的旅游体验

随着信息技术的迅猛发展,数字化已成为推动各行各业创新发展的重要力量。在旅游业领域,数字文旅的兴起正以其强大的驱动力,重塑旅游发展的新格局。数字文旅以数字化转型为突破口,通过提升旅游服务的智能化水平,为游客带…

HarmonyOS Next从入门到精通实战精品课

第一阶段:HarmonyOS Next星河版从入门到精通该阶段由HarmonyOS Next星河版本出发,介绍HarmonyOS Next版本应用开发基础概念,辅助学员快速上手新版本开发范式,共计42课时 第一天鸿蒙NEXT Mac版、Windows版【编辑器】和【模拟器】&a…

BootStrap详解

Bootstrap简介 什么是BootStrap? BootStrap来自Twitter,是目前最受欢迎的响应式前端框Bootstrap是基于HTML、CSS、JavaScript的,它简洁灵活,使得Web开发更加快捷 为什么使用Bootstrap? 移动设备优先:自…

Kafka 3.x.x 入门到精通(07)——Java应用场景——SpringBoot集成

Kafka 3.x.x 入门到精通(07)——Java应用场景——SpringBoot集成 4. Java应用场景——SpringBoot集成4.1 创建SpringBoot项目4.1.1 创建SpringBoot项目4.1.2 修改pom.xml文件4.1.3 在resources中增加application.yml文件 4.2 编写功能代码4.2.1 创建配置…

机器人-轨迹规划

旋转矩阵 旋转矩阵--R--一个3*3的矩阵,其每列的值时B坐标系在A坐标系上的投影值。 代表B坐标系相对于A坐标系的姿态。 旋转矩阵的转置矩阵 其实A相对于B的旋转矩阵就相当于把B的列放到行上就行。 视频 (将矩阵的行列互换得到的新矩阵称为转置矩阵。&…

SQLite尽如此轻量

众所周知,SQLite是个轻量级数据库,适用于中小型服务应用等,在我真正使用的时候才发现,它虽然轻量,但不知道它却如此轻量。 下载 官网: SQLite Download Page 安装 1、将下载好的两个压缩包同时解压到一个…

【PG-2】PostgreSQL存储管理器

2. PostgreSQL存储管理器 src/backend/storage (base) torrestorresの机革:~/codes/postgresql-16.2/src/backend/storage$ ls Makefile buffer file freespace ipc large_object lmgr meson.build objfiles.txt page smgr sync存储管理器—smgr 通用存储管理器 …

航拍图像拼接 | 使用C++实现的无人机航拍图像拼接

项目应用场景 面向无人机航拍图像拼接场景,项目使用 C 实现,使用 harris 角点查找特征点 非极大值抑制,由于航拍图像没有严重的尺度旋转变化,使用了 berief 描述子,然后使用 RANSAC 求 H,最后进行图像拼接…

linux 中 make 和 gmake的关系

1. 关系 gmake特指GNU make。 make是指系统默认的make实现; 在大多数Linux发行版中,make就是GNU make,但是在其他unix中,gmake可以指代make的某些其他实现,例如BSD make或各种商业unix的make实现。 gmake是GNU Make的缩写。 Linux…

【算法一则】【贪心】数组中的数可以拼装成的最大数

题目 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 示例 1: 输入:nums [10,2] …

【UnityRPG游戏制作】RPG项目的背包系统商城系统和BOSS大界面

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

二分查找-在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 输入&#xf…

程序链接步骤2:重定位

一、链接步骤 链接步骤1“符号解析”: 将符号引用和符号定义建立关联后; 链接步骤2“重定位”: 将引用符号的地址“重定位”为相关联的符号定义的地址。 二、原文链接:https://www.jianshu.com/p/7d13ec4735ba 符号解析完成后&…

ZooKeeper 搭建详细步骤之二(伪集群模式)

ZooKeeper 搭建详细步骤之一(单机模式) ZooKeeper 及相关概念简介 伪集群搭建 ZooKeeper 伪集群是指在一个单一的物理或虚拟机环境中模拟出一个由多个 ZooKeeper 节点构成的集群。尽管这些节点实际上运行在同一台机器上,但它们通过配置不同的…

字节秋招高频算法汇总(高级篇)

更多大厂面试内容可见 -> http://11come.cn 字节秋招高频算法汇总 接下来讲一下 字节秋招 中的高频算法题,分为三个部分: 基础篇 、 中级篇 、 进阶篇 目的就是为了应对秋招中的算法题,其实过算法题的诀窍就在于 理解的基础上 背会 看…

与Apollo共创生态:我和Apollo七周年大会的心路历程

一、写在前面 前几天观看了Apollo七周年大会,给我带来了超多的惊喜,博主想将这份惊喜分享给大家! 二、Apollo开放平台 Apollo开放平台秉承其核心理念——开放能力、共享资源、加速创新、持续共赢,致力于推动自动驾驶技术的革新…

《HCIP-openEuler实验指导手册》1.2Apache主页面配置

一、配置服务器监听IP及端口 注释主配置文件“监听IP及端口”部分 cd /etc/httpd/conf cp httpd.conf httpd.conf.bak vim httpd.conf可以在普通模式下搜索Listen关键字 :/Listen按n键继续向后搜索 在/etc/httpd/conf.d中新建子配置文件port.conf: touch /etc…