前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快速学习-处理响应数据

快速学习-处理响应数据

作者头像
cwl_java
发布2020-02-19 15:55:05
3300
发布2020-02-19 15:55:05
举报
文章被收录于专栏:cwl_Javacwl_Java

第5章 处理响应数据

5.1 SpringMVC 输出模型数据概述

5.1.1提供了以下几种途径输出模型数据

  1. ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
  2. Map 及 Model: 入参为 org.springframework.ui.Modelorg.springframework.ui.ModelMapjava.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。

5.2 处理模型数据之 ModelAndView

5.2.1 ModelAndView介绍

  1. 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
  2. 添加模型数据:
MoelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObject(Map<String, ?> modelMap)
  1. 设置视图:
void setView(View view)
void setViewName(String viewName)

5.2.2 实验代码

  1. 增加控制器方法
    /**
     * 目标方法的返回类型可以是ModelAndView类型
     *                 其中包含视图信息和模型数据信息
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        System.out.println("testModelAndView");
        String viewName = "success";
        ModelAndView mv = new ModelAndView(viewName );
        mv.addObject("time",new Date().toString()); //实质上存放到request域中 
        return mv;
    }
  1. 增加页面链接
<!--测试 ModelAndView 作为处理返回结果 -->
<a href="springmvc/testModelAndView">testModelAndView</a>
  1. 增加成功页面,显示数据
time: ${requestScope.time }
  1. 断点调试
在这里插入图片描述
在这里插入图片描述

5.2.2 源码解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3 处理模型数据之 Map

5.3.1 Map介绍

  1. Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存储模型数据具体使用步骤
  2. Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
  3. 如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。
  4. 在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3.2 实验代码

  1. 增加控制器方法
    //目标方法的返回类型也可以是一个Map类型参数(也可以是Model,或ModelMap类型)
    @RequestMapping("/testMap")
    public String testMap(Map<String,Object> map){ //【重点】
        System.out.println(map.getClass().getName());
    	//org.springframework.validation.support.BindingAwareModelMap
        map.put("names", Arrays.asList("Tom","Jerry","Kite"));
        return "success";
    }
  1. 增加页面链接
<!-- 测试 Map 作为处理返回结果 -->
<a href="springmvc/testMap">testMap</a>
  1. 增加成功页面,显示结果
names: ${requestScope.names }
  1. 显示结果截图
在这里插入图片描述
在这里插入图片描述
  1. 注意问题:Map集合的泛型,key为String,Value为Object,而不是String
  2. 测试参数类型
    //目标方法的返回类型也可以是一个Map类型参数(也可以是Model,或ModelMap类型)
    @RequestMapping("/testMap2")
    public String testMap2(Map<String, Object> map, Model model, ModelMap modelMap) {
        System.out.println(map.getClass().getName());
        map.put("names", Arrays.asList("Tom", "Jerry", "Kite"));
        model.addAttribute("model", "org.springframework.ui.Model");
        modelMap.put("modelMap", "org.springframework.ui.ModelMap");
 
        System.out.println(map == model);
        System.out.println(map == modelMap);
        System.out.println(model == modelMap);
 
        System.out.println(map.getClass().getName());
        System.out.println(model.getClass().getName());
        System.out.println(modelMap.getClass().getName());
 
        /*
        true
        true
        true
        org.springframework.validation.support.BindingAwareModelMap
        org.springframework.validation.support.BindingAwareModelMap
        org.springframework.validation.support.BindingAwareModelMap
            */ 
        return "success";
    }
  1. 类层次结构
在这里插入图片描述
在这里插入图片描述
  1. 推荐:Map, 便于框架移植。
  2. 源码参考
public class BindingAwareModelMap extends ExtendedModelMap {
 
    @Override
    public Object put(String key, Object value) {
        removeBindingResultIfNecessary(key, value);
        return super.put(key, value);
    }
 
    @Override
    public void putAll(Map<? extends String, ?> map) {
        for (Map.Entry<? extends String, ?> entry : map.entrySet()) {
            removeBindingResultIfNecessary(entry.getKey(), entry.getValue());
        }
        super.putAll(map);
    }
 
    private void removeBindingResultIfNecessary(Object key, Object value) {
        if (key instanceof String) {
            String attributeName = (String) key;
            if (!attributeName.startsWith(BindingResult.MODEL_KEY_PREFIX)) {
                String bindingResultKey = BindingResult.MODEL_KEY_PREFIX + attributeName;
                BindingResult bindingResult = (BindingResult) get(bindingResultKey);
                if (bindingResult != null && bindingResult.getTarget() != value) {
                    remove(bindingResultKey);
                }
            }
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第5章 处理响应数据
    • 5.1 SpringMVC 输出模型数据概述
      • 5.1.1提供了以下几种途径输出模型数据
    • 5.2 处理模型数据之 ModelAndView
      • 5.2.1 ModelAndView介绍
      • 5.2.2 实验代码
      • 5.2.2 源码解析
    • 5.3 处理模型数据之 Map
      • 5.3.1 Map介绍
      • 5.3.2 实验代码
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档