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

效果也是一样的

相关推荐
Scott9999HH6 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔6 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海7 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区11 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大11 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai11 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说12 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json