5.处理响应数据

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

猜你喜欢

转载自www.cnblogs.com/oldby/p/12815047.html
今日推荐