SpringMVC 回顾笔记 (七)----@ModelAttribute

本贴最后更新于 2417 天前,其中的信息可能已经时过境迁
  • 概念
    1.有 @ModelAttribute 标记的方法,会在每个目标方法执行之前被 SpringMVC 调用
    在方法定义上使用 @ModelAttribute 注解;
    Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了 @ModelAttribute 的方法。
    在方法的入参前使用 @ModelAttribute 注解:
    – 可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参
    – 将方法入参对象添加到模型中
    2.@MethodAttribute 注解也可以来修饰目标方法 POJO 类型的入参,其 Value 属性值有如下作用:
    1).SpringMVC 会使用 value 属性值在 implicitModel 中查找对应的对象,若存在则会直接传入到目标方法的入参中
    2).SpringMVC 会以 value 为 key ,POJO 类型的对象为 value, 存入到 request 中.
/* *@ModelAttribute运行流程 *1.执行@ModelAttribute 注解修饰的方法: 从数据库中取出对象 ,把对象放入到Map中,键为:user *2.SpringMVC 从Map中取出User对象,并把表单的请求参数赋予给该 User 对象的对应的属性。 *3.SpringMVC 把上述对象传入目标方法的参数 * *注意: 在 @MethodAttribute 修饰的方法中,放入到 Map 时的键需要和目标方法入参类型的第一个字母小写的字符串一致! * (这里指TestMethodAttribute方法中的User类型需要和Map提交的键对应,如果在TestMethodAttribute方法参数中使用了 * @ModelAttribute("字符串")那么Map中对应的键值就是该字符串) * */ @ModelAttribute public void getUser(@RequestParam(value="id",required=false) Integer id , Map<String, Object> maps){ if(id!=null){ User user = new User("xiaoming", "123456", 12, 1); System.out.println("从User抽取对象:"+user); maps.put("abc", user); } } @RequestMapping("/TestMethodAttribute") public String TestMethodAttribute(@ModelAttribute("abc") User user){ System.out.println("修改:"+user); return "success"; }
  • 源码分析流程
    1.调用 @ModelAttribute 注解修饰的方法。实际上把 @ModelAttribute 方法中 Map 中的数据放在了 implicitModel 中
    2.解析请求处理器的目标参数,实际上该目标参数来自于 WebDataBinder 对象的 target 属性
    1).创建 WebDataBinder 对象:
    a.确定 objectName 属性:若传入的 attrName 属性值为"",则 objectName 为类名第一个字母小写。
    注意:attrName.若目标方法的 POJO 属性使用了 @ModelAttribute 来修饰,则 attrName 值即为 @ModelAttribute 的 value 属性值
    b.确定 target 属性:
    /> 在 implicitMode1 中查找 attrName 对应的属性值。若存在,ok
    /> 若不存在:则验证当前 Handler 是否使用了 @SessionAttributes 进行修饰,若使用了,则尝试从 Session 中获取 attrName 所对应的属性值。若 session 中没有对应的属性值,则抛出了异常。
    /> 若 Handler 没有使用 @SessionAttributes 进行修饰,或 @SessionAttributes 中没有使用 value 值指定的 key 和 attrName 相匹配,则通过反射创建了 POJO 对象
    2).SpringMVC 把表单的请求参数赋给了 WebDataBinder 的 target 对应的属性。
    3).*SpringMVC 会把 WebDataBinder 的 attrName 和 target 给到 implicitModel.
    近而传到 request 域对象中。
    4).把 WebDataBinder 的 target 作为参数传递给目标方法的入参。

  • SpringMVC 确定目标方法 POJO 类型入参的过程
    1.确定一个 key:
    1).若目标方法的 POJO 类型的参数没有使用 @ModelAttribute 作为修饰,则 key 为 POJO 类名第一个字母的小写
    2).若使用了 @MethodAttribute 来修饰,则 key 为 @MethodAttribute 注解的 value 属性值
    2.在 implicitModel 中查找 key 对应的对象,若存在,则作为入参传入
    1).若在 @ModelAttribute 标记的方法中在 Map 中保存过,且 key 和 1 确定的 key 一致,则会获取到。
    3.若 implicitModel 中不存在 key 对应的对象,则检查当前的 Handler 是否使用 @SessionAttributes 注解修饰,
    若使用了该注解,且 @SessionAttributes 注解的 value 属性值中包含了 key,则会从 HttpSession 中来获取 key 所对应的 value 值,
    若存在则直接传入到目标方法的入参中。若不存在则将抛出异常。
    4.若 Handler 没有标识 @SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含 key,
    则会通过反射来创建 POJO 类型的参数,传入为目标方法的参数
    5.SpringMVC 会把 key 和 POJ0 类型的对象保存到 implicitModel 中,进而会保存到 request 中。

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    947 引用 • 1460 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • OpenCV
    15 引用 • 36 回帖 • 4 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 615 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 4 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 110 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 578 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 507 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 33 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 632 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    82 引用 • 411 回帖 • 1 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 37 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 68 关注
  • 自由行
    2 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 365 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 707 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 88 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 28 回帖 • 2 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 441 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 822 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