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把上述对象传入目标方法的参数;