不需要<c:foreach 来迭代所有选项,而是使用 spring <form:options 标签,例如:
我正在考虑你的 PersonDTO 类有属性 id 和 name 那么,
<form:select id="name" path="name">
<option value="0">--select--</option>
<form:options items="${personInfo}" itemLabel="name" itemValue="id">
</form:select>
技能也一样:
<form:select id="skills" path="skills">
<form:options items="${personInfo.skills}"> />
</form:select>
要加载所选人员的技能,请使用人员 ID 向控制器发出 AJAX 获取请求,并从控制器返回基于人员 ID 的人员技能,例如:
控制器中的 GET 处理程序方法如下所示:
@RequestMapping(value="/{personId}/getSkills", method=RequestMethod.GET,
consumes=MediaType.APPLICATION_JSON_VALUE,
produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody List<Skills> getSkills(@PathVariable("personId")Integer personId){
List<Skills> personSkills = personService.getPersonSkills(personId);
return personSkills;
}
Ajax 调用如下所示:
$('select#name').change(function(){
$.getJSON('/'+$('select#name option:selected').val()+'/getSkills', function(skills) {
$('select#skills').empty(); //first remove existing options then append new options
$.each( skills, function( key, val ) {
$('select#skills').append($("<option></option>")
.attr("value",key)
.text(val));
});
});
});
注意:要激活 @ResponseBody,请添加 <mvc:annotation-driven/> 和 Jackson mapper 或构建路径上应提供的任何其他映射器,以便进行 JSON 序列化和反序列化。
另请参阅:
编辑:根据您的评论,解决方案将是
<script type="text/javascript">
var peopleSkills = {};
<c:forEach var="person" items="${personInfo}">
peopleSkills['${person.name}'] = new Array();
<c:forEach var="skill" items="${person.skills}">
peopleSkills['${person.name}'].push('${skill}');
</c:forEach>
</c:forEach>
$('select#name').change(function(){
var skills = peopleSkills[$(this).val()];
console.log($(this).val()+' has: '+JSON.stringify(skills));
$('select#skills').empty();
$.each( skills, function( key, val ) {
$('select#skills').append($("<option></option>")
.attr("value",val)
.text(val));
});
});
</script>