Spring MVC之@ModelAttribute

  @ModelAttribute注解将请求参数绑定到Model对象,只支持一个value属性,类型是String
  该注解的方法会在所有Controller方法执行前执行,所在一个Controller映射多个URL时,谨慎使用。个人认为该注解有些鸡肋。

  @ModelAttribute 注解指定的属性名的值是该注解方法的返回值。没有指定属性名,属性名默认是方法的返回参数类型的首字母小字单词。如:如返回是 String,则属性名是 string; Integer 类型的属性名是 integer

  Controller 方法可以使用ModelMap根据 **key(@ModelAttribute指定的属性名)**从 Model 中取值。可以单作参数传递使用。

  下面示例代码Controller类映射地址:@RequestMapping("/user")

@ModelAttribute有返回值

  1. 发送请求:http://localhost/user/login?loginName=admin
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    /**
    * 没有指定属性名,属性名默认是方法的返回参数类型的首字母小字单词
    * 如返回是String,则属性名是string; Integer类型的属性名是integer
    * @param account
    * @param model
    * @return
    */
    @ModelAttribute //string = account
    public String modelAttr(@RequestParam("loginName")String account) {
    return account;
    }

    /**
    * 请求参数值绑定指定的属性名
    * @param account
    * @param model
    * @return
    */
    @ModelAttribute("name") //name = account
    public String userModel(@RequestParam("loginName") String account,Model model) {
    return account;
    }

    /**
    * modelMap根据绑定的属性名取出参数值
    * @param model
    * @return
    */
    @RequestMapping("/login")
    public String login(ModelMap modelMap) {
    String account = (String) modelMap.get("name");
    User user = new User();
    user.setAccount(account);
    modelMap.addAttribute("user", user);
    return "userList";
    }

    @ModelAttribute没有返回值

  2. 发请求:http://localhost/user/login?loginName=admin
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /**
    * 提前执行,把参数封装到Model对象中
    * Controller方法页面也能取的该Model里面的值
    * @param account
    * @param password
    * @param model
    */
    @ModelAttribute
    public void userModel1(
    @RequestParam("loginName")String account,
    @RequestParam("password")String password,
    Model model) {
    model.addAttribute("account", account);
    model.addAttribute("password", password);
    }
    //可以@ModelAttribute存到Model的值
    @RequestMapping("/login1")
    public String login1() {
    return "userList";
    }

@ModelAttribute返回对象

  1. 发请求:http://localhost/user/login2?loginName=admin&password=112233
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    /**
    * 返回对象类型,没指定属性名,隐式属性名是返回的对象名小写单词
    * @param account
    * @param password
    * @param model
    * @return
    */
    @ModelAttribute
    public User userModel2(
    @RequestParam("loginName")String account,
    @RequestParam("password")String password,
    Model model
    ) {
    User user = new User();
    user.setAccount(account);
    user.setPassword(password);

    return user;
    }

    //可以取到@ModelAttribute 封装到Model的值
    @RequestMapping("/login2")
    public String login2(Model model) {
    return "userList";
    }

    @ModelAttribute注解方法参数

    @ModelAttribute属性值与Controller方法绑定。
    Controller 方法里使用 @ModelAttribute注解形参,形参的值是 @ModelAttribute的注解方法的返回值。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    /**
    * ModelAttribute属性与Controller方法绑定
    * @param account
    * @param password
    * @return
    */
    @ModelAttribute("user")
    public User userModel4(@RequestParam("loginName")String account,String password) {
    User user = new User();
    user.setAccount(account);
    user.setPassword(password);
    return user;
    }

    /**
    * user值是@ModelAttribute("user")方法的返回值。
    * 该方法的user对象与@ModelAttribute("user")方法的返回值绑定
    * @param user
    * @param model
    * @return
    */
    @RequestMapping("/login3")
    public String login3(@ModelAttribute("user")User user, Model model) {
    user.setRealName("管理员");
    return "userList";
    }

    与@RequestMapping一起使用

      首先强调:不建议这么使用,阅读性很差,类的地址映射会成为定位jsp的目录路径

  @ModelAttribute和**@RequestMapping**一起使用,同时作用在方法上,方法返回的就不是视图名了,是 @ModelAttribute 属性名的属性值, @RequestMapping 的映射路径就变成了视图名。

  1. 发请求:http://localhost/userList
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /**
    * 不建议这么使用,阅读性很差,类的地址映射会成为定位jsp的目录路径
    * URL [/WEB-INF/jsp/user/userList.jsp],user是类映射路径
    * @param model
    * @return
    */
    @ModelAttribute("loginName") //属性名:loginName
    @RequestMapping("/userList") //视图名:userList
    public String login3(Model model) {
    return "admin"; //属性值:admin
    }
作者

光星

发布于

2018-01-12

更新于

2022-06-17

许可协议

评论