我是Spring的新手。我向用户显示一个列表。每行都有一个用于删除用户的复选框。
控制器:
@Controller public class AdminController { @Autowired private UserDao userDao; @RequestMapping(value = "/admin", method = RequestMethod.GET) public ModelAndView adminPage() { ModelAndView model = new ModelAndView(); model.addObject("users", userDao.findAll()); model.setViewName("admin"); return model; } @RequestMapping(value = "admin/remove", method = RequestMethod.POST) public ModelAndView removeUser(@ModelAttribute(value = "users") ArrayList<User> users) { ModelAndView model = new ModelAndView(); //UPDATE USERS HERE model.setViewName("redirect:/admin"); return model; }
JSP:
<form:form action="/admin/remove" method="POST" modelAttribute="users"> <table class="table table-striped"> <thead> <tr> <th>Firstname</th> <th>Lastname</th> <th>Email/login</th> <th>Profession</th> <th>Select<th> </tr> </thead> <tbody> <c:forEach var="user" items="${users}"> <tr> <td>${user.firstName}</td> <td>${user.lastName}</td> <td>${user.login}</td> <td>${user.profession}</td> <td><input type="checkbox" value="${user.delete}"/></td> </tr> </c:forEach> </tbody> </table> <input type="submit" value="Delete user(s)" class="btn-danger" /> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> </form:form>
该列表显示正确。如果我按下“删除用户”按钮。@modelAttribute用户为空。我也尝试将列表包装在新类中,但得到的结果相同。
有任何想法吗?
多亏了奴才,我找到了答案
包装器:
public class UserListWrapper { private ArrayList<User> users; public ArrayList<User> getUsers() { return users; } public void setUsers(ArrayList<User> users) { this.users = users; }
@Controller public class AdminController { @Autowired private UserDao userDao; @RequestMapping(value = "/admin", method = RequestMethod.GET) public ModelAndView adminPage() { ModelAndView model = new ModelAndView(); UserListWrapper wrapper = new UserListWrapper(); wrapper.setUsers(new ArrayList<User>(userDao.findAll())); model.addObject("userListWrapper",wrapper); model.setViewName("admin"); return model; } @RequestMapping(value = "admin/remove", method = RequestMethod.POST) public ModelAndView removeUser(@ModelAttribute(value = "userListWrapper") UserListWrapper userListWrapper) { ModelAndView model = new ModelAndView(); userDao.removeFlaggedUsers(userListWrapper.getUsers()); model.setViewName("redirect:/admin"); return model; }
}
视图:
<form:form action="/admin/remove" method="POST" modelAttribute="userListWrapper"> <table class="table table-striped"> <thead> <tr> <th>First name</th> <th>Last name</th> <th>Email/login</th> <th>Profession</th> <th>Select<th> </tr> </thead> <tbody> <c:forEach varStatus="us" var="user" items="${userListWrapper.users}" > <tr> <td><form:input type="hidden" path="users[${us.index}].firstName"/>${user.firstName}</td> <td><form:input type="hidden" path="users[${us.index}].lastName"/> ${user.lastName}</td> <td><form:input type="hidden" path="users[${us.index}].login"/>${user.login}</td> <td><form:input type="hidden" path="users[${us.index}].profession"/>${user.profession}</td> <td><form:checkbox path="users[${us.index}].delete" value="${user.delete}"/></td> <form:input type="hidden" path="users[${us.index}].id"/> </tr> </c:forEach> </tbody> </table> <input type="submit" value="Delete user(s)" class="btn-danger" /> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> </form:form>
谢谢!
编辑:别忘了还要添加您未显示的字段。
例如:
如果不添加ID,则删除将不起作用,因为返回的User对象中的ID为NULL。