如何在 Spring 控制器中创建自定义消息/错误消息并在模板​​中显示?

我正在尝试在我的控制器中创建自定义错误消息,然后如果电子邮件已在数据库中找到,则将其传递到 HTML 模板中。

控制器方法确实有效,如果使用重复的电子邮件,它会将用户重定向到“注册表单”,但错误消息未按我的意图显示在网页上。

我基本上希望当用户无法使用该电子邮件注册时在屏幕上显示错误消息。

HTML 形式:

<p th:text="*{errorMessage}"></p>

在控制器中:

    @PostMapping("/process-register")
    private String processRegistrationForm(Model model,WebUser webUser) {
        String email = webUser.getEmail();

        if(webUserRepo.findByEmail(email) == null) {
            webUser.setRole("user");
            WebUser savedWebuser = webUserRepo.save(webUser);
            model.addAttribute("userID",savedWebuser.getUserID());
            String userID = String.valueOf(savedWebuser.getUserID());
            return "redirect:/welcome/" + userID;
        }
        else {
            String errorMessage = "This email address is already registered,please login to your existing account.";
            model.addAttribute(errorMessage);
            return "registration-form";
        }

    }
}
mayu_2010 回答:如何在 Spring 控制器中创建自定义消息/错误消息并在模板​​中显示?

当您的原始请求未缓存时(即是 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());
    }
}

然后,用户界面按预期工作:

获取

GET register

POST 和服务器重定向以记住控制器

POST and redirect

然后用户只需点击:

POST remember

意见是:

<!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

大家都在问