Spring绑定集合与隐藏字段形成

时间:2011-12-08 17:59:03

标签: spring-mvc hidden-field

我正在尝试编辑产品。表单支持对象非常简单:

private Integer           productId;
private String            name;
private Double            price;
private List<Integer>     relatedProductList;  //list of related product ids

...//getters/setter

导致问题的部分是relatedProductList。我正在尝试将列表放在帖子上以在子请求页面上显示它。我尝试在jsp中使用这样的隐藏字段:

<form:hidden path="relatedProductList"/>

隐藏字段很好地出现在html中,正如您所期望的那样:

<input id="relatedProductList" name="relatedProductList" type="hidden" value="[200408, 200417]"/>

使用firebug的帖子数据看起来不错:

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为null!

我可以通过使用隐藏字段并在显示相关产品的循环中设置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()。

有没有人知道为什么使用spring form:hidden tag时,postData数据contractList [200408,200417]没有正确绑定到表单?这是一个错误还是预期的行为。对我来说似乎很奇怪,只是想把它扔出去,看看我是否做错了,或者它是否可以帮助其他人。

感谢。

1 个答案:

答案 0 :(得分:0)

我知道这很旧,但是让我简短地回答一下:

您在生成的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"