Spring Boot CRUD приложение с Thymeleaf

1. Общ преглед

Внедряването на DAO слоеве, които предоставят CRUD функционалност на JPA обекти, може да бъде повтаряща се, отнемаща време задача, която искаме да избегнем в повечето случаи. За щастие Spring Boot улеснява създаването на CRUD приложения чрез слой от стандартни базирани на JPA CRUD хранилища.

В този урок ще научим как да разработим CRUD уеб приложение с Spring Boot и Thymeleaf .

2. Зависимостите на Maven

В този случай ще разчитаме на spring-boot-starter-parent за лесно управление на зависимостите, създаване на версии и конфигуриране на приставки. В резултат на това няма да е необходимо да посочваме версиите на проектните зависимости в нашия файл pom.xml , с изключение на заменянето на версията на Java:

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE    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, което е Hibernate, в този случай ще може да извършва CRUD операции върху обектите на домейна. За уводно ръководство за Hibernate, посетете нашия урок за Hibernate 5 с Spring.

В допълнение сме ограничили полетата за име и имейл с ограничението @NotBlank . Това предполага, че можем да използваме Hibernate Validator за валидиране на ограничените полета, преди да продължим или актуализираме обект в базата данни.

За основите на това, вижте нашия урок за проверка на Bean.

4. Слоят на хранилището

На този етап нашето примерно уеб приложение не прави нищо. Но това е на път да се промени.

Spring Data JPA ни позволява да внедрим базирани на JPA хранилища (изискано име за изпълнението на DAO образец) с минимален шум .

Spring Data JPA е ключов компонент на spring-boot-starter-data-jpa на Spring Boot, който улеснява добавянето на CRUD функционалност чрез мощен слой абстракция, поставен върху JPA изпълнение. Този слой на абстракция ни позволява да осъществим достъп до слоя за устойчивост, без да се налага да предоставяме собствени DAO реализации от нулата.

За да предоставим на нашето приложение основна CRUD функционалност на потребителски обекти, всичко, което трябва да направим, е да разширим интерфейса CrudRepository :

@Repository public interface UserRepository extends CrudRepository {}

И това е! Чрез просто разширяване на интерфейса CrudRepository , Spring Data JPA ще предостави внедрения за CRUD методите на хранилището за нас.

5. Слоят на контролера

Благодарение на слоя абстракция, който spring-boot-starter-data-jpa поставя върху основната реализация на JPA, можем лесно да добавим някои CRUD функционалности към нашето уеб приложение чрез основно уеб ниво .

В нашия случай, един клас на контролер ще бъде достатъчен за обработка на GET и POST HTTP заявки и след това ги съпоставя с повиквания към нашата реализация на UserRepository .

Класът контролер разчита на някои от основните характеристики на Spring MVC. За подробно ръководство за Spring MVC, вижте нашия урок за MVC Spring.

Нека започнем с методите showSignUpForm () и addUser () на контролера .

Първият ще покаже потребителския формуляр за регистрация, докато вторият ще запази нов обект в базата данни след валидиране на ограничените полета.

Ако обектът не премине проверката, формулярът за регистрация ще се покаже отново. В противен случай, след като обектът бъде запазен, списъкът на запазените обекти ще бъде актуализиран в съответния изглед:

@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 адреса / index :

@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"; } 

И накрая, имаме методите updateUser () и deleteUser () в класа 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 / resources / templates трябва да създадем HTML шаблоните, необходими за показване на формата за регистрация, формуляра за актуализация и изобразяването на списъка с постоянни потребителски обекти,

Както е посочено във въведението, ще използваме Thymeleaf като основния механизъм за шаблони за синтактичен анализ на файловете с шаблони.

Ето съответния раздел на файла add-user.html :

 Name   Email    

Забележете как използвахме израза на URL адрес {@ / adduser}, за да определим атрибута за действие на формуляра и изразите на променливата $ {} за вграждане на динамично съдържание в шаблона, като например стойностите на полетата за име и имейл и след валидирането грешки .

Подобно на add-user.html , ето как изглежда шаблонът update-user.html :

 Name   Email    

И накрая, имаме файл index.html, който показва списъка на постоянните обекти заедно с връзките за редактиране и премахване на съществуващи:

No users yet!

Users

Name Email Edit Delete
Edit Delete

Add a new user

За по-голяма простота, шаблоните изглеждат доста скелетни и осигуряват само необходимата функционалност, без да добавят ненужна козметика.

За да придадем на шаблоните подобрен, привличащ вниманието външен вид, без да отделяме прекалено много време за HTML / CSS, можем лесно да използваме безплатен комплект за потребителски интерфейс на Twitter Bootstrap, като Shards.

7. Стартиране на приложението

И накрая, нека дефинираме входната точка на приложението. Както повечето приложения на Spring Boot, можем да направим това с обикновен стар метод main () :

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

Сега, нека натиснем „Run“ в нашата IDE, след това отворете браузъра си и го насочете към // localhost: 8080 .

Ако компилацията е компилирана успешно, трябва да видим основно табло за управление на потребителите на CRUD с връзки за добавяне на нови обекти и за редактиране и премахване на съществуващи.

8. Заключение

В този урок научихме как да изградим основно CRUD уеб приложение с Spring Boot и Thymeleaf.

Както обикновено, всички примерни кодове, показани в статията, са достъпни в GitHub.