Как исправить ошибку «Exception оценивая выражение SpringEL» после отправки переменной Spring / Thymeleaf - PullRequest
0 голосов
/ 08 апреля 2019

Я использую Spring Boot / Thymeleaf для создания формы, которая принимает адрес электронной почты, перенаправляет на страницу результатов, которая отображает принятое письмо и отправляет его стороннему API (аутентифицированному с помощью Oauth2). У меня проблемы с частью формы, я пытаюсь использовать Thymeleaf, чтобы принять ввод для отображения его на странице result.html. Я получаю сообщение об ошибке при попытке отобразить его на странице результатов, полная ошибка:

[THYMELEAF][http-nio-8080-exec-4] Exception processing template "result.html": Exception evaluating SpringEL expression: "signup.email" (template: "result.html" - line 10, col 4)

Я пытался следовать приведенным здесь примерам: https://spring.io/guides/gs/handling-form-submission/

Я попытался изменить контроллер с @PostMapping и @GetMapping на @RequestMapping и добавить комментарии, описанные в обходном пути, например:

<!--/*@thymesVar id="signup" type="com.mainconfig.controller1"*/-->

Вот код signup.html, содержащий форму:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

<html>
<head>
    <title>My Jmml</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body style="background-color: #2B2B2B">
<br /><br />
<h2 style="text-align:center">Contact Information</h2>
<!-- Input Form -->

<!--/*@thymesVar id="signup" type="com.mainconfig.controller1"*/-->
<form action="#" th:action="@{/signup}" th:object="${signup}" method="post">
    <div align="center">
        <label>Email Address</label><br /><br />
        <!--/*@thymesVar id="email" type="String"*/-->
        <input type="text" th:field="*{email}" placeholder="Email" required />
        <br />
        <br />
        <input class="submitbutton" type='submit' value='Submit'/>
        <br />
    </div>
</form>
</body>
</html>

Страница результатов, на которой должен отображаться адрес электронной почты (result.html):

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Thank you for your submission!</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Thank you for your submission!</h1>

<p th:text="'Email: ' + ${signup.email}" />

<a href="/index">Submit another message</a>
</body>
</html>

Контроллер:

@Controller
public class controller1 {

    @RequestMapping (value = "/home")
    public String home(Model model) {
        return "index.html";
    }

    @RequestMapping(value = "/signup", method= RequestMethod.GET)
    public String signupForm(Model model) {
        model.addAttribute("signup", new emailInput());
        return "signup.html";
    }

    @RequestMapping(value = "/signup", method= RequestMethod.POST)
    public String signupSubmit(@ModelAttribute("email") emailInput email) {
        return "result.html";
    }


}

Ожидаемым выводом должна быть переменная электронной почты, отображаемая на странице результатов после ее сбора в форме регистрации.

Если у вас есть рекомендация о том, как лучше делать то, что я пытаюсь, я открыт для предложений! Я очень новичок в Spring / Thymeleaf, но у меня был опыт работы с Java / Jsp. Спасибо за любую помощь, пожалуйста, дайте мне знать, если вам нужно что-нибудь еще, чтобы помочь!

1 Ответ

0 голосов
/ 10 апреля 2019

Надеюсь, это станет отправной точкой для вас.Убедитесь, что вы поместили html-файлы в / resources / templates.

Я немного изменил ваш регистрационный html и result.html следующим образом, они все еще не идеальны (избегайте использования встроенных стилей и используйте внешнюю таблицу стилей!):

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">

<head>
    <title>My Jmml</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body style="background-color: #2B2B2B">
<br /><br />
<h2 style="text-align:center">Contact Information</h2>
<!-- Input Form -->

<!--/*@thymesVar id="signup" type="com.mainconfig.controller1"*/-->
<form th:action="@{/signup}" th:object="${signup}" method="post">
    <div align="center">
        <label>Email Address</label><br /><br />
        <!--/*@thymesVar id="email" type="String"*/-->
        <input type="text" th:field="*{email}" placeholder="Email" />
        <br />
        <br />
        <input class="submitbutton" type="submit" value="Submit"/>
        <br />
    </div>
</form>
</body>

и результат.html выглядит так

<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
    <title>Thank you for your submission!</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Thank you for your submission!</h1>

<p th:text="'Email: ' + ${email}" />

<a href="/index">Submit another message</a>
</body>
</html>

Я также создал объект формы, добавьте сюда дополнительные поля, если хотите

public class SignUpForm {
    //you can put some annotations here if you want for validating the email
    //for e.g @NotEmpty or a @Pattern(regexp to validate the email)
    private String email;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

и в конце ваш контроллер.Я передаю сообщение электронной почты из запроса на публикацию в файл result.html через атрибут flash:

@Controller
public class Controller1 {

    @RequestMapping(value = "/signup", method= RequestMethod.GET)
    public String signupForm(@ModelAttribute("signup") SignUpForm form) {
        return "/signup";
    }

    @RequestMapping(value = "/signup", method= RequestMethod.POST)
    public String signupSubmit(@ModelAttribute("signup") SignUpForm form, RedirectAttributes redirectAttributes) {
        //validate form first -> check bindingResult documentation

        //do what you need with your form object

        redirectAttributes.addFlashAttribute("email", form.getEmail());
        return "redirect:/result";
    }

    @RequestMapping(value = "/result", method= RequestMethod.GET)
    public String result() {
        return "/result";
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...