Как Spring Boot понимает, какой именно пользовательский объект необходим для отображения полей из html? - PullRequest
0 голосов
/ 25 января 2020

В весеннем загрузочном приложении:

Здесь репо:

import org.springframework.data.repository.CrudRepository;
import myproject.eshop.model.User;

// Use JPQL
public interface UserRepository extends CrudRepository<User, Long> {

    User findByUsername(String username);
}

Здесь контроллер:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import myproject.eshop.model.Role;
import myproject.eshop.model.User;
import myproject.eshop.repo.UserRepository;

import java.util.Collections;
@Controller
public class RegistrationController {
    @Autowired
    private UserRepository userRepository;


    @GetMapping("/registration.html")
    public String registration(Model model) {
        logger.info("open_registration.html");
        model.addAttribute("appName", appName);
        return "registration.html";
    }

    @PostMapping("/registration.html")
    public String registartionNewUser(User user, Model model, @RequestParam(name = "retypePassword", required = true) String retypePassword) {
        logger.info("retypePassword = " + retypePassword + ", user = " + user);
        if (user.getUsername().trim().isEmpty()
                || user.getPassword().trim().isEmpty()
        ) {
            model.addAttribute("registrationError", "Аll fields are required!");
            return "registration.html";
        }
        user.setActive(true);
        user.setRoles(Collections.singleton(Role.USER));
        User userFromDb = userRepository.findByUsername(user.getUsername());
        if (userFromDb != null) {
            model.addAttribute("registrationError", "User already exist!");
            return "registration.html";
        }
        userRepository.save(user);

        return "redirect:/login.html";
    }
}

здесь шаблон:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title th:text="${appName}">Template title</title>
    <link th:href="@{/public/style.css}" rel="stylesheet"/>
</head>
<body>
<div id="container">
    <h2 align="center">Registration new user</h2>
    <form th:action="@{/registration.html}" method="post">
        <label for="username">Username</label>
        <input type="text" id="username" name="username" autofocus="autofocus"/>
        <label for="password">Password</label>
        <input type="password" id="password" name="password"/>
        <label for="retypePassword">Retype password</label>
        <input type="password" id="retypePassword" name="retypePassword"/>
        <input id="submit" type="submit" value="Registration"/>
    </form>
    <p th:if="${registrationError}" th:text="${registrationError}" class="error"></p>
</div>
</body>
</html>

Здесь мой пользовательский объект User:

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.Set;

@Entity
@Table(name = "usr") // PostgreSQL not work with table "user"
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @NotNull
    private String username;
    @NotNull
    private String password;
    @NotNull
    private boolean active;
    @NotNull
    @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
    @CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"))
    @Enumerated(EnumType.STRING)
    private Set<Role> roles;

При открытии registration.html заполнить все поля и нажать кнопку submit , затем вызвать метод registartionNewUser

И param user правильно заполнено (из формы registration.html). Как форма Spring Boot связывает registration.html с моим объектом клиента User?

В registration.html нет ссылки на мой объект клиента User

Ответы [ 2 ]

1 голос
/ 25 января 2020

По сути, вы реализовали hibernate или jpa в бэкэнде, который обрабатывает эти вещи для вас.

Обратите внимание, что имена столбцов совпадают с именами, которые вы передаете html.

Чтобы они приняли запрошенный объект, получили индивидуальную переменную и создали пустой объект класса User и поместили его в соответствие exect в классе сущности User и таким образом создали объект User.

Для перекрестной проверки измените его в капитал или что-то в этом роде ошибка 400.

Этот процесс не так прост, как мы обсуждаем. Вы изменяете это по-своему, используя аннотации библиотеки javax.

Для более подробной информации, эта ссылка, https://howtodoinjava.com/hibernate-tutorials/

0 голосов
/ 25 января 2020

Вы пытались использовать аннотацию @ModelAttribute, которая сопоставит ваш пользовательский объект User с атрибутом модели, а затем отобразит его в веб-представлении.

 <form th:action="@{/registration.html}" modelAttribute= "user" method="post">
    <label for="username">Username</label>
    <input type="text" id="username" name="username" path = "username"  
        autofocus="autofocus"/>
    <label for="password">Password</label>
    <input type="password" id="password" name="password" path = "password"/>
    <label for="retypePassword">Retype password</label>
    <input type="password" id="retypePassword" name="retypePassword"/>
    <input id="submit" type="submit" value="Registration"/>
</form>

И затем вы свяжете его в контроллере класс:

 @GetMapping( "/registration.html")
public String registration( @ModelAttribute("user") User user, Model model) {
    logger.info("open_registration.html");
    model.addAttribute("appName", appName);
    return "registration.html";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...