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>