天天看点

SpringMVC框架----ModelAttribute注解

作用:

该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。

出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。

出现在参数上,获取指定的数据给参数赋值。

属性: value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。

应用场景: 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。

(比如user类中有三个属性,而我们表单只提交了两个属性,另外一个属性没有提交值,默认为空,但是我们想用原来数据库的值,现在我们就可以选择modelattribute这个注解)

例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数 据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。

index.jsp

<br/>
<form action="anno/testModelAttribute" method="post">
    用户姓名:<input type="text" name="username"/><br/>
    用户年龄:<input type="text" name="age"/><br/>
    <input type="submit" value="提交"/>
</form>
           

controller类

/*ModelAttribute注解*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
    System.out.println("testModelAttribute执行了...");
    System.out.println(user);
    return "success";
}
@ModelAttribute
public void showUser(){
    System.out.println("showUser执行了");
}
           
SpringMVC框架----ModelAttribute注解

即提交表单信息不完整。那我们想用数据库(模拟)中原来的数据。

<br/>
<form action="anno/testModelAttribute" method="post">
    用户姓名:<input type="text" name="uname"/><br/>
    用户年龄:<input type="text" name="age"/><br/>
    <input type="submit" value="提交"/>
</form>
           

我们事先建立了一个javabean的User类,

public class User implements Serializable {
    private String uname;
    private Integer age;
    private Date date;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                ", date=" + date +
                '}';
    }
}
           
/*ModelAttribute注解*/
@RequestMapping("/testModelAttribute")
//注意,这里面的参数会拿到showUser方法中的user对象里面的未被赋值的date
public String testModelAttribute(User user){
    System.out.println("testModelAttribute执行了...");
    System.out.println(user);
    return "success";
}
/*
* 该方法会先执行
*
* */
@ModelAttribute
public User showUser(String uname){
    System.out.println("showUser执行了");
    //通过用户查询数据库(模拟)
    User user =new User();
    user.setUname(uname);
    user.setAge(20);
    user.setDate(new Date());
    return user;
}
           
SpringMVC框架----ModelAttribute注解

如果没有返回值呢,我们需要使用map集合,把user对象存入到map集合中,然后用modelattribute修饰这个参数,从集合中取出这个user对象。

*ModelAttribute注解*/
@RequestMapping("/testModelAttribute")
//注意,这里面的参数会拿到showUser方法中的user对象里面的未被赋值的date
public String testModelAttribute(@ModelAttribute("abc") User user){
    System.out.println("testModelAttribute执行了...");
    System.out.println(user);
    return "success";
}

@ModelAttribute
public void showUser(String uname, Map<String,User> map){
    System.out.println("showUser执行了");
    //通过用户查询数据库(模拟)
    User user =new User();
    user.setUname(uname);
    user.setAge(20);
    user.setDate(new Date());
    map.put("abc",user);
}
           
SpringMVC框架----ModelAttribute注解