【SpringMVC 笔记】5、将数据传给页面的方法

目 录

    • 1)在方法处传入Map、Model、ModelMap
    • 2) 方法返回值为 ModelAndView对象
    • 3)SpringMVC 提供一个注解@SessionAttributes(只能标注在类上)可以让数据保存在session域中
    • 4) Spring mvc提供注解@ModelAttribute(可用在方法和参数上)

1)在方法处传入Map、Model、ModelMap

这些参数中保存的数据会放在请求域中,可以在页面获取${requestScope.msg}

  • 三者的关系:Map、Model、ModelMap最终都将数据给BindingAwareModelMap
    相当于将BindingAwareModelMap中保存的数据放在请求域中

  • 查看源码可以知道四者存在以下继承实现关系:
    ModelMap extends LinkedHashMap
    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注解可以从数据库中调取对应对象,再对从页面获取的非空字段进行覆盖,从而封装了一个避免更新页面传入空值字段的对象。

你可能感兴趣的:(框架)