Java Spring MVC将ArrayList传递回控制器
我是春天的新手。我显示一个包含用户的列表。每行都有一个用于删除用户的复选框 控制器:Java Spring MVC将ArrayList传递回控制器,java,spring,jsp,spring-mvc,Java,Spring,Jsp,Spring Mvc,我是春天的新手。我显示一个包含用户的列表。每行都有一个用于删除用户的复选框 控制器: @Controller public class AdminController { @Autowired private UserDao userDao; @RequestMapping(value = "/admin", method = RequestMethod.GET) public ModelAndView adminPage() { ModelA
@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;
}
@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;
}
@控制器
公共类管理员控制器{
@自动连线
私有UserDao UserDao;
@RequestMapping(value=“/admin”,method=RequestMethod.GET)
公共模型和视图管理页(){
ModelAndView模型=新的ModelAndView();
addObject(“users”,userDao.findAll());
model.setViewName(“管理员”);
收益模型;
}
@RequestMapping(value=“admin/remove”,method=RequestMethod.POST)
公共模型和视图移除用户(@modeldattribute(value=“users”)数组列表用户){
ModelAndView模型=新的ModelAndView();
//在此更新用户
model.setViewName(“重定向:/admin”);
收益模型;
}
JSP:
名字
姓氏
电子邮件/登录
职业
挑选
${user.firstName}
${user.lastName}
${user.login}
${user.profession}
列表呈现正确。如果我按“删除用户”按钮,@modeldattribute users为空。
我还尝试在一个新的类中包装列表,但得到了相同的结果
有什么想法吗?这是因为您在视图中使用了重定向:查看Flash属性:
您应该能够获得更新的列表:)您的ModelAttribute为空,因为没有表单数据从jsp绑定到您的model属性。看看Spring示例如何绑定集合“”。这将帮助您理解
大多数Spring应用程序通常使用带有“path”参数的form:input来进行数据绑定。您应该围绕Spring mvc select标记构建您的功能。不过,很少有更改,例如,将列表推送到POJO类
public class FormBean {
private List<String> users;
public FormBean() {
}
public List<String> getUsers() {
return users;
}
public void setUsers(List<String> users) {
this.users = users;
}
}
最后,用springs选择标记交换c:forEach,如下所示
<form:form action="/admin/remove" method="POST" modelAttribute="formBean">
...
<form:select path="users" items="${users}" multiple="true" />
...
</form>
...
...
多亏了仆从,我找到了答案
包装器:
public class UserListWrapper {
private ArrayList<User> users;
public ArrayList<User> getUsers() {
return users;
}
public void setUsers(ArrayList<User> users) {
this.users = users;
}
公共类UserListWrapper{
私有ArrayList用户;
公共ArrayList getUsers(){
返回用户;
}
公共void集合用户(ArrayList用户){
this.users=用户;
}
控制器:
@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;
}
@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;
}
@控制器
公共类管理员控制器{
@自动连线
私有UserDao UserDao;
@RequestMapping(value=“/admin”,method=RequestMethod.GET)
公共模型和视图管理页(){
ModelAndView模型=新的ModelAndView();
UserListWrapper=新的UserListWrapper();
setUsers(新的ArrayList(userDao.findAll());
addObject(“userListWrapper”,wrapper);
model.setViewName(“管理员”);
收益模型;
}
@RequestMapping(value=“admin/remove”,method=RequestMethod.POST)
公共ModelAndView removeUser(@ModelAttribute(value=“userListWrapper”)userListWrapper userListWrapper){
ModelAndView模型=新的ModelAndView();
removeFlaggedUsers(userListWrapper.getUsers());
model.setViewName(“重定向:/admin”);
收益模型;
}
}
视图:
名字
姓
电子邮件/登录
职业
挑选
${user.firstName}
${user.lastName}
${user.login}
${user.profession}
谢谢大家!
编辑:别忘了添加未显示的字段
例如:
如果不添加id,删除将不起作用,因为返回的用户对象中的id将为空。重定向前的数据为空。请参阅此处的“//UPDATE USERS”在控制器中。这不是该问题的有效答案。请查看我的答案,了解其为空的原因。您能否接受它作为答案。我提供了链接,而不是直接提供答案,因为这将有助于理解绑定流程。很高兴我能提供帮助。
<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>