好的,是时候寻求帮助了;我正在向我的jsp发送(购物)Cart ModelAttribute,允许用户编辑数量,当模型POST到控制器时,除了可编辑(数量)字段外,字段为空。我已经研究了几天类似的问题,但没有任何匹配。我使用的是春季3.1。
这是GET和POST上的控制器:
@Controller
public class CartController {
@Autowired
private Cart cart;
@RequestMapping(value = "/cart", method = RequestMethod.GET)
public String showCart(Model model) {
logger.debug("CartController.showCart() Cart: {}", this.cart);
model.addAttribute(cart);
return "cart/cart";
}
和POST
@RequestMapping(value = "/cart", method = RequestMethod.POST, params = "update")
public String update(@ModelAttribute("cart") Cart cart, BindingResult result, Model model) {
logger.debug("CartController.update() Cart: {}", cart);
return "cart/cart";
}
我的jsp:
<div class="container MainContent">
<form:form method="POST" modelAttribute="cart">
<fieldset>
<legend>Cart</legend>
<table class="table">
<thead>
<tr>
<th>Product Name</th>
<th>Quantity</th>
<th>Product Price</th>
</tr>
</thead>
<tbody>
<c:forEach items="${cart.cartDetails}" var="cartDetail" varStatus="status">
<tr>
<td>${cartDetail.product.name}</td>
<td><form:input path="cartDetails[${status.index}].quantity" size="1" /></td>
<td>${cartDetail.price}</td>
</c:forEach>
<tr>
<b><td colspan="2" align="right"><spring:message code="order.total" /></b>
</td>
<td>${cart.totalCartPrice}</td>
</tr>
</tbody>
</table>
</fieldset>
<div></div>
<button id="order" name="order">
<spring:message code="button.order" />
</button>
<button id="update" name="update">
<spring:message code="button.update" />
</button>
</form:form>
</div>
以及GET之前购物车的日志结果:
CartController.showCart()购物车:购物车[cartDetails = [CartDetail product = com.Product@c26440 [name =我的名字], quantity = 1]],totalCartPrice = 10.00]
并在jsp中将数量从1更新为3,然后POST到控制器:
CartController.update()购物车:购物车[cartDetails = [CartDetail [product = null,quantity = 3]],totalCartPrice = null]
我已经在Spring论坛上阅读了几篇类似的帖子,尝试了不同的建议解决方案,但没有运气。似乎我编辑的数量结果正确地绑定到对象,但为什么不是其他的?
答案 0 :(得分:4)
假设您在Form对象中包含所有必需的字段;
您必须指定表单字段并使用数据填充值。
<td>${cartDetail.product.name}</td>
只会将结果打印到屏幕上。如果要将其绑定到表单,则必须将其放在弹簧形式输入中,例如:
<form:input path="productName" value="${cartDetail.product.name}"/>
如果您不希望它是可编辑的,那么您可以将其放入隐藏字段中,但最后您必须将其放在jsp中的表单元素中并在表单中包含相应的字段POJO < / p>
答案 1 :(得分:2)
似乎其他字段未绑定,请尝试绑定例如产品名称
<td>${cartDetail.product.name}
<form:hidden path="cartDetails[${status.index}].product.name" value="${cartDetail.product.name}"/></td>
答案 2 :(得分:0)
我曾经花了很多时间研究类似的问题。最后,我在Binder
的初始化方法中找到了罪魁祸首:
@InitBinder
void initBinder(final WebDataBinder binder) {
binder.setAllowedFields("name", ...);
}
此方法对允许绑定的字段设置限制。并且所有其他字段都是未绑定的,自然会产生null
值。
另一个可能的原因:使用@ModelAttribute注释Bean中的错误setter。例如,Object setName(String name)
代替void setName(String)
。