1. Spring MVC 提供了以下几种途径输出数据模型

    -- ModelAndView: 处理方法返回值类型为ModelAndView 时,方法体即可通过该对象添加模型数据

    -- Map及Model: 入参为:   org.springframework.ui.Model、org.springframework.ui.ModelMap或者 java.util.Map时,处理方法返回时,Map中的数据会自动添加到模型中

    -- @SessionAttributes: 将模型中的某个属性暂存到HttpSession,以便多个请求之间可以共享这个属性

    -- @ModelAttribute: 方法入参标注该属性后,入参的对象就会放到数据模型中

2.ModelAndView

  -- 处理器处理方法的返回值如果为ModelAndView,则既包含视图信息,又包含模型数据信息

  -- 添加模型数据

    -- ModelAndView addObject(String attributeName, Object attributeValue)

    -- ModelAndView addAllObject(Map<String, ?> modelMap)

  -- 设置视图

    -- void setView(View view)

    -- void setViewName(String viewName)

3. Map及 Model

  -- Spring MVC 在内部使用了一个 org.springframework.ui.Model接口存储模型数据

  -- 具体步骤

    1)Spring MVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器

    2)如果方法的入参为Map或者Model类型,SpringMVC会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到的模型中的所有数据,也可以向模型中添加属性数据

    

4. @SessionAttributes 将数据放到了session域中,可以让多个请求公用某个属性公用。

  --位置:控制类上标注 @SessionAttributes, SpringMVC将在模型中对应的属性暂存到HttpSession中

  --@SessionAttributes 可以通过属性名指定需要放到会话中的属性,也可以通过模型属性的对象类型指定

    

  例子:

    -- 通过属性名

    

    -- 通过类别

    

5. @ModelAttribute(pojo类型)

  -- 使用情景:更新某个数据对象时,只更新一部分,前端也只传过来一部分。

        如果不加ModelAttribute,那么会new 一个新的对象,更新后存到数据库,会使得部分数据为空。

        如果使用了ModelAttribute,那么就会从数据库中取出这个对象,再做更新,然后存到数据库,这样使得对象的某些属性为空

  -- 注意, SpringMVC在调用每个请求之前都会调用 被@ModelAttribute 注解的方法

  1)未使用

  

  2)使用后

  

  -- 运行原理

    1)执行@ModelAttribute注解修饰的方法 :从数据库中取出对象,把对象放入到Map中。  注意,键值的名字要与目标方法入参类型,第一个字母小写后的字符串一致

    2)Spring MVC 从Map中取出这个对象,并把表单中的对应属性赋值

    3)Spring MVC 把上述对象传入到目标方法的对象中

  -- 源码分析流程(没看懂)

   

  --Spring MVC确定 目标方法 和POJO 类型入参的过程

    A)确定一个key:

      1).若目标方法的pojo 类型的参数没有使用@ModelAttribute 作为修饰, 则key 为 pojo类型的第一个字母的小写后的类名字符串

      2)若使用了@ModelAttribute来修饰,则key为@ModelAttribute注解的value属性值

    B)在implicitModel中(被@ModelAttribute标注的方法中的map)查找key对应的对象,若存在,则作为入参传入

      1)若在@ModelAttribute标记的方法中保存过,且Key与A中的key一致,则会获取到

    C) 若implicitModel中不存在key对应的对象,则检查当前handler是否使用@SessionAttributes 注解修饰,若使用了该注解,且@SessionAttributes 注解的value属性值中包含了key,则会从HttpSession中来获取key 锁对应的value值,若不存在则抛出异常

    D)若handler没有标识@SessionAttributes,或者 @SessionAttributes中不包含key,则会通过反射来new 一个新的pojo类型的参数,传入为目标方法的参数

    E)SpringMVC 会把pojo类型的对象保存到implicitModel中,进而保存到request中

  -- 流程图

    

