码迷,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介绍

1Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存储模型数据

具体使用步骤

2Spring 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集合的泛型,keyString,ValueObject,而不是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
迷上了代码!