目 录
1)在方法处传入Map、Model、ModelMap
这些参数中保存的数据会放在请求域中,可以在页面获取${requestScope.msg}
-
三者的关系:Map、Model、ModelMap最终都将数据给BindingAwareModelMap
相当于将BindingAwareModelMap中保存的数据放在请求域中 -
查看源码可以知道四者存在以下继承实现关系:
ModelMap extends LinkedHashMap<String, Object>
BindingAwareModelMap extends ExtendedModelMap
ExtendedModelMap extends ModelMap implements Model
@RequestMapping("/handle04")
public String handle04(Map<String,Object> map){
map.put("msg","你好");
return "dataOut";
}
@RequestMapping("/handle05")
public String handle05(Model model){
model.addAttribute("msg","你好");
return "dataOut";
}
@RequestMapping("/handle06")
public String handle06(ModelMap model){
model.addAttribute("msg","你好");
return "dataOut";
}
2) 方法返回值为 ModelAndView对象
ModelAndView即包含数据显示页面地址,又包含模型数据(要传给页面的数据)
@RequestMapping("/handle07")
public ModelAndView handle07(){
//指定跳转的页面路径
ModelAndView modelView=new ModelAndView("dataOut");
modelView.addObject("msg","你好");
return modelView;
}
3)SpringMVC 提供一个注解@SessionAttributes(只能标注在类上)可以让数据保存在session域中
@SessionAttributes的属性:value、types
- 此时保存在BindingAwareModelMap和ModelAndView中指定Key或者类型(Type)的数据同时会在session域中保存一份
- 例:
@SessionAttributes(value = "msg")
value指定Key值,于是Key值为msg的数据会在session域中也保存一份
4) Spring mvc提供注解@ModelAttribute(可用在方法和参数上)
- 参数上:会将客户端传递过来的参数按名称(value)注入到指定对象中,并且会将这个对象自动加入
BindingAwareModelMap
中 - 方法上:会在每一个
@RequestMapping
标注的方法前执行,如果有返回值,则自动将该返回值加入到BindingAwareModelMap中,Key值默认为返回类型的开头字母小写,也可以由ModelAttribute属性value设定
妙用:解决使用全字段更新sql语句时,部分字段不需要更新的情况
- 例如:修改图书信息时,book对象的id,书名等不需要进行修改,若此时从页面传入的book对象不想修改的字段值为空,
提交申请后会导致数据库中对应记录的不想修改字段的值变为null。 - 使用@ModelAttribute注解可以从数据库中调取对应对象,再对从页面获取的非空字段进行覆盖,从而封装了一个避免更新页面传入空值字段的对象。