【SpringMVC】常用注解:@ModelAttribute

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";
    }

效果也是一样的

相关推荐
全栈凯哥34 分钟前
备忘录模式(Memento Pattern)详解
java·设计模式·备忘录模式
纪元A梦3 小时前
华为OD机试真题——荒岛求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
java·c语言·javascript·c++·python·华为od·go
苹果酱05673 小时前
iview 表单验证问题 Select 已经选择 还是弹验证提示
java·vue.js·spring boot·mysql·课程设计
夏子曦4 小时前
C#——NET Core 中实现汉字转拼音
开发语言·c#
꧁坚持很酷꧂5 小时前
Qt天气预报系统绘制温度曲线
开发语言·qt
电商数据girl5 小时前
【Python爬虫电商数据采集+数据分析】采集电商平台数据信息,并做可视化演示
java·开发语言·数据库·爬虫·python·数据分析
海尔辛5 小时前
学习黑客Bash 脚本
开发语言·学习·bash
夏季疯5 小时前
学习笔记:黑马程序员JavaWeb开发教程(2025.3.30)
java·笔记·学习
LUCIAZZZ5 小时前
简单介绍分布式定时任务XXL-JOB
java·spring boot·分布式·spring·操作系统·定时任务