如何通过ThymeLeaf与SpringBoot实现对象的POST提交?
当然可以!用Thymeleaf + Spring Boot POST对象的正确姿势
你的思路完全没问题,只是视图层的表单绑定写法有错误,导致无法正确传递Part对象。下面我帮你修正代码,并解释关键要点:
一、先修正控制器代码(小优化)
你的控制器逻辑基本正确,我用更简洁的注解做了优化,同时补充了显示表单的GET方法(这是表单绑定的必要前置步骤):
@Controller @RequestMapping("/basket") public class BasketController { // 用@PostMapping替代@RequestMapping(method = RequestMethod.POST),更简洁清晰 @PostMapping("/add") public ModelAndView addToBasket(@ModelAttribute("part") Part part) { // 这里可以添加你的业务逻辑,比如把part加入购物篮 // basketService.addPartToBasket(part); ModelAndView mv = new ModelAndView("basket/viewBasket"); // 可选:把购物篮数据传到视图展示 // mv.addObject("basketItems", basketService.getBasketItems()); return mv; } // 必须添加这个GET方法:提前往Model中传入空的Part对象,供Thymeleaf表单绑定使用 @GetMapping("/add-form") public String showAddPartForm(Model model) { model.addAttribute("part", new Part()); // 传入空对象,否则表单绑定会报错 return "basket/addPartForm"; } }
二、修正视图表单代码
你之前的视图错误在于:th:object只能用在<form>标签上,且输入框没有绑定Part的具体属性。假设Part类有id、name、price这几个属性,正确的表单写法如下:
<form method="POST" th:action="@{/basket/add}" th:object="${part}"> <!-- 绑定Part的id属性 --> <div class="form-group"> <label th:text="#{part.id}">零件ID</label> <input type="text" th:field="*{id}" class="form-control"/> </div> <!-- 绑定Part的name属性 --> <div class="form-group"> <label th:text="#{part.name}">零件名称</label> <input type="text" th:field="*{name}" class="form-control"/> </div> <!-- 绑定Part的price属性 --> <div class="form-group"> <label th:text="#{part.price}">零件价格</label> <input type="number" th:field="*{price}" class="form-control" step="0.01"/> </div> <input type="submit" class="btn btn-warning btn-block" th:value="#{basket.add}"/> </form>
三、关键注意事项
- 表单绑定核心规则:
th:object="${part}"只需要在<form>标签上声明一次,指定表单要绑定的对象;- 内部输入框用
th:field="*{属性名}"绑定对象的具体属性,*{}表示引用form上th:object指定的对象。
- Part类的要求:
必须有无参构造器,且所有需要绑定的属性都要有对应的getter和setter方法——Spring需要通过这些方法来完成参数到对象的封装。 - 复杂属性绑定:
如果Part包含关联对象(比如Category),可以用嵌套写法绑定,比如th:field="*{category.name}"(前提是Category类也有对应的getter/setter)。
内容的提问来源于stack exchange,提问作者howells699
相关产品推荐
相关产品推荐

