我在Spring中绑定了一个多选列表,该项目没有从DAO获取数据,而是从另一个选择选项列表添加数据。用户单击一个按钮,数据将使用jquery发送到多选选项列表。
当表单发布时,数据绑定不会发生,因为它是一个复杂的数据类型,因此我注册了CustomEditor并将其附加到@initbinder。
EDITED 我已经更新了代码 CollectionEditor 现在返回一个公民列表回到视图但是我无法获取列表中的数据来填充选择选项。我正在尝试向列表添加元素,但是当从服务器返回时,jsp仍然选择保持为空。
Under是代码:
CustomCollectionEditor
@InitBinder("crime")
protected void initBinder(WebDataBinder binder, HttpServletRequest request, ServletRequestDataBinder victimbinder){
victimbinder.registerCustomEditor(List.class, "victims", new CustomCollectionEditor(List.class){
protected Object convertElement(Object element){
Citizens victims = new Citizens();
String ssNumber = "";
if (element instanceof String){
ssNumber = (String) element;
}
logger.debug("element is ;" +element);
try {
int socialSecurityNumber = Integer.parseInt(ssNumber);
victims = citizenManager.getCitizen(socialSecurityNumber);
} catch (NumberFormatException e) {
logger.error(e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
}
return victims;
}
});
从控制器中的DAO填充的Jsp
这包含单击按钮时从DAO类填充的数据,它将列表中的数据附加到另一个列表中,该列表绑定到POJO
<label>Victims List</label><buttonid="addVictimBtn">/button>
<form:select path="" id="dbvictims" title="Victims Of Crime" class="victimLst">
<form:options items="${dbvictims.dbvictimList}" itemValue="socialSecurityNumber" itemLabel="name"/>
</form:select>
Jsp选择绑定到POJO的项目
<label>Victims In Crime</label><button id="removeVictimBtn">-</button>
<form:select path="victims" id="victims" title="Victims Of Crime" multiple="multiple" class="victimLst">
<form:options items="${victimList}" itemValue="socialSecurityNumber" itemLabel="name"/>
</form:select><form:errors path="victims" class="errors" />
答案 0 :(得分:2)
此问题的解决方案非常简单,所有工作都已在 CustomCollectionEditor 中完成。在绑定如上所述的复杂数据类型时,这很重要。可能还有其他方法可以做到这一点,但我觉得这是一个非常简洁的方法。
return语句非常重要,因为它绑定到视图中元素的item属性。 CustomCollectionEditor 返回对象列表(受害者)使用 DAO 从数据库中获取对象。这很重要,因为帖子只发送选择值而不是标签,因此我们重新构建列表并重新发送到视图。
我省略的部分是将List Object从控制器传递回视图。
<强>控制器强>
@RequestMapping(value="save.htm", method = RequestMethod.POST)
public ModelAndView handleSave(@Valid @ModelAttribute Crime crime,
BindingResult result,
ModelMap m,
Model model) throws Exception {
if(result.hasErrors()){
model.addAttribute("victimList",crime.getVictims());
return new ModelAndView("*Your View*");
...............