zoukankan      html  css  js  c++  java
  • SpringMVC听课笔记(五:处理模型数据)

    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中

      -- 流程图

        

  • 相关阅读:
    springboot 项目部署到服务器
    Thymeleaf的注意项
    springboot定时器
    springboot
    随笔
    mysql数据库连接超过8小时失效的解决方案(springboot)
    Druid连接池与spring配置
    IDEA快捷键
    jsonp解决跨域,用div,css,js,jq实现textarea自适应高度
    mysql的查询、子查询及连接查询(商城查询常用)
  • 原文地址:https://www.cnblogs.com/heyboom/p/11315689.html
Copyright © 2011-2022 走看看