ModelAttribute 在 Spring MVC 的控制器中返回 null 值

bra*_*12s 5 spring jsp spring-mvc modelattribute

好的,是时候寻求帮助了;我正在向我的 jsp 发送一个(购物)购物车 ModelAttribute,允许用户编辑数量,当模型 POST 到控制器时,除了可编辑(数量)字段之外,其他字段均为空。我已经研究了几天类似的问题,但没有任何匹配。我使用的是spring 3.1。

\n\n

这是我的 GET 和 POST 控制器:

\n\n
@Controller\npublic class CartController {\n\n      @Autowired\n      private Cart cart;        \n\n      @RequestMapping(value = "/cart", method = RequestMethod.GET)  \n      public String showCart(Model model) {\n         logger.debug("CartController.showCart() Cart: {}", this.cart);\n         model.addAttribute(cart);\n         return "cart/cart";\n      }\n
Run Code Online (Sandbox Code Playgroud)\n\n

和邮寄

\n\n
   @RequestMapping(value = "/cart", method = RequestMethod.POST, params = "update")\n   public String update(@ModelAttribute("cart") Cart cart, BindingResult result, Model model) {\n      logger.debug("CartController.update() Cart: {}", cart); \n      return "cart/cart";\n   }\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的jsp:

\n\n
<div class="container MainContent">\n   <form:form method="POST" modelAttribute="cart">\n      <fieldset>\n         <legend>Cart</legend>\n         <table class="table">\n            <thead>\n               <tr>\n                  <th>Product Name</th>\n                  <th>Quantity</th>\n                  <th>Product Price</th>\n               </tr>\n            </thead>\n            <tbody>\n               <c:forEach items="${cart.cartDetails}" var="cartDetail" varStatus="status">\n                  <tr>\n                     <td>${cartDetail.product.name}</td>                     \n                     <td><form:input path="cartDetails[${status.index}].quantity" size="1" /></td>                     \n                     <td>${cartDetail.price}</td>\n               </c:forEach>\n               <tr>\n                  <b><td colspan="2" align="right"><spring:message code="order.total" /></b>\n                  </td>\n                  <td>${cart.totalCartPrice}</td>\n               </tr>\n            </tbody>\n         </table>\n      </fieldset>\n      <div></div>\n      <button id="order" name="order">\n         <spring:message code="button.order" />\n      </button>\n      <button id="update" name="update">\n         <spring:message code="button.update" />\n      </button>\n   </form:form>\n</div>\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及 GET 之前购物车的日志结果:

\n\n
\n

CartController.showCart() 购物车:购物车 [cartDetails=[CartDetail\n Product=com.Product@c26440[name=我的名字],\n 数量=1]],totalCartPrice=10.00]

\n
\n\n

在 jsp 中将数量从 1 更新为 3 后,然后 POST 到控制器:

\n\n
\n

CartController.update() 购物车:购物车 [cartDetails=[CartDetail\n [产品=null,数量=3]],totalCartPrice=null]

\n
\n\n

我在这里和 Spring 论坛上阅读了几篇类似的文章,并尝试了不同的建议解决方案,但没有成功。看起来我编辑的数量结果已正确绑定到对象,但为什么 \xe2\x80\x99 不是其他的?

\n

Sez*_*rli 4

假设您的 Form 对象中有所有必需的字段;

您必须指定表单字段并用您的数据填充值。

<td>${cartDetail.product.name}</td> 
Run Code Online (Sandbox Code Playgroud)

只会将结果打印到屏幕上。如果您想将其绑定到您的表单,您必须将其放入弹簧表单输入中,例如:

<form:input path="productName"  value="${cartDetail.product.name}"/> 
Run Code Online (Sandbox Code Playgroud)

如果您不希望它可编辑,那么您可以将其放入隐藏字段,但最终您必须将其放入 jsp 中的表单元素中,并在表单 POJO 中拥有相应的字段