我正在尝试在列表对象上使用<checkboxes>
标记。但是,尽管阅读了mykong教程并在其他地方搜索,但我无法弄清楚这是如何完成的。
所以这就是我想要做的: 我有一个像
这样的课程 class Person{
List<IceCreams> creams;
}
所以现在我想给我的用户一个表格,他可以选择他喜欢的IceCreams。
控制器:
@Controller
public class IceCreamController{
@RequestMapping(value="icecream", method=RequestMethod.GET)
public String showPage(Model model){
Person person = repository.getPerson(); //Returns a Person, "creams" is not empty
model.addAttribute("creams", person.getIceCreams();
}
@RequestMapping(value="icecream", method=RequestMethod.POST)
public String showPage( @ModelAttribute("teilnehmer") List<IceCreams> likedCreams, Model model){
//do something with selected iceCreams
}
现在我不明白如何在JSP中继续。我知道我必须使用checkboxes标签,但我不知道它在提交时返回什么,或者我是否正确使用它。
<form:form>
<form:checkboxes path="creams" items="${creams}"/>
<input type="Submit" value="Submit">
</form:form>
所以问题是:我在JSP中写什么以及将什么返回给控制器?
评论后添加: IceCream类:
public class IceCream{
private long id;
private String creamName;
// + getter / setter方法 }
编辑:经过有用的回答,我试过这个: 将它们添加到模型中:model.addAttribute("person", person);
model.addAttribute("creams", person.getCreams());
在JSP中我做了
<form:checkboxes path="teilnehmer"
items="${creams}"
itemValue="id"
itemLabel="creamName"
/>
所以在POST方法中我选择了一个ModelAttribute Person。
添加到Controller:
@InitBinder
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
binder.registerCustomEditor(IceCream.class, new IceCreamsPropertyEditor());
和新的编辑类:
public class ContactsPropertyEditor extends PropertyEditorSupport{
@Autowired
IceCreamRepository creamrep;
@Override
public void setAsText(String text) throws IllegalArgumentException {
Integer creamId = new Integer(text);
IceCream cream = creamrep.findOne(creamId);
super.setValue(con);
}
}
可悲的是,结果是错误400。
答案 0 :(得分:1)
首先,您无法绑定到原始列表。您需要绑定到包装列表的对象:在您的情况下,这是Person的实例而不是List的面霜。
所以,将Person放入模型中。使用@ModelAttribute
方法,以便框架在提交时重新加载同一个人并设置值。我们很可能想要提供所有可用的冰淇淋供选择。
@RequestMapping(method=RequestMethod.GET)
public String loadForEdit(){
return "";
}
@RequestMapping(method=RequestMethod.POST)
public String save(@ModelAttribute("person") Person person){
repository.savePerson(person);
return "";
}
//called by the framework on 'get' to load the person you wish to edit
//called by the framework on on 'post' to get the same instance for binding
//send personId as a hidden form element in the form
@ModelAttribute("person")
public Person getPerson(@RequestParam int personId){
return repository.getPerson(personId);
}
@ModelAttribute("iceCreams")
public List<String> getAvailableIceCreams(){
return repository.findAll();
}
其次,框架无法自动从提交的表单参数转换为IceCream的实例。要做到这一点,你需要考虑使用转换器,但这是另一个问题。见这里:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html
鉴于上述情况,我们现在可以通过将集合类型更改为String来获得一个更简单的示例:
class Person{
List<String> creams;
}
然后,JSP应该简单地成为:
<form:form modelAttribute="person">
<!-- bind to the creams property of person -->
<!-- create check boxes for all available ice creams -->
<!-- any already in person.creams should be automatically checked -->
<form:checkboxes path="creams" items="${iceCreams}" />
<input type="hidden" value="${person.id}" name="personId"/>
<input type="Submit" value="Submit">
</form:form>
熟悉转换器后,您可以转换为绑定到IceCream实例,但这个主题太宽泛了。但是,在JSP中,您只需要更新复选框标记,如下所示:
<form:checkboxes path="creams" items="${iceCreams}" itemValue="id" itemLabel="labelName"/>
其中value是将提交给服务器的属性,转换器将使用该属性创建正确的实例(例如,保存在数据库中的项的ID),label是用于显示的属性