SpringMVC 之 处理数据模型

本文介绍了SpringMVC中处理数据模型的多种方法,包括使用ModelAndView、Map、Model及ModelMap等对象添加数据到视图层,并展示了如何利用@SessionAttributes在多个请求间共享数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringMVC 之 处理数据模型

本节我们将学习并归纳一下SpringMVC中处理数据模型的方法有哪些,各自怎么实现的。


实例&归纳

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

  • ModelAndView

    • 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据。将直接为视图层提供数据服务

    • 实例

      • Controller

        /**
             * SpringMVC 处理数据模型 使用 ModelAndView 处理数据
             * ModelAndView 代表了MVC Web程序中Model与View的对象,
             * 不过它只是方便您一次返回这两个对象的holder,Model与View两者仍是分离的概念。 
             */
            @RequestMapping("/modelAndViewEx")
            public ModelAndView modelAndViewEx(Contract contract) throws Exception{
                ModelAndView modelAndView = new ModelAndView();
                //将一个对象传到视图层,同视图层调用
                modelAndView.addObject("modelAndViewContract", contract);
                //指定需要渲染的试图名称
                modelAndView.setViewName("modelAndViewEx/modelAndViewEx");
                return modelAndView;
            }
      • JSP
        modelAndView-Contract: ${requestScope.modelAndViewContract}
        <br><br>

  • Map 、Model、ModelMap

    • org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。

    • 实例

      • Controller

        /**
             * SpringMVC 处理数据模型 使用 Map 处理数据
             * 在SpringMVC 内部使用了一个 org.springFramework.ui.Model 接口存储模型数据
             * 1.SpringMVC 在调用摸一个方法之前都会创建一个隐含的模型对象作为模型数据的存储容器
             * 
             * 2.如果被调用的方法的入参为Map或者Model 类型时 SpringMVC 会将隐含的模型的引用传递给这些入参。
             * 
             * 3.在方法体内, 我们可以入参对象访问到隐含模型中的数据,同时也可向模型数据模型中添加新的属性数据比如 String、Conllection<T>...
             * 4.不论入参的时Model还是Map,在方法返回之后隐含的数据模型将会被SpringMVC 转换为一个标准的 ModelAndView对象。
             *  map中的数据将会被处理为Model数据,返回的字符串类型将默认为 视图名称 
             *
             */
            @RequestMapping("/mapEx")
            public String mapEx(Map<String, Object> map, Contract contract) throws Exception {
                map.put("mapExcontract", contract);
                map.put("mapExdataKey", "dataValue");
                return "modelAndViewEx/modelAndViewEx";
            }
        
            @RequestMapping("/modelEx")
            public String modelEx(Model model, Contract contract) throws Exception {
                //将一个对象放入数据模型中
                model.addAttribute("modelExContract", contract);
                //讲一个字符串放入数据模型中
                model.addAttribute("modelExdataKey", "modelEx-dataValue");
                return "modelAndViewEx/modelAndViewEx";
            }
        
            @RequestMapping("/modelMapEx")
            public String ModelMapEx(ModelMap model, Contract contract) throws Exception {
                //将一个对象放入数据模型中
                model.addAttribute("ModelMapExContract", contract);
                //讲一个字符串放入数据模型中
                model.addAttribute("ModelMapExdataKey", "ModelMapEx-dataValue");
                return "modelAndViewEx/modelAndViewEx";
            }
      • JSP
        mapEx-contract:
        <br><br>
        mapEx-contract:${requestScope.mapExcontract}
        <br>
        mapEx-dataKey:${requestScope.mapExdataKey}
        <br><br> 
        
        modelEx-Contract:
        <br><br>
        modelEx-Contract:${requestScope.modelExContract}
        <br>
        modelEx-dataKey:${requestScope.modelExdataKey}
        <br><br> 
        
        
        ModelMapEx-Contract:
        <br><br>
        ModelMapEx-Contract:${requestScope.ModelMapExContract}
        <br>
        ModelMapEx-dataKey:${requestScope.ModelMapExdataKey}
        <br><br> 

  • @SessionAttributes

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

    • 实例

      • Controller
      @SessionAttributes(value={"tradePolicy"},types=String.class)

      以上代码需要加在类上。

      /**
       * @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是 value 属性值),
       * 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上使用的是 types 属性值)
       * 注意: 该注解只能放在类的上面. 而不能修饰放方法. 
       */
      @RequestMapping("/sessionEx")
      public String sessionEx(Map<String,Object> map)throws Exception{
          TradePolicy tradePolicy = new TradePolicy("ERUP", "ADDRT");
          map.put("sessionExtradePolicy",tradePolicy);
          map.put("tradePolicy", tradePolicy);
      
          map.put("sessionExdataKey", "sessionEx-dataValue");
          return "modelAndViewEx/modelAndViewEx";
      }
      • JSP
      sessionEx-tradePolicy
      <br>
      requestScope-tradePolicy:${requestScope.sessionExtradePolicy}
      <br>
      requestScope-dataKey:${requestScope.sessionExdataKey}
      <br><br>
      sessionEx-tradePolicy:${sessionScope.tradePolicy}
      <br>
      sessionEx-dataKey:${sessionScope.sessionExdataKey}
      <br><br>

  • @ModelAttribute
    • 方法入参标注该注解后, 入参的对象就会放到数据模型中。由于该方法内容较多因而单独开了一章来学习@ModelAttribute,请参考 SpringMVC 之 @ModelAttribute&OOP处理

小结

  • SpringMVC 在做处理数据模型时提供了很多方法供我们使用,因而我们需要熟悉各个方法的实现原理是什么,以更能结合业务逻辑实现我们的需求。

  • 在使用 Map 、Model、ModelMap 作为某个方法的入参时,在该方法返回后SpringMVC 会将 Map 、Model、ModelMap 转化成一个标准的 ModelAndView。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值