我正在尝试编辑产品。表单支持对象非常简单:
private Integer productId;
private String name;
private Double price;
private List<Integer> relatedProductList; //list of related product ids
...//getters/setter
引起问题的部分是relatedProductList。我正在尝试将该列表张贴在subsequest页面上。我尝试在我的jsp中使用这样的隐藏字段:
<form:hidden path="relatedProductList"/>
正如您所期望的,隐藏字段在html中很好地显示:
<input id="relatedProductList" name="relatedProductList" type="hidden" value="[200408, 200417]"/>
使用萤火虫发布的数据看起来不错:
relatedProductList [200408, 200417]
但是在我的控制器中,表单支持对象的产品列表为空?
@RequestMapping(method = RequestMethod.POST, value = "/edit.do", params = "editRelatedProducts")
public ModelAndView editRelatedProducts(@Valid @ModelAttribute ProductForm form, BindingResult result) {
if (result.hasErrors()) {
ModelAndView view = new ModelAndView(VIEW_PRODUCT);
setupCreateReferenceData(view , form);
return view ;
}
ModelAndView editView = new ModelAndView(VIEW_EDIT_RELATED);
//method to lookup the product ids and place product objects on model
editView.addObject("relatedProducts",populateProductList(form.getRelatedProductList()));
return editView ;
}
**但是form.getRelatedProductList为空!
我可以通过使用隐藏字段并在显示相关产品的循环中的jsp中设置值来解决问题:
<div>
<table id="relProductTbl" class="tablesorter">
<thead>
...
</thead>
<tbody>
<c:forEach var="prod" items="${relatedProducts}" varStatus="row">
<tr>
<input id="relatedProductList" name="relatedProductList" type="hidden" value="${prod.productId}"/>
...
</tr>
</c:forEach>
</tbody>
</table>
</div>
这将产生以下html:
<input id="relatedProductList" name="relatedProductList" type="hidden" value="200408"/>
...
<input id="relatedProductList" name="relatedProductList" type="hidden" value="200417"/>
看起来不错,并提供以下信息:
relatedProductList 200408
relatedProductList 200417
然后突然正确地填写了form.getRelatedProductList()。
[有人知道为什么使用springs form:hidden标签时,post数据contractList [200408,200417]为什么没有正确地绑定到表单吗?这是错误还是预期的行为。对我来说似乎很奇怪,只是想把它扔出去,看看我做错了还是对其他人有帮助。
谢谢。
我知道这很旧,但是让我简短地回答一下:
您在生成的HTML relatedProductList [200408, 200417]
中观察到的<input id="relatedProductList" name="relatedProductList" type="hidden" value="[200408, 200417]"/>
只是relatedProductList.toString()
的值,它依次使用java.util.AbstractCollection
中的默认实现。格式如下:[..., ..., ...]
。 Spring MVC使用toString()方法获取表单输入字段的表示形式,这很简单:它需要一个纯字符串。
这不保证以后能够解析相同的字符串。显然,如果不能,则将变量绑定为null。
[您后来所做的(直接使用<input type="hidden">
实际上实际上是一个技巧,但由于功能上存在一些空白,我在使用Spring MVC时有时不得不做这样的事情。
通常,如果有多个具有相同名称的表单字段,它们都将嵌入POST数据中。如果检查POST数据字符串,则会在其中找到类似relatedProductList=200408&relatedProductList=200417
的内容。现在,当Spring MVC在解析POST数据时发现这种情况时,它将尝试将其映射到手头的目标变量。如果目标变量是java.util.Collection
(如您的情况),它将使用POST数据中的值作为收集元素,这非常直观。
如果仅举另一个例子,目标变量的类型为String
,它将像这样填充它:"200408,200417"
。