Jsp Spring MVC和复杂视图模型中的模型绑定问题

Jsp Spring MVC和复杂视图模型中的模型绑定问题,jsp,spring-mvc,jstl,model-binding,Jsp,Spring Mvc,Jstl,Model Binding,针对复选框的模型绑定似乎不适用于技能列表。我知道javascript是一个选项,但是,现在我坚持使用jsp/jstl路由 // PersonViewModel.java public class PersonViewModel { private String fullName; private Integer experienceInYears private List<SkillItemViewModel> skillList; /* get

针对复选框的模型绑定似乎不适用于技能列表。我知道javascript是一个选项,但是,现在我坚持使用jsp/jstl路由

// PersonViewModel.java
public class PersonViewModel {
    private String fullName;
    private Integer experienceInYears

    private List<SkillItemViewModel> skillList;

    /*  getters and setters */
}

// SkillItemViewModel.java
public class SkillItemViewModel {
    private Long skillId;
    private String skillName;
    private Boolean skillSelected;

        /*  getters and setters */

}

// controller GET Action

@RequestMapping("person/edit")
public ModelAndView editPerson (HttpServletRequest request, HttpServletResponse response) {

 /* set the view model from the model and attach it to the Model and View object  */



}

// controller POST Action
@RequestMapping("person/update")
public ModelAndView updatePerson(HttpServletRequest request, @ModelAttribute("personViewModel") PersonViewModel viewModel, BindingResult result){
   /*
    on debugging viewModel.skillList is null
   */
}




// Edit Person jsp code snippet editProfile.jsp
<c:set var="loopVar" value ="0">
<ul>
<c:forEach var="item" items="${personViewModel.skillList}">
<spring:bind path="personViewModel.skillList[${loopVar}].skillSelected">
    <input type="checkbox" name="chkSkill${item.skillId}" ${item.skillSelected?'checked':''}>
    <label for="chkSkill${item.skillId}">${item.skillName}</label>
</spring:bind>    
</c:forEach>
</ul>


<c:set var="loopVar" value ="${loopVar + 1}">
//PersonViewModel.java
公共类PersonViewModel{
私有字符串全名;
私有整数经验数
私人列表技能列表;
/*接球手和接球手*/
}
//SkillItemViewModel.java
公共类SkillItemViewModel{
私人长斯基利;
私有字符串skillName;
选择专用布尔函数;
/*接球手和接球手*/
}
//控制器获取操作
@请求映射(“个人/编辑”)
公共模型和视图编辑器(HttpServletRequest请求,HttpServletResponse响应){
/*从模型中设置视图模型,并将其附着到模型和视图对象*/
}
//控制器后动作
@请求映射(“个人/更新”)
公共模型和视图更新person(HttpServletRequest请求,@ModelAttribute(“personViewModel”)personViewModel视图模型,BindingResult结果){
/*
调试时,viewModel.skillList为空
*/
}
//编辑人员jsp代码片段editProfile.jsp
    ${item.skillName}

听起来像是一个绑定问题。您是否尝试过使用Spring的
标记而不是
?它将自动生成复选框属性以及一个隐藏字段,Spring使用该字段来确定复选框是“开”还是“关”

此外,还应该使用
varStatus
循环变量来跟踪索引

editProfile.jsp

<ul>
<c:forEach var="item" items="${personViewModel.skillList}" varStatus="status">
    <form:checkbox path="skillList[${status.index}].skillSelected" id="chkSkill${item.skillId}"/>
    <label for="chkSkill${item.skillId}">${item.skillName}</label>   
</c:forEach>
</ul>
    ${item.skillName}