如何通过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
相关产品推荐
相关产品推荐

