SpringMVC输出模型数据
- ModelAndView:处理方法返回值类型为ModelAndView时,方法体既可通过该对象添加模型数据
- Map与Model:入参为 org.springframework.ui.Model、
org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中
ModelAndView
介绍
1)控制器处理方法的返回值如果为ModelAndView,则其既包含视图信息,也包含模型数据信息
2)添加模型数据:
- MoelAndView addObject(String attributeName, Object attributeValue)
- ModelAndView addAllObject(Map<String, ?> modelMap)
3)设置视图:
- void setView(View view)
- void setViewName(String viewName)
代码验证
- 控制器方法
- 页面链接
- success.jsp中显示数据
time:${requestScope.time}
- 断点调试
源码解析
Map
介绍
1)SpringMVC在内部使用了一个org.springframework.ui.Model接口存储模型数据
2)具体使用步骤
- SpringMBVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器
- 如果方法的入参为Map或者Model类型,SpringMVC会将隐含模型的引用传递给这些入参
- 在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据
代码验证
- 控制器
- 页面链接
- success.jsp
- 结果
- 测试参数类型
- 类层次结构
- 推荐Map,便于框架移植
- 源码
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);
}
}
}
}
}