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 认证失败返回错误信息

Spring Boot thymeleaf 错误请求 400 而不是显示用户错误

Thymeleaf 表单使用 ArrayList 对象提交

Thymeleaf:点击表格行提交表单

Thymeleaf/Spring - 将项目从组合框添加到表中