Автор оригинала: Alejandro Ugarte.
1. Обзор
Реализация DAO слоев, которые обеспечивают функциональность CRUD для JPA сущностей, может быть повторяющейся, трудоемкой задачей, которой мы хотим избежать в большинстве случаев. К счастью, Spring Boot упрощает создание CRUD-приложений с помощью уровня стандартных репозиториев CRUD на основе JPA.
В этом уроке мы узнаем, как разработать веб-приложение CRUD с помощью Spring Boot и Thymeleaf .
Дальнейшее чтение:
Параметры запроса пружины с помощью Thymeleaf
Изменение каталога шаблонов Thymeleaf в весенней загрузке
2. Зависимости Maven
В этом случае мы будем полагаться на spring-boot-starter-parent для простого управления зависимостями, управления версиями и настройки подключаемых модулей. В результате нам не нужно будет указывать версии зависимостей проекта в вашем pom.xml файл, за исключением переопределения версии Java:
org.springframework.boot spring-boot-starter-parent 2.4.0 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-data-jpa com.h2database h2
3. Доменный Уровень
Поскольку все зависимости проекта уже установлены, давайте теперь реализуем наивный доменный уровень.
Для простоты этот слой будет включать один единственный класс, который будет отвечать за моделирование Пользователей сущностей:
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @NotBlank(message = "Name is mandatory") private String name; @NotBlank(message = "Email is mandatory") private String email; // standard constructors / setters / getters / toString }
Давайте иметь в виду, что мы аннотировали класс аннотацией @Entity . Следовательно, реализация JPA, которая находится в спящем режиме, в в этом случае сможет выполнять операции CRUD над объектами домена. Для получения вводного руководства по гибернации посетите наш учебник по Гибернации 5 с помощью Spring .
Кроме того, мы ограничили поля имя и адрес электронной почты ограничением @NotBlank . Это означает, что мы можем использовать валидатор Hibernate для проверки ограниченных полей перед сохранением или обновлением сущности в базе данных.
Для получения основных сведений об этом ознакомьтесь с нашим соответствующим руководством по проверке компонентов .
4. Уровень Хранилища
На данный момент наш образец веб-приложения ничего не делает. Но это скоро изменится.
Spring Data JPA позволяет нам реализовывать репозитории на основе JPA (причудливое название для реализации шаблона DAO) с минимальной суетой .
Spring Data JPA является ключевым компонентом Spring Boot spring-boot-starter-data-jpa , который позволяет легко добавлять функциональность CRUD с помощью мощного уровня абстракции, размещенного поверх реализации JPA. Этот уровень абстракции позволяет нам получить доступ к уровню сохраняемости без необходимости предоставлять наши собственные реализации DAO с нуля.
Чтобы предоставить нашему приложению базовую функциональность CRUD для Пользовательских объектов, все, что нам нужно сделать, это расширить интерфейс CrudRepository :
@Repository public interface UserRepository extends CrudRepository{}
И это все! Просто расширив интерфейс CrudRepository , Spring Data JPA предоставит нам реализацию методов CRUD репозитория.
5. Уровень Контроллера
Благодаря уровню абстракции, который spring-boot-starter-data-jpa помещает поверх базовой реализации JPA, мы можем легко добавить некоторые функции CRUD в наше веб-приложение через базовый веб-уровень .
В нашем случае одного класса контроллера будет достаточно для обработки HTTP-запросов GET и POST, а затем сопоставить их с вызовами нашей реализации UserRepository .
Класс контроллера опирается на некоторые ключевые функции Spring MVC. Для получения подробного руководства по Spring MVC ознакомьтесь с нашим учебником по Spring MVC .
Давайте начнем с методов контроллера showSignUpForm() и добавить пользователя () .
Первый отобразит форму регистрации пользователя, в то время как второй сохранит новую сущность в базе данных после проверки ограниченных полей.
Если объект не пройдет проверку, форма регистрации будет отображена повторно. В противном случае, как только объект будет сохранен, список сохраненных объектов будет обновлен в соответствующем представлении:
@Controller public class UserController { @GetMapping("/signup") public String showSignUpForm(User user) { return "add-user"; } @PostMapping("/adduser") public String addUser(@Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { return "add-user"; } userRepository.save(user); return "redirect:/index"; } // additional CRUD methods }
Нам также понадобится сопоставление для /индекса URL:
@GetMapping("/index") public String showUserList(Model model) { model.addAttribute("users", userRepository.findAll()); return "index"; }
В UserController у нас также будет метод showUpdateForm () , который отвечает за извлечение Пользователя сущности, соответствующей предоставленному идентификатору из базы данных.
Если сущность существует, она будет передана в качестве атрибута модели в представление формы обновления, следовательно, форма может быть заполнена значениями полей имя и электронная почта :
@GetMapping("/edit/{id}") public String showUpdateForm(@PathVariable("id") long id, Model model) { User user = userRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id)); model.addAttribute("user", user); return "update-user"; }
Наконец, у нас есть методы update User() и delete User() в классе UserController .
Первый сохранит обновленную сущность в базе данных, в то время как последний удалит данную сущность.
В любом случае список сохраняемых объектов будет соответствующим образом обновлен:
@PostMapping("/update/{id}") public String updateUser(@PathVariable("id") long id, @Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { user.setId(id); return "update-user"; } userRepository.save(user); return "redirect:/index"; } @GetMapping("/delete/{id}") public String deleteUser(@PathVariable("id") long id, Model model) { User user = userRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id)); userRepository.delete(user); return "redirect:/index"; }
6. Слой Представления
На данный момент мы реализовали класс функционального контроллера, который выполняет операции CRUD над Пользователями сущностями. Даже в этом случае в этой схеме все еще отсутствует компонент: слой представления.
В папке src/main/ресурсы/шаблоны нам нужно создать HTML-шаблоны, необходимые для отображения формы регистрации, формы обновления и отображения списка сохраняемых Пользователей сущностей,
Как указано во введении, мы будем использовать Thymeleaf в качестве базового механизма шаблонов для анализа файлов шаблонов.
Вот соответствующий раздел add-user.html файл:
Обратите внимание, как мы использовали выражение @{/adduser} URL для указания атрибута действия формы и выражения ${} переменных для встраивания динамического содержимого в шаблон, например значений полей имя и электронная почта и ошибок после проверки .
Похоже на add-user.html , вот как update-user.html внешний вид шаблона:
Наконец, у нас есть index.html файл, в котором отображается список сохраненных объектов вместе со ссылками для редактирования и удаления существующих:
Для простоты шаблоны выглядят довольно скелетно и обеспечивают только необходимую функциональность без добавления ненужной косметики .
Чтобы придать шаблонам улучшенный, привлекательный вид, не тратя слишком много времени на HTML/CSS, мы можем легко использовать бесплатный загрузочный набор пользовательского интерфейса Twitter, например Shards .
7. Запуск приложения
Наконец, давайте определим точку входа приложения. Как и большинство приложений Spring Boot, мы можем сделать это с помощью простого старого метода main() :
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Теперь давайте нажмем “Выполнить” в вашей среде разработки, затем откроем ваш браузер и направим его на http://localhost:8080 .
Если сборка успешно скомпилирована мы должны увидеть базовую панель управления пользователями CRUD со ссылками для добавления новых объектов, а также для редактирования и удаления существующих.
8. Заключение
В этом уроке мы узнали, как создать базовое веб-приложение CRUD с помощью Spring Boot и Thymeleaf.
Как обычно, все примеры кода, показанные в статье, доступны через на GitHub .