随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。
posts - 398,comments - 0,views - 13万
复制代码
    /**
     * 请求中带有参数,将参数赋值给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   时间完全不够用啊  阅读(248)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示