随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。
    /**
     * 请求中带有参数,将参数赋值给UserInfo
     * @param userInfo
     * @return
     */
    @RequestMapping("/update")
    public String update(UserInfo userInfo){
        System.out.println(userInfo);
        return "ok";
    }

上面的方法用来接收关于UserInfo类的对应参数,

UserInfo类:

package cn.cdulm.entity;

import java.util.Objects;

public class UserInfo {
    private Integer id;
    private String username;
    private String password;

    @Override
    public String toString() {
        return "UserInfo{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        UserInfo userInfo = (UserInfo) o;
        return Objects.equals(id, userInfo.id) && Objects.equals(username, userInfo.username) && Objects.equals(password, userInfo.password);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, username, 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 String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

除了下面的方式,可以从 SQL 语句上只修改指定的字段。

请求时输入参数就会将参数注入到UserInfo中对应的属性中,但是需要注意的是,如果提交的参数只有一个 username,那么 id 和 password 将会是 null 这在修改数据库中的数据时显然是不行的,所以就需要解决这个问题,这里就需要使用@ModelAttribute 注解在所有请求方法之前对UserInfo 类进行保留:

  @ModelAttribute
    public void initUserInfo(Model model){
        // springmvc会从model中寻找是否存在方法中的参数,存在则进行匹配,
        // 将提交的数据与原数据对比,提交的数据中会覆盖原数据的对应属性值,提交的数据中没有涉及到原数据的属性时就保留原数据的属性值
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setUsername("张三");
        userInfo.setPassword("12345");
        model.addAttribute("userInfo",userInfo); // 将userInfo放进Model中
    }

这里实现的原理就是 springmvc 在进行参数注入的时候会去 Model 中寻找是否存在对应的参数,如果存在则使用找到的那个参数,比如上面这个方法,模拟了从数据库中读取 id=1,、username=张三、password=12345 的用户信息,将其加入到 Model 中,那么在请求方法update(UserInfo userInfo) 中的 userInfo 就会使用Model中的 userInfo ,注意 Model 中的参数名要和方法中的参数名对应。

访问/update路径:

输出结果:

可以发现,url 参数中并没有输入 id,但是输出内容是有 id=1 与保留的 userInfo 中的 id 一样;

由此可知,springmvc使用了 Model 中对应的 userInfo 对象,并将相同属性值覆盖,没有的属性值则保留,这样在修改数据库中信息的时候就不会出现,没有提交的数据对应的属性值为 null 的情况了。

 

注意事项:

有一个需要注意的细节,就是 springmvc 会将请求处理方法的参数 隐式地 放入 request 域中,比如将@ModelAttribute 方法注释掉表示没有手动将参数放入 Model 中,然后在request 域中获取 userInfo 对象:

可以发现能够成功获取 userInfo 对象的信息。

 

posted on 2022-06-24 13:02  时间完全不够用啊  阅读(226)  评论(0编辑  收藏  举报