码迷,mamicode.com
首页 > 其他好文 > 详细

5.处理响应数据

时间:2020-05-01 22:14:54      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:概述   success   介绍   private   request   容器   scope   public   bin   

5.1 SpringMVC 输出模型数据概述

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

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

2) Map 及 Model: 入参为 org.springframework.ui.Model、

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

5.2处理模型数据之 ModelAndView

5.2.1 ModelAndView介绍

1) 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型

数据信息。

2)添加模型数据:

MoelAndView addObject(String attributeName, Object attributeValue)

ModelAndView addAllObject(Map<String, ?> modelMap)

3)设置视图:

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;
}

2) 增加页面链接

 

<!--测试 ModelAndView 作为处理返回结果 -->
<a href="springmvc/testModelAndView">testModelAndView</a>

 

3) 增加成功页面,显示数据

 

time: ${requestScope.time }

 

4) 断点调试

技术图片

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";
}

 

2) 增加页面链接

<!-- 测试 Map 作为处理返回结果 -->
<a href="springmvc/testMap">testMap</a>

 

3) 增加成功页面,显示结果

names: ${requestScope.names }

 

4) 显示结果截图

技术图片

 

 

 5) 注意问题:Map集合的泛型,key为String,Value为Object,而不是String  

6) 测试参数类型

 

//目标方法的返回类型也可以是一个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";
}

7) 类层次结构

技术图片

 

8) 推荐:Map,  便于框架移植。

9) 源码参考

 

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);         }       }     } } }

 

5.处理响应数据

标签:概述   success   介绍   private   request   容器   scope   public   bin   

原文地址:https://www.cnblogs.com/oldby/p/12815047.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!