zoukankan      html  css  js  c++  java
  • 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把上述对象传入目标方法的参数;

  • 相关阅读:
    jvm垃圾回收机制
    java中transient关键字的含义
    com.alipay.sofa.rpc.core.exception.SofaRouteException: RPC-02306: 没有获得服务[io.sofastack.balance.manage.facade.BalanceMngFacade:1.0:user77]的调用地址,请检查服务是否已经推送
    IDEA失效的解决办法
    多线程
    Java对象的创建过程
    注解(Annotation)
    面向对象思想
    IDEA--java版本修改(jdk1.8改成jdk1.7)
    HttpClient
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12179451.html
Copyright © 2011-2022 走看看