如何绑定 Spring form:checkbox 而不是 form:checkboxes?
How to bind Spring form:checkbox instead of form:checkboxes?
我在使用 form:checkbox 时遇到问题。我无法让它显示选定的值。当我选择值并提交时,正确的值显示在数据库中。当我加载页面时,所有值(复选框)都未被选中。
以下元素位于其中:
<form:form role="form" commandName="user" class="form-horizontal" action="${form_url}">
</form:form>
这很好用:
<form:checkboxes items="${availableRoles}" path="roles" itemLabel="role" itemValue="id" element="div class='checkbox'"/>
这行不通:
<c:forEach items="${availableRoles}" var="r" varStatus="status">
<div class="checkbox">
<form:checkbox path="roles" label="${r.description}" value="${r.id}"/>
</div>
</c:forEach>
这是我的域名class:
public class User {
private List<Role> roles;
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
这是我的习惯 属性 编辑:
public class RolePropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) {
Role role = new Role();
role.setId(Integer.valueOf(text));
setValue(role);
}
}
控制器有这个方法:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Role.class, new RolePropertyEditor());
}
控制器方法:
@RequestMapping(value = "/update/{userId}", method = RequestMethod.GET)
public String updateUser(@PathVariable Integer userId, Model model) {
User user = userService.getByUserId(userId);
List<Role> availableRoles = roleService.getAllRoles();
model.addAttribute("availableRoles", availableRoles);
model.addAttribute("user", user);
return "user/update";
}
调试会话后我找到了解决方案。
因为 Spring 内部 JSP 应该是这样的:
<c:forEach items="${availableRoles}" var="r">
<div class="checkbox">
<form:checkbox path="roles" label="${r.description}" value="${r}" />
</div>
</c:forEach>
注意值是项目 (r),而不是项目的成员,如 r.id。
您还需要在自定义 PropertyEditor 中实现 getAsText。
@Override
public String getAsText() {
Role role = (Role) this.getValue();
return role.getId().toString();
}
我在使用 form:checkbox 时遇到问题。我无法让它显示选定的值。当我选择值并提交时,正确的值显示在数据库中。当我加载页面时,所有值(复选框)都未被选中。
以下元素位于其中:
<form:form role="form" commandName="user" class="form-horizontal" action="${form_url}">
</form:form>
这很好用:
<form:checkboxes items="${availableRoles}" path="roles" itemLabel="role" itemValue="id" element="div class='checkbox'"/>
这行不通:
<c:forEach items="${availableRoles}" var="r" varStatus="status">
<div class="checkbox">
<form:checkbox path="roles" label="${r.description}" value="${r.id}"/>
</div>
</c:forEach>
这是我的域名class:
public class User {
private List<Role> roles;
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
这是我的习惯 属性 编辑:
public class RolePropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) {
Role role = new Role();
role.setId(Integer.valueOf(text));
setValue(role);
}
}
控制器有这个方法:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Role.class, new RolePropertyEditor());
}
控制器方法:
@RequestMapping(value = "/update/{userId}", method = RequestMethod.GET)
public String updateUser(@PathVariable Integer userId, Model model) {
User user = userService.getByUserId(userId);
List<Role> availableRoles = roleService.getAllRoles();
model.addAttribute("availableRoles", availableRoles);
model.addAttribute("user", user);
return "user/update";
}
调试会话后我找到了解决方案。
因为 Spring 内部 JSP 应该是这样的:
<c:forEach items="${availableRoles}" var="r">
<div class="checkbox">
<form:checkbox path="roles" label="${r.description}" value="${r}" />
</div>
</c:forEach>
注意值是项目 (r),而不是项目的成员,如 r.id。
您还需要在自定义 PropertyEditor 中实现 getAsText。
@Override
public String getAsText() {
Role role = (Role) this.getValue();
return role.getId().toString();
}