将循环变量从 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
),列表的索引就很方便。即使在 HashMap
或 Set
中,我也会创建一个唯一的 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 值,而是按钮标记内的所有内容。
隐藏输入和单个提交按钮根本无济于事,因为 所有 个输入都已提交,使用不同的表单也不是办法。
我在 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
),列表的索引就很方便。即使在 HashMap
或 Set
中,我也会创建一个唯一的 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 值,而是按钮标记内的所有内容。
隐藏输入和单个提交按钮根本无济于事,因为 所有 个输入都已提交,使用不同的表单也不是办法。