如何在Spring MVC控制器中获取Thymeleaf th:value字段的数据?
问题原因分析
你之所以用@RequestParam拿不到th:value里的内容,核心原因是你的<input>标签缺少name属性。HTTP表单提交参数时,是通过元素的name属性来标识参数名的——没有name的话,浏览器在提交表单时根本不会把这个字段的值发送到后端,Spring MVC自然找不到对应的personId参数。
简单解决方案(无需绑定对象)
下面几种方案都能满足你“单字段处理、不绑定完整对象”的需求,而且完全不影响表单后续绑定其他对象:
方案1:给input添加name属性(最直接)
直接给<input>加上name属性,和th:value配合使用即可:
<form action="form1" method="post"> <!-- 添加name="personId" --> <input type="text" name="personId" th:value="${personId}"/> <input type="submit" name="btnSubmit" value="Submit"> </form>
后端的控制器代码不需要修改,@RequestParam("personId")就能正常获取到值了:
@RequestMapping(value="/form1", params = "btnSubmit", method = RequestMethod.POST) public String formMethod (@RequestParam("personId") int personId) { // 这里可以正常使用personId return ""; }
方案2:用Thymeleaf的th:name属性(更贴合Thymeleaf写法)
如果你习惯用Thymeleaf的命名空间属性,也可以用th:name代替原生name,效果完全一样:
<input type="text" th:name="personId" th:value="${personId}"/>
方案3:如果字段不需要用户修改,用隐藏域
如果这个personId是不需要用户编辑的固定值,可以改成隐藏输入框,避免用户误修改,同时依然能提交参数:
<input type="hidden" name="personId" th:value="${personId}"/>
补充说明
这些方案都不需要你创建实体类、使用th:object或@ModelAttribute,完全是单字段的独立处理方式。后续如果需要给表单绑定其他对象,只需要给对应字段添加th:field即可,和这个单字段的处理不会冲突。
内容的提问来源于stack exchange,提问作者jkfe
相关产品推荐
相关产品推荐

