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

效果也是一样的

相关推荐
geovindu5 分钟前
rust: Template Method Pattern
开发语言·后端·设计模式·rust·行为模式·模板方法模
high一马平川10 分钟前
# SystemUI Dagger2 精读 · 第 2 章 @Inject:1200 处构造注入,和 1 处例外
android·java·kotlin
小陈从不会敲代码11 分钟前
JavaEE面试复习(多线程-初阶)
java·面试·java-ee
周厉12 分钟前
酒店PMS系统设计:房型房价管理与动态价格优先级实现(Java/MySQL)
java·数据库·pms酒店系统
一碗白开水一18 分钟前
Day 5 · 弹性 | 微观
java·前端·数据库
迪飞特科技19 分钟前
大模型接入业务系统:API、本地部署、RAG、智能体四种路线怎么选
java·数据库·人工智能·知识图谱·deepseek·本地化大模型
vipxieliang38 分钟前
ValidX 验证器缓存机制:如何提升验证性能
java·spring boot
未秃头的程序猿1 小时前
Spring Cloud Gateway 做统一加解密,我在请求体上栽了三天
java·后端·架构
Rain的Java大神之路1 小时前
别再上来就堆 Redis!点赞系统从打挂数据库到 18w 写峰值,我把这套方案讲透了
java·后端·面试