Thymeleaf 表单未提交给 Spring 引导控制器
Posted
技术标签:
【中文标题】Thymeleaf 表单未提交给 Spring 引导控制器【英文标题】:Thymeleaf form not submitting to Spring boot controller 【发布时间】:2021-01-07 10:15:40 【问题描述】:我正在尝试向 Spring 引导控制器提交表单 这是百里香部分:
<form th:action="@/change_password" method="post">
<div class="row">
<div class="col-md-9 register-right">
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
<h3 class="register-heading">Change password</h3>
<div class="row register-form">
<div class="col-md-6">
<div class="form-group">
<input type="email" th:name="email" id="email" class="form-control" placeholder="Email *" >
<span th:if="$notPresent" class="alert alert-info" style="color:red; width: 100% !important; border: none; background-color: transparent !important;">This email does not exist!</span>
</div>
<div class="form-group">
<input type="password" th:name="password" id="password" class="form-control" placeholder="Password *" >
</div>
<div class="form-group">
<input type="password" th:name="confirmPassword" id="confirmPassword" class="form-control" placeholder="Confirm *" >
</div>
</div>
<div class="col-md-6">
<input type="submit" class="btnRegister" style="background-color: #ffa600 !important;" value="Change"/>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
这是 Spring boot 控制器方法:
@PostMapping("/change_password")
public String changeUserPassword(HttpServletRequest request, Model model)
String path = "";
User u = userService.findByEmail(request.getParameter("email"));
if(u == null || u.getActive() == 0)
model.addAttribute("notPresent", true);
path = "redirect:/forgot_password";
else
u.setPassword(bCryptPasswordEncoder.encode(request.getParameter("password")));
userService.updateUser(u);
sendEmail(u.getEmail(), u.getFirstname());
path = "redirect:/login";
return path;
我没有收到任何错误,所以我不确定出了什么问题。
【问题讨论】:
调用是否到达控制器方法?控制器类级别是否定义了任何 RequestMapping? 不,调用没有到达控制器方法。 RequestMapping 定义为 "@PostMapping("/change_password")" 我的意思是如果在类级别上总体定义了任何 RequestMapping。在这种情况下,它还必须附加在表单 URL 中。无论如何,我尝试了您的 html 和控制器代码并调用到达控制器。如果尝试了任何 URL,请确保检查浏览器的“网络”选项卡。 不,没有整体的 RequestMapping。我会尝试看看是否还有其他问题。谢谢! 【参考方案1】:要提交表单,您可以使用对象 userPassword 在 Class 中定义,如下所示:
package ....
imports ....
@Data @AllArgsConstructor @NoArgsConstructor @ToString
public class UserPassword
private Integer id;
private String password;
... other fields you need
您将此对象添加到显示页面的控制器中:
model.addAttribute("UserPassword", userPassword);
然后你将这个对象添加到你的表单中:
<form th:action="@/change_password" th:object="$userPassword" method="post">
你需要在你的html页面中将数据绑定到这个对象(这里我将userPassword中的password绑定到输入标签):
<input type="password" th:field="*password" class="form-control" placeholder="Password *" >
Finnaly 我在控制器中检索对象:
@PostMapping("/change_password")
public String changeUserPassword(Model model, @ModelAttribute UserPassword userPassword)
.....
您可以在https://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html 找到第 7 部分的完整教程
【讨论】:
是的,这行得通。就我而言,我不想创建一个新的对象类,这就是我没有尝试这个的原因。无论如何,问题是我没有在安全配置中将该方法定义为可访问的。我将此标记为有效答案,以防以后有人需要。以上是关于Thymeleaf 表单未提交给 Spring 引导控制器的主要内容,如果未能解决你的问题,请参考以下文章
Thymeleaf视图不会将实体ID传递给Spring @Controller,而是将其与其他属性一起传递
Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息