当您的原始请求未缓存时(即是 POST、DELETE、PUT、...操作),您可以使用任何 MVC 流程进行响应,只需确保不要使用 "weird" 的路径 事物(既不是服务器端也不是客户端)。
然后,如果电子邮件存在,则将消息放入模型并重定向到记住密码(或登录...)。
因此,您可以准备将您的 RememberController
从其他控制器中调用解耦内部状态和逻辑:
@Controller
@RequestMapping("/remember")
public class RememberController {
@Getter
@Setter
@AllArgsConstructor
public static class RememberModel {
private String email;
}
// this method decouple the RememberController knowledge (i.e. merge,remove,get messages,... needed by this view)
public String redirect(Model model,String email) {
model.addAttribute("form",new RememberModel(email));
return get(model);
}
@GetMapping
public String get(Model model) {
if (model.getAttribute("form") == null)
model.addAttribute("form",new RememberModel(""));
return "remember";
}
@PostMapping
public String post(@ModelAttribute(name = "form") RememberModel form,Model model) {
model.addAttribute("info","password sent to " + form.getEmail() + "!");
return "remember";
}
}
现在,您的 RegisterController
可以重定向任何必需的信息(即错误消息和用户电子邮件不要重写两次):
@Controller
@RequestMapping("/register")
public class RegisterController {
@Getter
@Setter
@AllArgsConstructor
public static class RegisterModel {
private String email;
}
@Autowired
protected RememberController rememberController;
@GetMapping
public String get(Model model) {
if(model.getAttribute("form") == null)
model.addAttribute("form",new RegisterModel(""));
return "register";
}
@PostMapping
public String post(@ModelAttribute(name = "form") RegisterModel form,Model model) {
// ... when email exists ...
model.addAttribute("error","e-mail `" + form.getEmail() + "` exists!");
return rememberController.redirect(model,form.getEmail());
}
}
然后,用户界面按预期工作:
获取
POST 和服务器重定向以记住控制器
然后用户只需点击:
意见是:
<!doctype html>
<html th:attr="lang=en" xmlns:th="http://www.w3.org/1999/xhtml">
<body>
<h1>REGISTER FORM</h1>
<div style="color: red" th:if="${error != null}" th:text="${error}"></div>
<div style="color: green" th:if="${info != null}" th:text="${info}"></div>
<form method="post" th:object="${form}">
<input th:field="*{email}" type="text"/>
<input type="submit" value="register"/>
</form>
</body>
</html>
和
<!doctype html>
<html th:attr="lang=en" xmlns:th="http://www.w3.org/1999/xhtml">
<body>
<h1>REMEMBER FORM</h1>
<div style="color: red" th:if="${error != null}" th:text="${error}"></div>
<div style="color: green" th:if="${info != null}" th:text="${info}"></div>
<form method="post" th:action="@{/remember}" th:object="${form}">
<input th:field="*{email}" type="text"/>
<input type="submit" value="remember"/>
</form>
</body>
</html>
注意:为了获得更好的用户体验,您可以在使用 window.history.pushState 左右在服务器上重定向记住视图时更改 url。
本文链接:https://www.f2er.com/2125.html