Thông tin cơ bản nhỏ đầu tiên. Có một mối quan hệ vai trò người dùng khá chuẩn, trong đó Người dùng có thể có nhiều vai trò. Tôi có các vai trò được định nghĩa là một bộ trong lớp người dùng. Bây giờ tôi biết rằng các hình thức html có tất cả các giá trị như chuỗi và cố gắng để có được các giá trị như đối tượng vai trò tùy chỉnh của tôi không hoạt động. Tôi đã thực hiện một initbinder để chuyển đổi của id trở lại thành đối tượng để tôi có thể lấy ra các giá trị đã chọn ngoài các hộp kiểm của tôi, phần đó hoạt động.Spring MVC Pre Populate Checkboxes
Nhưng tôi dường như không thể quay lại theo cách khác. Tôi lấy một người dùng từ cơ sở dữ liệu đã có vai trò và muốn điền trước các hộp kiểm vai trò với tất cả các vai trò mà người dùng có. Dựa trên ví dụ này:
Họ nói rằng:
dạng: hộp kiểm mục = "$ {động-list}" path = "Tài sản-to-store"
Đối với nhiều hộp kiểm, miễn là giá trị "đường dẫn" hoặc "thuộc tính" là bằng bất kỳ giá trị "hộp kiểm nào - $ {dynamic-list}", hộp kiểm phù hợp sẽ tự động được kiểm tra.
Giải thích của tôi về điều đó là tôi có thể cấp cho nó một tập hợp tất cả các vai trò và xác định đường dẫn là vai trò từ đối tượng người dùng và nó phải khớp với chúng để khiến hộp kiểm được điền trước.
Mỗi ví dụ có vẻ như có giá trị của danh sách động dưới dạng Chuỗi []. Vâng thats tuyệt vời và dandy nhưng làm thế nào để làm việc này cho các đối tượng tùy chỉnh mà chúng tôi định nghĩa là một Set? Tôi vẫn có thể sử dụng định nghĩa một dòng này cho các hộp kiểm hay tôi có cần phải thực hiện một số loại ràng buộc dữ liệu nào đó trong chế độ xem không?
Đây là người dùng dto, bộ điều khiển người dùng, biểu mẫu tùy chỉnh của tôi và trang chỉnh sửa người dùng.
tài DTO
@Entity
@Table
public class User extends BaseDto
{
@Column(updatable = false) @NotBlank
private String username;
@Column(name = "encrypted_password") @Size(min = 6, message = "password must be at least 6 characters") @Pattern(regexp = "^\\S*$", message = "invalid character detected")
private String password;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column @NotNull
private boolean enabled;
@Column @Email @NotBlank
private String email;
@Transient
private String confirmPassword;
@ManyToMany(targetEntity = Role.class, fetch = FetchType.EAGER, cascade = CascadeType.REFRESH) @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
public User()
{
}
public User(final String usernameIn, final String passwordIn, final String firstNameIn, final String lastNameIn, final String emailIn, final boolean enabledIn)
{
username = usernameIn;
password = passwordIn;
firstName = firstNameIn;
lastName = lastNameIn;
email = emailIn;
enabled = enabledIn;
}
public String getUsername()
{
return username;
}
public void setUsername(final String usernameIn)
{
username = usernameIn;
}
public String getPassword()
{
return password;
}
public void setPassword(final String passwordIn)
{
password = passwordIn;
}
public String getFirstName()
{
return firstName;
}
public void setFirstName(final String firstNameIn)
{
firstName = firstNameIn;
}
public String getLastName()
{
return lastName;
}
public void setLastName(final String lastNameIn)
{
lastName = lastNameIn;
}
public String getEmail()
{
return email;
}
public void setEmail(final String emailIn)
{
email = emailIn;
}
public String getConfirmPassword()
{
return confirmPassword;
}
public void setConfirmPassword(final String confirmPasswordIn)
{
confirmPassword = confirmPasswordIn;
}
public boolean isEnabled()
{
return enabled;
}
public void setEnabled(final boolean enabledIn)
{
enabled = enabledIn;
}
public Set<Role> getRoles()
{
return roles;
}
public void setRoles(final Set<Role> rolesIn)
{
roles = rolesIn;
}
}
tài điều khiển
@Controller @RequestMapping("/user")
public class UserController
{
@Autowired private UserService userService;
@Autowired private UserDao userDao;
@Autowired private RoleDao roleDao;
@InitBinder
public void bindForm(final WebDataBinder binder)
{
binder.registerCustomEditor(Set.class, "roles", new CustomFormBinder<RoleDao>(roleDao, Set.class));
}
@RequestMapping(method = RequestMethod.GET)
public String index(final ModelMap modelMap)
{
return "/user/index";
}
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String create(final ModelMap modelMap)
{
modelMap.addAttribute("userInstance", new User());
modelMap.addAttribute("validRoles", new HashSet<Role>(roleDao.findAll()));
return "/user/create";
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(final ModelMap modelMap, @Valid @ModelAttribute("userInstance") final User user, final BindingResult bindingResult)
{
// TODO move to service validation
if (user.getPassword() == null || !user.getPassword().equals(user.getConfirmPassword()))
{
bindingResult.addError(new FieldError("userInstance", "password", "password fields must match"));
bindingResult.addError(new FieldError("userInstance", "confirmPassword", "password fields must match"));
}
if (user.getRoles() == null || user.getRoles().isEmpty())
{
bindingResult.addError(new FieldError("userInstance", "roles", "Must select at least one role for a User"));
}
if (bindingResult.hasErrors())
{
modelMap.addAttribute("validRoles", new HashSet<Role>(roleDao.findAll()));
return "/user/create";
}
userService.save(user);
return "redirect:/user/list";
}
@RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
public String edit(@PathVariable final Integer id, final ModelMap modelMap)
{
final User user = userDao.find(id);
if (user != null)
{
modelMap.addAttribute("userInstance", user);
modelMap.addAttribute("validRoles", new HashSet<Role>(roleDao.findAll()));
return "/user/edit";
}
return "redirect:/user/list";
}
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String editCurrent(final ModelMap modelMap)
{
return edit(userService.getLoggedInUser().getId(), modelMap);
}
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String update(@Valid @ModelAttribute("userInstance") final User user, final BindingResult bindingResult)
{
if (bindingResult.hasErrors())
{
return "/user/edit";
}
userService.save(user);
return "redirect:/user/list";
}
@ModelAttribute("userInstances")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public List<User> list()
{
return userDao.findAll();
}
}
Tuỳ chỉnh Mẫu Binder
public class CustomFormBinder<T extends GenericDao> extends CustomCollectionEditor
{
private final T dao;
private static final Logger LOG = LoggerFactory.getLogger(CustomFormBinder.class);
public CustomFormBinder(final T daoIn, final Class collectionType)
{
super(collectionType, true);
dao = daoIn;
}
@Override
protected Object convertElement(final Object element)
{
try
{
// forms should return the id as the itemValue
return dao.find(Integer.valueOf(element.toString()));
}
catch (NumberFormatException e)
{
LOG.warn("Unable to convert " + element + " to an integer");
return null;
}
}
}
tài khoản Chỉnh sửa Xem
<html>
<head>
<title>Create User</title>
</head>
<body>
<c:url value="/user/update" var="actionUrl"/>
<form:form method="post" commandName="userInstance" action="${actionUrl}">
<h1>Edit User ${userInstance.username}</h1>
<div>
<form:label path="username">Username:</form:label>
<form:input path="username" id="username" readonly="true"/>
</div>
<div>
<form:label path="password">Password:</form:label>
<form:input path="password" id="password" type="password" readonly="true"/>
<tag:errorlist path="userInstance.password" cssClass="formError"/>
</div>
<div>
<form:label path="firstName">First Name:</form:label>
<form:input path="firstName" id="firstName"/>
<tag:errorlist path="userInstance.firstName" cssClass="formError"/>
</div>
<div>
<form:label path="lastName">Last Name:</form:label>
<form:input path="lastName" id="lastName"/>
<tag:errorlist path="userInstance.lastName" cssClass="formError"/>
</div>
<div>
<form:label path="email">Email:</form:label>
<form:input path="email" id="email" size="30"/>
<tag:errorlist path="userInstance.email" cssClass="formError"/>
</div>
<div>
**<%--Want to Pre Populate these checkboxed--%>
<form:checkboxes title="Assigned Roles:" path="roles" id="roles" items="${validRoles}" itemLabel="displayName" itemValue="id" element="div"/>**
<tag:errorlist path="userInstance.roles" cssClass="formError"/>
</div>
<form:hidden path="enabled"/>
<form:hidden path="id"/>
<form:hidden path="version"/>
<div class="submit">
<input type="submit" value="Update"/>
<a href="<c:url value='/user/list'/>" class="cancel">Cancel</a>
</div>
</form:form>
</body>
</html>
Lưu ý rằng '
Chỉnh sửa người dùng $ {userInstance.username}
' dường như làm cho việc chèn tập lệnh java có thể là – Ralph