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

Pass loop variable from Freemarker template to Spring controller

我在 table 中列出对象。我希望能够使用 table 中的按钮编辑对象。

<#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;
}

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

    <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 方法。

我想推荐一种不同的方法。如果我没有弄错的话,您只是想选择一个对象供以后编辑 - 您实际上并没有在那个视图中编辑它。

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

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

假设我是对的,下一个问题是为什么您需要使用表单提交。传递 id 最好由 links 完成——作为参数,或者,如果你遵循 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 当然不是一个好的 id。如果 products 是一个列表(意思是 java.util.List),列表的索引就很方便。即使在 HashMapSet 中,我也会创建一个唯一的 ID 而不是使用产品名称。

现在您可以识别您的对象,select 它在支持代码中供以后编辑,但不在视图中。 您会找到大量有关如何在控制器中获取 link 参数的示例。所以这里就不用多说了。

但是,如果您坚持使用表单和 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 浏览器(版本 10 以下),因为它们不 return 值,而是按钮标记内的所有内容。

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