/**
* 请求中带有参数,将参数赋值给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 对象的信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)