DennisKingsman
@DennisKingsman
Студент

Как в thymeleaf дублировать поле для сравнения?

здравствуйте, у меня есть форма регистрации
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Register</title>
</head>
<body>
<!-- Include _menu.html -->
<th:block th:include="/_menu"></th:block>
<h1>Create a Person:</h1>
<form th:action="@{/register}"
      th:object="${personForm}" method="POST">
    Login:
    <input type="text" th:field="*{name}" />
    <br/>
    Email:
    <input type="text" th:field="*{email}" />
    <br/>
    Password:
    <input type="text" th:field="*{password}">
    <br/>
    Confirm password:
    <input type="text" th:field="*{doublePassword}">
    <input type="submit" value="Create" />
</form>
</body>
</html>


в которой есть поле пароля и форма для его повтора, для того чтобы это обработать мне пришлось создать отдельный класс UserForm потому как сам User не имел в себе поля для второго пароля и являлся сущностью для хибернейта(тоесть если бы я добавил поле туда , то хибернейт создал бы ненужную мне колонку)

вот мой контроллер тут по методу гет я к запросу мапю страничку и говорю что вот форма будет твоим атрибутом и ее поля ты будешь заполнять(юзера туда запихнуть не могу так как у него опять таки нет поля дубль пароля) далее проверяю совпадение паролей и наличие пользователя в бд во время пост запроса
@RequestMapping(value = { "/register" }, method = RequestMethod.GET)
    public String showAddPersonPage(Model model) {

        UserForm personForm = new UserForm();
        model.addAttribute("personForm", personForm);

        return "register";
    }

    @RequestMapping(value = {"/register"} , method = RequestMethod.POST)
    public String savePerson(Model model, @ModelAttribute("personForm") UserForm personForm) {

        if(personForm.checkPassword() &&
                userRepository.findByEmail(personForm.getEmail()) == null &&
                userRepository.findByName(personForm.getName()) == null) {

            AppUser user = new AppUser(personForm.getName(),
                    personForm.getEmail(),
                    personForm.getPassword());

            user.setEnabled(true);
            user.setRoles(Collections.singleton(Role.USER));
            userRepository.save(user);
            return "home";
         }

        return "register";
    }


вопрос в том можно ли как то сделать это не создавая UserForm внутри самого html файла на thymeleaf или же в контроллере ? Заранее спасибо
  • Вопрос задан
  • 412 просмотров
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Здравствуйте!
Вы сильно заморочились, если честно... тут даже Spring ни причем, а больше базовые знания html + js
Вот, ваша форма:
<form th:action="@{/register}"
      th:object="${personForm}" method="POST">
    Login:
    <input type="text" th:field="*{name}" />
    <br/>
    Email:
    <input type="text" th:field="*{email}" />
    <br/>
    Password:
    <input type="text" th:field="*{password}">
    <br/>
    Confirm password:
    <input type="text" th:field="*{doublePassword}">
    <input type="submit" value="Create" />
</form>


1) небольшой совет используйте специфические инпуты. Например, если вам нужно поле майл, то используйте майл и т.д.
Соответственно:
<form th:action="@{/register}"
      th:object="${personForm}" method="POST">
    Login:
    <input type="text" th:field="*{name}" />
    <br/>
    Email:
    <input type="email" th:field="*{email}" />
    <br/>
    Password:
    <input type="password" th:field="*{password}">
    <br/>
    Confirm password:
    <input type="password">
    <input type="submit" value="Create" />
</form>

2) Определитесь с тем, где именно вы хотите валидировать совпадение пароля на клиенте или на сервере. Как по мне, на клиенте лучше, чтобы лищний раз не нагружать сервер.
Если на клиенте, то средствами js, если на сервере, то средствами java. Рассмотрим оба варианта:
- На сервере. Получаете оба пароля из формы, сравниваете через equals() и возвращаете нужный результат. Если пароль неверен, то можете добавить сообщение через model.addAttribute() и вывести в шаблоне
@RequestMapping(value = {"/register"} , method = RequestMethod.POST)
public String savePerson(Model model, @ModelAttribute("personForm") UserForm personForm) {


	if(!personForm.getPassword.equals(personForm.getPasswordConfirmation)) {
		model.addAttribute("passwordIncorrect", "Вы ввели некорректный пароль");
		return "register";
	}

    if(personForm.checkPassword() &&
            userRepository.findByEmail(personForm.getEmail()) == null &&
            userRepository.findByName(personForm.getName()) == null) {

        AppUser user = new AppUser(personForm.getName(),
                personForm.getEmail(),
                personForm.getPassword());

        user.setEnabled(true);
        user.setRoles(Collections.singleton(Role.USER));
        userRepository.save(user);
        return "home";
     }

    return "register";
}


- Обработка на клиенте средствами js. Идея заключается в том, что вы деактивируете кнопку "Регистрация" и только если пароли совпадают, то активируете кнопку.

Тут материалов хватает. Наберите в гугл jquery password validation.
Вот, пример:
Скрипт - https://www.jqueryscript.net/form/Password-Strengt...
Демо - https://www.jqueryscript.net/demo/Password-Strengt...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы