列表对象上的Spring JSP复选框

时间:2016-01-27 17:16:39

标签: spring jsp spring-mvc

我正在尝试在列表对象上使用<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。

1 个答案:

答案 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是用于显示的属性