【SpringMVC】常用注解:@ModelAttribute

发布于:2025-03-16 ⋅ 阅读:(13) ⋅ 点赞:(0)

1.作用

该注解是在SpringMVC4.3版本后新加入的。它可以修饰方法和参数。出现在方法上,表示当前方法会在控制器的方法之前执行。它可以修饰 没有返回值的方法,也可以修饰没有返回值的方法。它修饰参数,获取指定 的数据给参数赋值。

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

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

2.属性

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

3.示例

定义POJO

 public class Student {
    private String username;
    private String password;
    private Integer age;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

定义表单

<form action="demo1/showUser" method="post">
姓名: <input type="text" name="username"><br>
年龄: <input type="text" name="age"><br>
 <input type="submit" value="保存">
 </form>

这个表单中只提交了两个字段,还有password字段没有提交

定义控制器方法(ModelAttribute注解修饰的方法带返回值)

 @ModelAttribute
 public Student showModel(String username,Integer age){
 System.out.println("用户名:" + username + "年龄" + age);
 Student student = new Student();
 student.setUsername(username);
 student.setAge(18);
 //模拟根据用户名查询从数据表查询到了一个用户信息
student.setPassword("admin");
 System.out.println("showModel方法执行了.....");
 return student;
 }
 @RequestMapping("showUser")
 public String showUser(Student student){
 System.out.println("showUser方法执行了.....");
 System.out.println(student);
 return "success";
 }

最终输出的User有password的值

定义控制器方法(ModelAttribute注解修饰的方法也可以不带返回值)

@ModelAttribute
    public void showModel(String username, Integer age, Map<String, Object> map) {
        System.out.println("用户名:" + username + "年龄" + age);
        Student student = new Student();
        student.setUsername(username);
        student.setAge(18);
        student.setPassword("admin"); // 模拟根据用户名查询从数据表查询到用户信息
        System.out.println("showModel方法执行了.....");
        map.put("student", student);
    }

    @RequestMapping("showUser")
    public String showUser(@ModelAttribute("student") Student student) {
        System.out.println("showUser方法执行了.....");
        System.out.println(student);
        return "success";
    }

效果也是一样的