如何将对象发布到控制器

时间:2018-04-13 14:55:25

标签: spring thymeleaf

我将“产品”对象传递给控制器​​时遇到了困难。我该怎么做?我没有收到错误。问题是我的控制器上的'product'对象为null。

HTML

<section th:each="menu : ${allMenus}">
<button
    <h1 th:text="${menu.name}"></h1>
</button>
<div>
    <div th:each="product : ${menu.productList}">
        <a data-toggle="modal" th:href="'#' + ${product.name} + 'Modal'">
            h5 th:text="${product.name}"></h5>
            <small th:text="${product.price} + '$'"></small>
            <p th:text="${product.description}"></p>
        </a>
    <div th:replace="/productModal :: productModal(product=${product})"></div>
</div>
</section>

模态:

<div th:fragment="productModal(product)">
<div role="document">
    <form method="post" th:action="@{/addItemToCart}">
        <div th:each="topping : ${product.toppings}">
            <input type="checkbox" th:id="${topping} + ${product.id}" name="checkedToppings" th:value="${topping}" />
            <label th:for="${topping} + ${product.id}" th:text="${topping}"></label>
        </div>
        <div>
            <button type="submit">Add to Shopping Cart</button>
        </div>
    </form>
</div>
</div>

控制器

@RequestMapping(value="/addItemToCart", method=RequestMethod.POST)
public String addItemToCart(@ModelAttribute("product") Product product, @RequestParam("checkedToppings") List<String> toppings)
{
    //product is null;
    //checkedToppings are retrieved correctly

    return "redirect:/menu";
}

1 个答案:

答案 0 :(得分:0)

简短回答: 你不能使用HTML将对象发布到控制器。

详细说明: 你将永远无法发布&#34;产品&#34;从HTML页面反对控制器。 代替, 您应该发送有关所需&#34;产品的识别信息&#34;到控制器, 也许是产品ID或其他产品 - 独特 - 身份 - 布莱米。

对评论中的选项的回应: 黑客喜欢隐藏的领域和JavaScript; 我建议不要在这种情况下使用它们。 我相信你只有一个选择:识别信息。 这不需要是真实的&#34;产品编号。 您可以生成一个UUID并在选择一个中存储一个映射:( Servlet会话,数据库,应用程序会话,服务器上的其他位置),它从UUID映射到所需的产品。