我正在尝试在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.html
to 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中的对象中,那么
删除
th:object="${loginForm}"
使用<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) {