在Spring启动应用程序中无法从简单表单用户输入获取值?



我正在尝试在Spring启动应用程序中实现登录表单。它有一个电子邮件和密码字段。email字段无法获得用户输入,表单如下:

<form th:action="@{/login}" method="get" th:object="${loginForm}" style="max-width: 600px; margin: 0 auto;">
<div class="m-3">
<div class="form-group row">
<label class="col-4 col-form-label">E-mail: </label>
<div class="col-8">
<input type="text" th:field="*{email}" name="q" class="form-control" required />
</div>
</div>
<div class="form-group row">
<label class="col-4 col-form-label">Password: </label>
<div class="col-8">
<input type="password" th:field="*{password}" class="form-control" required/>
</div>
</div>
<div>
<button type="submit" class="btn btn-primary">Log in</button>
</div>
</div>
</form>

这是控制器:

@GetMapping("login")
public ModelAndView login(Model model, @RequestParam(name = "q", required = false) Optional<String> email) {
Optional<UserDto> aUser;
System.out.println(email);
if (email.isPresent()) {
aUser = userService.getAUserByEmail(email.get());
model.addAttribute("user", aUser);
var mv = new ModelAndView("user/user-list", model.asMap());
return mv;
} else {
model.addAttribute("loginForm", new LoginForm());
return new ModelAndView("/login/login-form", model.asMap());
}
}

我认为html中的@RequestParam(name = "q")name="q"可以完成这项工作,但我总是得到Optional.empty用于电子邮件。知道这是怎么回事吗?

更新:从答案中,我将控制器更改为:

@GetMapping("login")
public ModelAndView login(Model model, LoginForm loginForm) {
Optional<UserDto> aUser;
if (loginForm.getEmail() != null) {
aUser = userService.getAUserByEmail(loginForm.getEmail());
model.addAttribute("user", aUser);
var mv = new ModelAndView("user/user-list", model.asMap());
return mv;
} else {
model.addAttribute("loginForm", new LoginForm());
return new ModelAndView("/login/login-form", model.asMap());
}
}

login-form.htmlto this:

<form th:action="@{/login}" method="get" th:object="${loginForm}" style="max-width: 600px; margin: 0 auto;">
<div class="m-3">
<div class="form-group row">
<label class="col-4 col-form-label">E-mail: </label>
<div class="col-8">
<input type="text" th:field="*{email}" class="form-control" required />
</div>
</div>
<div class="form-group row">
<label class="col-4 col-form-label">Password: </label>
<div class="col-8">
<input type="password" th:field="*{password}" class="form-control" required/>
</div>
</div>
<div>
<button type="submit" class="btn btn-primary">Log in</button>
</div>
</div>
</form>

我也有这样的LoginForm.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginForm {
private String email;
private String password;
}

但仍然没有得到用户的电子邮件字段输入?

您设置表单的方式,它将您的电子邮件输入字段的值映射到一个名为loginForm(这就是th:object="${loginForm}"的意思)的对象的属性email(这就是th:field="*{email}"的意思)。这两种方法似乎都没有在您的login()方法中使用或甚至存在。你需要改变你在控制器中使用的内容以匹配你在Thymeleaf模板中的内容,或者改变你的Thymeleaf模板以实际引用你在控制器中使用的内容。

您的代码中的问题位于th:object="${loginForm}"

这样你可以通知spring将表单发送的数据绑定到一个名为loginForm的对象。

所以Spring期望控制器是

@GetMapping("login")
public ModelAndView login(Model model, LoginForm loginForm) {
....

LoginForm内部名为email的字段将包含从表单发送的值,正如您在<input type="text" th:field="*{email}" .... >

中声明的那样如果你不想让数据被绑定到Spring Mvc中的对象中,那么

  1. 删除th:object="${loginForm}"

  2. 使用
  3. <input type="text" th:name="q" class="form-control" required />
    

    ,然后控制器将接收发送的值作为查询参数

    @GetMapping("login")
    public ModelAndView login(Model model, @RequestParam(name = 
    "q", required = false) Optional<String> email) {
    

相关内容

  • 没有找到相关文章

最新更新