SpringMVC听课笔记(五:处理模型数据)的更多相关文章

  1. SpringMVC:学习笔记(4)——处理模型数据

    SpringMVC—处理模型数据 说明 SpringMVC 提供了以下几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添 ...

  2. SpringMVC 学习笔记(四) 处理模型数据

    Spring MVC 提供了下面几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体就可以通过该对象加入模型数据 – Map及Model: ...

  3. SpringMVC听课笔记(一:SpringMVC概述)

    地址 :https://www.bilibili.com/video/av14907450 版本:4.x 概述: 概要: 一:SpringMVC概述 二:SpringMVC的 HelloWorld 三 ...

  4. SpringMVC听课笔记(九:数据转换 & 数据格式化 & 数据校验)

    1.数据绑定流程 --1). Spring MVC主框架将ServletRequest对象及目标方法入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象. - ...

  5. SpringMVC听课笔记(十五:SpringMVC 运行流程)

    1. 图 一般的会按照红线标注的方向去行进,但是请求静态资源,或者出现异常等,会出现其他路径 2.

  6. SpringMVC学习笔记五:使用converter进行参数数据转换

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6832898.html  一:SpringMVC数据绑定机制 1:request到达SpringMVC框架时,框 ...

  7. SpringMVC 学习笔记(五) 基于RESTful的CRUD

    1.1. 概述 当提交的表单带有_method字段时,通过HiddenHttpMethodFilter 将 POST 请求转换成 DELETE.PUT请求,加上@PathVariable注解从而实现  ...

  8. springMVC学习笔记(五)

    一.使用Ajax调用 1.1 Controller返回的类型为text类型的方式. @RequestMapping("/getPerson") public void getPer ...

  9. SpringMVC 学习笔记(五)

    47. 尚硅谷_佟刚_SpringMVC_文件上传.avi 参看博客https://www.cnblogs.com/hanfeihanfei/p/7931758.html相当的经典 我是陌生人关于Sp ...

随机推荐

  1. 【陪你系列】5 千字长文+ 30 张图解 | 陪你手撕 STL 空间配置器源码

    大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub https://github.com/rongweihe/MoreT ...

  2. springboot 不同环境读取不同配置

    1. 3个配置文件(更多环境可以建多个): application.properties  (公共配置文件) application-dev.properties  (开发环境) applicatio ...

  3. 循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

    在系统处理中,有时候需要发送邮件通知用户,如新增用户的邮件确认,密码找回,以及常规订阅消息.通知等内容处理,都可以通过邮件的方式进行处理.本篇随笔介绍结合VUE+Element 前端,实现系统的邮件参 ...

  4. mysql源码分析-启动过程

    mysql源码分析-启动过程 概要 # sql/mysqld.cc, 不包含psi的初始化过程 mysqld_main: // 加载my.cnf和my.cnf.d,还有命令行参数 if (load_d ...

  5. 记一次Hadoop安装部署过程

    实验名称:Hadoop安装部署 一.实验环境: 虚拟机数量:3个 (1个master,2个slave:slave01,slave02) 主节点master信息: 操作系统:CentOS7.5 软件包位 ...

  6. Spring Boot 2.x基础教程:多个文件的上传

    昨天,我们介绍了如何在Spring Boot中实现文件的上传.有读者问:那么如果有多个文件要同时上传呢?这就马上奉上,当碰到多个文件要同时上传的处理方法. 动手试试 本文的动手环节将基于Spring ...

  7. LeetCode 124 二叉树中最大路径和

    题目: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 思路:递归 分为三部分,根节点,左子树,右 ...

  8. redis 6.0新特性

    防止忘记,记录一下 1.多线程IO Redis 6引入多线程IO,但多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程.之所以这么设计是不想因为多线程而变得复杂,需要去控制 key. ...

  9. Oracle 锁表以及解锁

    -- kill_exec 列为解锁的语句,copy出来执行即可.select 'alter system kill session ''' || s.sid || ',' || s.serial# | ...

  10. 数组的方法some和includes

    some() 方法用于检测数组中的元素是否满足指定条件(函数提供). some() 方法会依次执行数组的每个元素: 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测. 如果没 ...