我正在尝试使用<code>
所以我想做的是:我有一个类似
class Person{
List<IceCreams> creams;
}
所以现在我想给我的用户一个表格,让他可以选择他喜欢的冰淇淋。
控制器:
@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;
//getters/setters}
编辑:在得到一个有用的答案后,我尝试这样做:将它们添加到模型中:
model.addAttribute("person", person);
model.addAttribute("creams", person.getCreams());
在JSP中我做到了
<form:checkboxes path="teilnehmer"
items="${creams}"
itemValue="id"
itemLabel="creamName"
/>
所以在后方法中,我取一个ModelAttribute Person。
添加到控制器:
@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。
首先,您不能绑定到原始列表。您需要绑定到包装列表的对象:在您的情况下,这是Person的实例,而不是list奶油。
所以,把这个人放在模型里。使用< code>@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();
}
其次,框架不能从提交的表单参数自动转换成冰淇淋的实例。为此,你需要考虑使用转换器,但这是另一个问题。看这里:
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),标签是用于显示的属性。
我是新的java开发人员,我需要你的帮助。我已经看到了类似主题的问答,但我仍然不知道如何处理它,所以我想寻求一些帮助。 我用的是Liferay 6.2 提前感谢您的任何帮助!
我的发帖方法: 索引页表单: 当我单击submit时,browser显示为错误的请求,但没有th:field=“*{userRole}”,我可以提交表单。有什么办法解决这个问题吗? 然后如@roel所述更改了表单。 多谢了。
我正试图找出如何解决这两个问题,我有我的ES 5.6索引。 我需要创建两个单独的脚本过滤器: 1-筛选employee数组大小==3的文档 2-筛选数组第一个元素为“name”==“John”的文档 我试图做一些第一步,但我无法迭代列表。我总是有一个空指针异常错误。
这是我使用得到的结果 使用下面的代码,我得到了键列表:值 如何读取特定值,如?我可以使用,但可能还有另一种方法
我有以下列表,里面是另一个列表,然后是字符串列表 <代码>列表 示例 除了执行嵌套循环并最终替换列表之外,还有更好的方法吗?也许有溪流?
我需要筛选我的对象列表: 以便将具有相同和的所有对象合并到具有以下属性的单个对象中: 作为所有值的和 作为所有值的字符串级联 所以结果是: Java 8中的溪流有可能做到吗? 我尝试了几种方法(例如,还使用),但我没有找到解决方案! 谢谢 编辑: 下面是我尝试的: 但由于某种原因,在计算过程中,我在上得到了,无论如何,我非常肯定这不是一个有效的解决方案。