zoukankan      html  css  js  c++  java
  • 【SpringMVC】SpringMVC系列9之Model数据返回到View

    9、Model数据返回到View

    9.1、概述

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

    • ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据。
    • Map及Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或java.uti.Map时,处理方法返回时,Map中的数据会自动添加到模型中。
    • @SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性。
    • @ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中。

    9.2、ModelAndView使用方法

        控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。添加模型数据:

    • MoelAndView addObject(String attributeName, Object attributeValue)
    • ModelAndView addAllObject(Map modelMap)

    视图页面:

    Controller代码:

    debug内部原理:

    9.3、Map与Model使用方法-requestScope

        SpringMVC 在内部使用了一个org.springframework.ui.Model 接口存储模型数据。步骤:

    • Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
    • 如果方法的入参为 Map 或 Model类型,Spring MVC 会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。

    视图页面:

    Controller代码:

    9.4、@SessionAttributes使用方法-sessionScope

        若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes, Spring MVC 将在模型中对应的属性暂存到 HttpSession 中。

        @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中。如下:

    • @SessionAttributes(types=User.class) 会将隐含模型中所有类型为 User.class 的属性添加到会话中。
    • @SessionAttributes(value={"user1", "user2"})
    • @SessionAttributes(types={User.class, Dept.class})
    • @SessionAttributes(value={"user1", "user2"}, types={Dept.class})

    视图页面:

    requestScope中:

    sessionScope中也可见:

    继续深入,以上是最基本用法:

    注意:

        如果在处理类定义处标注了@SessionAttributes("xxx"),则尝试从会话中获取该属性,并将其赋给该入参,然后再用请求消息填充该入参对象。如果在会话中找不到对应的属性,则抛出 HttpSessionRequiredException 异常。如何避免@SessionAttributes引发的异常:

    9.5、@ModelAttribute原理、应用

    9.5.1、背景:

        

    • 在方法定义上使用 @ModelAttribute 注解:Spring MVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
    • 在方法的入参前使用@ModelAttribute 注解。可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参,将方法入参对象添加到模型中。

    9.5.2、基本示例

        视图页面:

        

        控制器代码:

        

    调试输出:

        问题:直接存储会丢失字段(没有传过来的不允许/必要修改的字段)。增量修改实现方案:

        原理:

     

        小结:

    9.5.3、@ModelAttribute修饰POJO参数

    即便不标识,也没有问题。但是标记方法很重要-实现增量下发配置。

  • 相关阅读:
    316 Remove Duplicate Letters 去除重复字母
    315 Count of Smaller Numbers After Self 计算右侧小于当前元素的个数
    313 Super Ugly Number 超级丑数
    312 Burst Balloons 戳气球
    309 Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
    Java 类成员的初始化顺序
    JavaScript 全局
    HTML字符实体
    Java中的toString()方法
    JavaScript 弹窗
  • 原文地址:https://www.cnblogs.com/junneyang/p/5241779.html
Copyright © 2011-2022 走看看