Spring整合Thymeleaf时如何在POST控制器中获取视图producto.nombre参数
解决方案
你的问题由两个错误导致,对应修正方案如下:
1. 前端表单补全提交字段
表单提交仅会携带<input>、<select>、<textarea>这类表单元素的参数,你当前只把producto.nombre渲染到了普通<div>做展示,没有放到表单元素中,所以后端收不到该参数。
需要在表单内新增nombre对应的隐藏输入框,修正后的表单代码参考:
<form th:action="@{/productos/{id}(id=${producto.id})}" method="post"> <input type="hidden" name="pref" th:value="${pref}" id="preferencia"/> <!-- 新增nombre隐藏字段,值和producto.nombre绑定,随表单提交 --> <input type="hidden" name="nombre" th:value="${producto.nombre}"/> <div class="nombreproducto" th:text=${producto.nombre}></div> <div class="precioproducto" th:text="'$'+${producto.precio}"></div> <div class="detallesproducto" th:text=${producto.detalles}></div> <div class="cantidadproducto">Cantidad:<div class="cantidad" th:text=${producto.cantidad}></div></div> <div class="comprar"><button type="submit" id="submit" class="btn btn-warning" onclick="checkout.open()">Comprar</button></div> </form>
提示1:另外注意你原有代码的form标签嵌套存在语法问题,上述修正代码已经调整了标签闭合顺序,避免渲染异常。
提示2:如果后续需要提交precio、cantidad等其他producto字段,按同样规则新增对应name属性匹配的隐藏输入框即可。
2. 修正POST控制器路径映射
你表单的提交地址是/productos/{id},但当前POST控制器绑定的路径是/id,路径不匹配会导致请求根本无法进入该控制器方法。修正后的控制器代码参考:
// 修正路径为和表单action匹配的/productos/{id} @RequestMapping(value="/productos/{id}", method=RequestMethod.POST) // 新增@PathVariable注解获取路径中的id参数,@RequestParam对应表单提交的nombre参数 public String productoPorNombrePOST(@PathVariable Integer id, @RequestParam String nombre, RedirectAttributes redirAttrs, Model model) { String productfromhtml = nombre; // 你的业务逻辑代码 return "producto"; }
可选优化
如果需要提交的producto字段较多,可以直接用实体类接收参数,不需要逐个写@RequestParam:
@RequestMapping(value="/productos/{id}", method=RequestMethod.POST) public String productoPorNombrePOST(@PathVariable Integer id, @ModelAttribute Producto producto, RedirectAttributes redirAttrs, Model model) { String productfromhtml = producto.getNombre(); // 直接从producto对象取所有对应字段即可 return "producto"; }
只需要保证表单中隐藏输入框的name属性和Producto实体类的属性名完全匹配即可自动封装。
内容的提问来源于stack exchange,提问作者Muri
相关产品推荐
相关产品推荐

