Spring MVC:将复杂对象绑定到UI
问题内容:
我有我的用户对象,我想用Spring MVC绑定到UI。用户对象中包含另一个对象地址。
public class User {
String firstName;
String lastName;
String userName;
Address address;
}
地址对象。
public class Address {
String street;
String House;
String country;
}
当我将用户对象绑定到UI时,要说说编辑用户功能,我只想保留firstName和lastName。
现在,我的第一个问题是,如果我不保留User的其余属性作为隐藏字段,则这些值将为null。这意味着UI上的绑定对象是User对象的新实例。我不能在同一个用户对象上工作并在UI上绑定它,而只获得具有旧值的更新值吗?
其次:通过隐藏字段方法,我没有得到Address对象,为此我得到了null
<form:hidden path="user.address" />
用户是我的模态属性。
我不知道,我对Spring
MVC的理解可能会有差距。对于在UI上绑定对象,我们是否总是必须创建新实例?如果是嵌套的,我们如何将嵌套的对象(地址)恢复为绑定的模态属性?
一旦选择,我想正在使用活页夹。但据我了解,活页夹也将使用id获取对象?请提供一种解决方法,我可以保存查询以取回该对象
问题答案:
为了找回Address
对象,您需要列出每个单独的属性:例如:
<form:hidden path="user.address.street" />
<form:hidden path="user.address.country" />
等等。
现在,您绑定到UI的对象就是您从控制器传递的对象。我假设表单提交后,您想以的形式User
返回对象@ModelAttribute
。在这种情况下,您有两个选择:第一个是您将需要列出User
客户端上对象的所有属性(作为隐藏对象或作为可见表单元素)。
第二个选项是:你只显示在客户端所需要的属性,而不是列出所有其他化子性质的隐藏字段,只保留id
你的User
实例作为隐藏字段。现在,当您@ModelAttribute
在提交表单时收到此消息时,可以使用来从数据库中加载整个对象,id
并在调用之前对其设置更新后的属性update
。
例如:
@RequestMapping("updateUser.do")
public String updateUser(@ModelAttribute User user, ... /* rest of the args */) {
// ... some other code
User existingUser = userService.findById(user.getId());
existingUser.setFirstName(user.getFirstName());
existingUser.setLasstName(user.getLastName());
userService.update(existingUser);
// ... rest of the code
}
您不可能只在客户端的required-properties上工作,并将其与相同的现有对象合并。