说说@ModelAttribute在父类和子类中的执行顺序
@ModelAttribute在父类、子类的执行顺序
被 @ModelAttribute 注解的方法会在Controller每个方法执行之前都执行,因此对于一个Controller中包含多个URL的时候,要谨慎使用。
执行顺序:
先执行子类 @ModelAttribute 注解的方法,再执行父类中 @ModelAttribute 注解的方法。
@ModelAttribute原理概述以及使用注意点
@ModelAttribute注解修饰的方法:
1.从数据库中取出对象,把对象放到Map中,键为user
2.SpringMvc从Map中取出User对象,并且把请求参数赋值给User对象的对应属性
3.SpringMvc把上述的对象传入目标方法的参数
注意:在@ModelAttribute修饰的方法中,放入到Map中的键名要和目标方法入参类型的第一个字母小写的字符串一致
源码分析流程:
调用@ModelAttribute注解修饰的方法,实际上@ModelAttribute方法中Map中的数据放在了implicitModel中.
解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性
1).创建WebDataBinder对象
确定objectName属性:如果传入的attrName属性值为"",则objectName为类名第一个字母小写
注意:attrName若目标方法的POJO属性使用了@ModelAttribute来修饰,则attrName的值为@ModelAttribute的value属性
确定target属性
在implitModel中查找attrName对应的属性值.若不存在,则验证当前handler是否使用了@sessionAttribute进行修饰,则尝试从session中获取attrName所对应的属性值,若session中没有,则抛出了异常。
若Handler没有使用@sessionAttribute进行修饰,或者@SessionAttrbutes中没有value值指定的key和attrName相,则通过反射创建POJO对象.
2).SpringMvc把表单的请求参数赋给了WebDataBinder的target对应的属性,
3).SpringMvc会把WebDataBinder的attrName和targe给到implicitMoel
4).把WebDataBinder的target作为参数传递给目标方法的入参
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
java父类和子类初始化顺序的深入理解
继承类的构建过程是向外扩散的,子类初始化了,父类一定也初始化了 复制代码 代码如下: class Art{ Art(){ System.out.println("Art"); }}class Drawing extends Art{ Drawing(){ System.out.println("Drawing"); }}public class Cartoon extends Drawing { Cartoon(){ System.out.println(&q
-
java中子类继承父类,程序运行顺序的深入分析
我们经常在项目中使用继承,但是往往不太明白,程序运行的顺序以及原理,尤其是使用上转型对象的时候,以及父类子类中都有static变量和方法时,不知道先运行谁.我也是写了一个例子.总结了一下. 复制代码 代码如下: 父类:public class TestStatic { public static String name="china"; { System.out.println("========方法体========"); } static{
-
浅谈Java中父类与子类的加载顺序详解
复制代码 代码如下: class Parent { // 静态变量 public static String p_StaticField = "父类--静态变量"; // 变量(其实这用对象更好能体同这一点,如专门写一个类的实例) //如果这个变量放在初始化块的后面,是会报错的,因为你根本没有被初始化 public String p_Field = "父类--变量"; // 静态初始化块 static { S
-
关于Java继承中父类和子类构造函数的问题
Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数, 可以参考这篇Java子类实例化总是默认调用父类的无参构造操作 1.当父类没有显式定义构造方法时, 编辑器会默认为此类添加一个隐式无参构造函数.此时子类可以有自己的无参和有参构造方法.不论实例化时调用的是子类的有参还是无参构造函数,默认调用的是父类的无参构造函数. 2.当父类有显式定义无参构造方法时, 此时子类也可以有自己的无参和有参构造方法.类似于1,同样默认隐式调用父类的无参构造方法. 3.
-
说说@ModelAttribute在父类和子类中的执行顺序
@ModelAttribute在父类.子类的执行顺序 被 @ModelAttribute 注解的方法会在Controller每个方法执行之前都执行,因此对于一个Controller中包含多个URL的时候,要谨慎使用. 执行顺序: 先执行子类 @ModelAttribute 注解的方法,再执行父类中 @ModelAttribute 注解的方法. @ModelAttribute原理概述以及使用注意点 @ModelAttribute注解修饰的方法: 1.从数据库中取出对象,把对象放到Map中,键为us
-
Go中init()执行顺序详解
目录 概述 init()函数 执行时机 概述 init()一般用来做一些初始化工作, go允许定义多个init(),根据init()重复场景不同,可以分为 同文件 单文件中定义多个init() 同模块 同模块下不同文件中定义了多个init() 子模块 本模块和子模块都包含init() 跨模块 多个被引用模块中均含init() 要点秘诀: 涉及引用时,先加载的先执行 同一文件中,先定义的先执行 init()函数 init()函数没有参数,也没有返回值. init()函数在程序运行时,自动自动被调用
-
C#构造函数在基类和父类中的执行顺序
一.简介 当我们没有在子类构造函数中写上 base(),默认会先调用父类中无参的构造函数,再调用子类.当在有参构造函数后写上base时,只调用子类构造函数中有参的构造函数,隐藏父类无参构造函数. 二.代码案例 父类代码: #region 父类 /// <summary> /// 测试构造函数--需要被构造类 Fu /// </summary> class Fu { private int x;//一个简单的私有字段 /// <summary> /// 构造函数 ///
-
页面中js执行顺序
下面是测试的代码: 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <head runat="server"> <title>测试js的执行顺序</title> <script language="javascript" type="text/javascri
-
改变 Python 中线程执行顺序的方法
一.主线程会等待所有的子线程结束后才结束 首先我看下最普通情况下,主线程和子线程的情况. import threading from time import sleep, ctime def sing(): for i in range(3): print("正在唱歌...%d" % i) sleep(1) def dance(): for i in range(3): print("正在跳舞...%d" % i) sleep(1) if __name__ == '
-
Java中try-catch-finally执行顺序你知道吗
目录 引言 正文 try块中有return catch块中有return try块和finally块中有return catch块和finally块中有return try块.catch块和finally块中都有return 总结 引言 java异常处理中,try.catch.finally的执行顺序,大家都知道是按顺序执行的,这里我就不废话了.但是当try.catch.finally中加入return之后,就会有几种不同的情况出现,下面分别来说明一下.也可以跳到最后直接看总结. 正文 这里共列
-
jQuery中(function(){})()执行顺序的理解
总体来说,顺序是这样的:先计算第一个小括号,发现里面的表达式是一个函数,返会该匿名函数的引用(指针),最后一个括号则是建立匿名函数的实参和并执行. 示例: 计算两个数之和. JavaScript: 复制代码 代码如下: (function sum(a,b){ //此处也可去掉sum,以匿名函数的形式出现 alert(a+b); })(7,8); C: 复制代码 代码如下: int sum(int a,int b){return a+b;} void main(){ int (*pt)(int,i
-
Java类继承关系中的初始化顺序实例详解
本文实例讲述了Java类继承关系中的初始化顺序.分享给大家供大家参考,具体如下: Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类InitialOrderWithoutExtend中包含了静态成员变量(类变量)SampleClass 类的一个实例,普通成员变量SampleClass 类的2个实例(在程序中的顺序不一样)以及一个静态代码块,其中静态代码块
-
举例说明Java中代码块的执行顺序
前言 今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过程中,静态域.静态块.非静态域.非静态块.构造函数的执行顺序问题.其实这是一个很经典的问题,非常考察对Java基础知识的掌握程度.很多面试过程中相信也有这样的问题,趁着周末有时间复习一下. 结论 这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论.在Java类被new的过程中,执行顺序如下: 实现自身的静态属性和静态代码块.(根据代码出现的顺序决定谁先执行) 实现自
随机推荐
- 使用JS中的exec()方法构造正则表达式验证
- Shell中删除某些文件外所有文件的3个方法
- SQL查询日志 查看数据库历史查询记录的方法
- 实现React单页应用的方法详解
- 电影版本含义解析(TS,TC,CAM)
- Linux定时任务的设置及 crontab 配置指南
- java Swing实现选项卡功能(JTabbedPane)实例代码
- JS中关于正则的巧妙操作
- Python实现给qq邮箱发送邮件的方法
- Android实战打飞机游戏之子弹生成与碰撞以及爆炸效果(5)
- php封装的表单验证类完整实例
- js 文本滚动效果的实例代码
- 总结下sqlserver group by 的用法
- Core Java 简单谈谈HashSet(推荐)
- md9.exe scvhost.exe 只木马下载者查杀方法
- jQuery实现背景滑动菜单
- 通过jsonp获取json数据实现AJAX跨域请求
- Javascript 中的 call 和 apply使用介绍
- Android设计登录界面、找回密码、注册功能
- java使用swt显示图片示例分享