将循环变量从Freemarker模板传递给Spring控制器

时间:2016-03-15 11:15:23

标签: spring-mvc freemarker

我在视图中列出了表格中的对象。我希望能够使用表格中的按钮编辑对象。

<#list products as product>
    <tr>
        <td>${product.productName}</td>
        <td>${product.price}</td>
        <td>${product.quantity}</td>
        <td>
            <form name="product" method="post" action="/product/edit">
                <input type="submit" name="submit" value="Edit this product"/>
            </form>
        </td>
    </tr>
</#list>

然后应该将对象传递给控制器​​方法:

@RequestMapping(value="/edit", method = RequestMethod.POST)
public ModelAndView edit(@ModelAttribute("product") Product product){
    ModelAndView mav = new ModelAndView("product/edit");
    mav.addObject("product", product);
    return mav;
}

但是,product方法获得的edit为空。我该如何解决?我尝试使用下面的代码在表单中绑定产品,但这也不起作用。

    <form name="product" method="post" action="/product/edit">
        <@spring.bind "product" />
        <input type="hidden" name="${spring.status.expression}" value="${spring.status.value}"/>
        <input type="submit" name="submit" value="Edit this product"/>
    </form>

我想使用POST方法。

1 个答案:

答案 0 :(得分:1)

我想建议一种不同的方法。如果我没有弄错,你只想选择一个对象供以后编辑 - 你不会在那个视图中真正编辑它。

如果是这样,您所要做的就是将对象的标识符传递给控制器​​,而不是将所选对象本身传递给它。

如果没有,你应该给我们一个洞的故事,并提供其余的观点。

假设我是对的,下一个问题就是为什么你需要使用表单提交。传递id最好通过链接来完成 - 作为参数,或者,如果你遵循REST风格,作为URI本身的一部分:

<!-- Link parameter -->
<#list products as product>
    <tr>
        <td>${product.productName}</td>
        <td>${product.price}</td>
        <td>${product.quantity}</td>
        <td>
            <a href="yourURI?pid=${product.productName}">Edit ${product.productName}</a>
        </td>
    </tr>
</#list>


<!-- REST-style -->
...
            <a href="product/{product.productName}/edit">Edit ${product.productName}</a>
...

productName当然不是一个好的身份。如果products是一个列表(意思是java.util.List),则列表的索引很方便。即使在HashMapSet中,我也会创建一个唯一ID,而不是使用产品名称。

现在您可以识别您的对象,在支持代码中选择它以供以后编辑,但不在视图中。 您将找到大量如何在控制器中获取链接参数的示例。所以,这里不需要详细说明。

但是,如果你坚持使用表单和POST方法,那么就这样做:

<form method="post" action="/product/edit">
    <#list products as product>
        <tr>
            <td>${product.productName}</td>
            <td>${product.price}</td>
            <td>${product.quantity}</td>
            <td>
                <button value="${product.productName}" name="product" type="submit">Edit ${product.productName}</button>
            </td>
        </tr>
    </#list>
</form>

请注意,这不适用于较旧的IE浏览器(低于Ver.10),因为它们不会返回值,而是返回按钮标记内的所有内容。

隐藏的输入和单个提交按钮根本无济于事,因为所有输入都已提交,并且使用不同的表单也不是。