Fork me on GitHub

springmvc之使用ModelAttribute避免不允许被修改的值更新时为空

我们在更新数据时,有的数据是不能够被修改的。假设User有三个字段,username,age,password。我们在前端传过来的数据为username和age,不能修改password,一般情况下,在后端都会新建一个user对象,使用该user对象对数据库进行更新操作。r那么我们直接进行更新操作,会导致密码变为空。

解决方案有以下两种:

(1)将所需的password用隐藏域传过来。但是这种做法当有很多不必修改的字段时很麻烦。

(2)取出数据库中的password字段,重新为新建的user对象的password赋上值,这种操作也很麻烦。

(3)使用ModelAttribute注解,不新建一个user对象,而是在原有的基础上进行更新,就可以既更新字段,又可以保留不必更新的字段。

Person.java

package com.gong.springmvc.entities;

public class Person {
    private Integer id;
    private String username;
    private Integer age;
    private String password;
    
    public Person(Integer id, String username, Integer age, String password) {
        super();
        this.id = id;
        this.username = username;
        this.age = age;
        this.password = password;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", username=" + username + ", age=" + age + ", password=" + password + "]";
    }
    
    
}

SpringmvcTest.java

@RequestMapping("/springmvc")
@Controller
public class SpringmvcTest {
    private static final String SUCCESS = "success";
    
    @ModelAttribute
    public void getPerson(@RequestParam(value="id",required=false) Integer id,
            Map<String,Object> map) {
        if(id != null) {
            Person person = new Person(1,"jack",18,"123456");
            System.out.println("模拟的数据库中的数据"+person);
            map.put("person", person);
        }
    }
    
    @RequestMapping(value="/testModelAttribute")
    public String testModelAttribute(Person person) {
        System.out.println(person);
        return SUCCESS;
    }
}

index.jsp

    <form action="springmvc/testModelAttribute" method="POST"><br>
        <input type="hidden" name="id" value="1"><br>
        <span>username:</span><input type="text" name="username" value="tom"><br>
        <span>age:</span><input type="text" name="age" value="20"><br>
        <input type="submit" value="submit"><br>
    </form>

success.jsp

  <p>Success</p>

启动服务器之后:

点击提交,在控制台可以看到:

 我们可以直接将不必修改的数据进行赋值。

需要注意的是:被@ModelAttribute标注的方法会在每个目标方法执行之前被springmvc所调用。

运行流程:

(1)执行@ModelAttribute注解修饰的方法:从数据库中取出对象,把对象放到Map中;

(2)springmvc从Map中取出Person对象,并把表单的请求参数赋给该Person对象的对应属性;

(3)springmvc把上述对象传入目标方法的参数;

posted @ 2020-01-11 11:35  西西嘛呦  阅读(799)  评论(0编辑  收藏  举报