В весеннем загрузочном приложении:
Здесь репо:
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