You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Thymeleaf表单将Book对象从BookController传至CardController

解决方案

要把当前展示的Book对象传递给CardController,最稳妥的方式是传递Book的ID,再在CardController中通过ID从服务层查询完整对象,具体实现如下:

方案一:传递Book ID(推荐)

1. 修改Thymeleaf表单,添加隐藏字段传ID

在现有表单中加入隐藏字段,携带当前Book的ID:

<form th:unless="${#strings.equals(currentUser, 'anonymousUser')}" th:method="POST" th:action="@{/card}">
    <input type="hidden" th:value="${book.id}" name="bookId"/>
    <button id="add-button" class="fw primary" type="submit">Add book to the card.</button>
</form>

2. 在CardController中接收并查询Book

在CardController的POST接口里接收bookId参数,通过服务层查询对应Book对象:

@PostMapping("/card")
public String addToCard(@RequestParam("bookId") Integer bookId) {
    Optional<Book> bookOpt = bookService.findOne(bookId);
    if (bookOpt.isPresent()) {
        Book book = bookOpt.get();
        // 这里编写添加到购物车的逻辑,比如存入session或数据库
        return "redirect:/card";
    }
    return "redirect:/books";
}

方案二:传递Book完整属性(不推荐,适合简单对象)

若不想再次查询数据库,可通过多个隐藏字段传递Book的所有属性,但字段较多时会很繁琐,且存在用户篡改数据的风险:

1. 修改Thymeleaf表单

<form th:unless="${#strings.equals(currentUser, 'anonymousUser')}" th:method="POST" th:action="@{/card}">
    <input type="hidden" th:value="${book.id}" name="id"/>
    <input type="hidden" th:value="${book.title}" name="title"/>
    <input type="hidden" th:value="${book.author}" name="author"/>
    <!-- 按Book类属性依次添加对应隐藏字段 -->
    <button id="add-button" class="fw primary" type="submit">Add book to the card.</button>
</form>

2. 在CardController中接收Book对象

直接通过@ModelAttribute接收封装好的Book对象(需确保Book类有对应getter/setter):

@PostMapping("/card")
public String addToCard(@ModelAttribute Book book) {
    // 编写添加到购物车的逻辑
    return "redirect:/card";
}

注意:方案一通过ID查询能保证数据准确性和安全性,避免前端篡改数据的问题,更推荐使用。

内容的提问来源于stack exchange,提问作者Viktar Nikanenka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:35:15