没有必要的<c:foreach
遍历所有选项的,而不是采用弹簧<form:options
标签,如:
正在考虑您的PersonDTO
类具有ID和名然后,
<form:select id="name" path="name">
<option value="0">--select--</option>
<form:options items="${personInfo}" itemLabel="name" itemValue="id">
</form:select>
simillarly技能:
<form:select id="skills" path="skills">
<form:options items="${personInfo.skills}"> />
</form:select>
加载选定人员的技能,做一个AJAX获取请求,从控制器返回的人的技能的人,以人为本的ID,如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序列化和deserializ即
另请参见:
编辑:根据您的评论的解决方案将是
<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>
非常感谢你给我答案。但我现在只有一个问题。同时迭代和显示技能(名称下拉列表中的3个名字),前两个人的技能即将变得正确,但即使第三人只有一项技能,下拉显示三个。任何想法它有什么问题?我调试它,数据是完美无缺的,直到我使用JSTL在JSP中遍历它们。第一个人有3个技能,第二个人有2个技能,第三个人只有1个技能。 – user3388802 2014-09-06 23:06:27
你看过html源代码来验证JavaScript对象中的正确数据吗?另外,你的任何名字都有引号吗?如果您还没有这样做,请使用javascript调试器并查找在更改名称select时引发的任何javascript错误。 – Tap 2014-09-06 23:40:27