Spring Boot CRUD-applikation med Thymeleaf

1. Oversigt

Implementeringen af ​​DAO-lag, der leverer CRUD-funktionalitet på JPA-enheder, kan være en gentagen, tidskrævende opgave, som vi i de fleste tilfælde vil undgå. Heldigvis gør Spring Boot det let at oprette CRUD-applikationer gennem et lag af standard JPA-baserede CRUD-arkiver.

I denne vejledning lærer vi, hvordan man udvikler en CRUD-webapplikation med Spring Boot og Thymeleaf.

2. Maven-afhængighederne

I dette tilfælde stoler vi på spring-boot-starter-parent for enkel afhængighedsstyring, versioning og plug-in-konfiguration. Som et resultat behøver vi ikke angive versionerne af projektafhængighederne i vores pom.xml fil undtagen at tilsidesætte Java-versionen:

 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. Domænelaget

Med alle de projektafhængigheder, der allerede er på plads, lad os nu implementere et naivt domænelag.

For enkelhedens skyld inkluderer dette lag en enkelt klasse, som er ansvarlig for modellering Bruger enheder:

@Entity offentlig klasse bruger {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat lang id; @NotBlank (message = "Navn er obligatorisk") privat strengnavn; @NotBlank (message = "E-mail er obligatorisk") privat E-mail med streng; // standardkonstruktører / settere / getters / toString}

Lad os huske på, at vi har kommenteret klassen med @Enhed kommentar. Derfor implementeres JPA, som er i dvale, i i dette tilfælde vil være i stand til at udføre CRUD-operationer på domæneenhederne. For en introduktionsvejledning til dvale, besøg vores vejledning om dvale 5 med foråret.

Derudover har vi begrænset navn og e-mail felter med @NotBlank begrænsning. Dette indebærer, at vi kan bruge Hibernate Validator til at validere de begrænsede felter, før vi fortsætter eller opdaterer en enhed i databasen.

For det grundlæggende om dette, se vores tilhørende tutorial om Bean Validation.

4. Lagringslaget

På dette tidspunkt gør vores eksempler på webapplikation intet. Men det er ved at ændre sig.

Spring Data JPA giver os mulighed for at implementere JPA-baserede arkiver (et fancy navn til implementering af DAO-mønster) med minimalt besvær.

Spring Data JPA er en nøglekomponent i Spring Boot's spring-boot-starter-data-jpa det gør det let at tilføje CRUD-funktionalitet gennem et kraftigt lag af abstraktion placeret oven på en JPA-implementering. Dette abstraktionslag giver os adgang til persistenslaget uden at skulle levere vores egne DAO-implementeringer fra bunden.

At give vores applikation grundlæggende CRUD-funktionalitet til Bruger objekter alt, hvad vi skal gøre, er at udvide CrudRepository grænseflade:

@Repository offentlig grænseflade UserRepository udvider CrudRepository {}

Og det er det! Ved bare at udvide CrudRepository interface, Spring Data JPA vil give implementeringer til depotets CRUD-metoder for os.

5. Controller-laget

Takket være det abstraktionslag, der spring-boot-starter-data-jpa placerer oven på den underliggende JPA-implementering, kan vi nemt tilføje nogle CRUD-funktioner til vores webapplikation gennem et grundlæggende web-niveau.

I vores tilfælde er en enkelt controller-klasse tilstrækkelig til at håndtere GET og POST HTTP-anmodninger og derefter kortlægge dem til opkald til vores UserRepository implementering.

Controller-klassen er afhængig af nogle af Spring MVCs nøglefunktioner. For en detaljeret vejledning om Spring MVC, se vores Spring MVC tutorial.

Lad os starte med controllerens showSignUpForm () og tilføj bruger () metoder.

Førstnævnte viser brugertilmeldingsformularen, mens sidstnævnte fortsætter med en ny enhed i databasen efter validering af de begrænsede felter.

Hvis enheden ikke godkender valideringen, vises tilmeldingsformularen igen. Ellers, når enheden er gemt, opdateres listen over vedvarende enheder i den tilsvarende visning:

@Controller public class UserController {@GetMapping ("/ signup") public String showSignUpForm (User user) {return "add-user"; } @PostMapping ("/ adduser") offentlig String addUser (@Valid User user, BindingResult result, Model model) {if (result.hasErrors ()) {return "add-user"; } userRepository.save (bruger); returner "redirect: / index"; } // yderligere CRUD-metoder}

Vi har også brug for en kortlægning til /indeks URL:

@GetMapping ("/ index") public String showUserList (Model model) {model.addAttribute ("users", userRepository.findAll ()); returner "indeks"; }

Indenfor UserController vi vil også have showUpdateForm () metode, der er ansvarlig for at hente Bruger enhed, der matcher den leverede id fra databasen.

Hvis enheden eksisterer, videregives den som en modelattribut til opdateringsformularvisningen, hvorfor formularen kan udfyldes med værdierne for navn og e-mail felter:

@GetMapping ("/ edit / {id}") public String showUpdateForm (@PathVariable ("id") long id, Model model) {User user = userRepository.findById (id) .orElseThrow (() -> new IllegalArgumentException (" Ugyldig bruger-id: "+ id)); model.addAttribute ("bruger", bruger); returner "opdateringsbruger"; } 

Endelig har vi updateUser () og deleteUser () metoder inden for UserController klasse.

Den første fortsætter den opdaterede enhed i databasen, mens den sidste fjerner den givne enhed.

I begge tilfælde opdateres listen over vedvarende enheder i overensstemmelse hermed:

@PostMapping ("/ update / {id}") public String updateUser (@PathVariable ("id") long id, @Valid User user, BindingResult result, Model model) {if (result.hasErrors ()) {user.setId (id); returner "opdateringsbruger"; } userRepository.save (bruger); returner "redirect: / index"; } @GetMapping ("/ delete / {id}") public String deleteUser (@PathVariable ("id") long id, Model model) {User user = userRepository.findById (id) .orElseThrow (() -> new IllegalArgumentException ( "Ugyldig bruger-id:" + id)); userRepository.delete (bruger); returner "redirect: / index"; }

6. Visningslaget

På dette tidspunkt har vi implementeret en funktionel controller-klasse, der udfører CRUD-operationer på Bruger enheder. Alligevel mangler der stadig en komponent i dette skema: visningslaget.

Under src / main / ressourcer / skabeloner mappe, vi har brug for for at oprette de HTML-skabeloner, der kræves til visning af tilmeldingsformularen, opdateringsformularen og gengivelse af listen over vedvarende Bruger enheder,

Som nævnt i indledningen bruger vi Thymeleaf som den underliggende skabelonmotor til parsing af skabelonfilerne.

Her er det relevante afsnit af tilføj bruger.html fil:

 Navn E-mail 

Læg mærke til, hvordan vi har brugt @ {/ adduser} URL-udtryk for at specificere formularen handling attribut og ${} variable udtryk til indlejring af dynamisk indhold i skabelonen, såsom værdierne for navn og e-mail felter og postvalideringsfejlene.

Svarende til tilføj bruger.html, her er hvordan opdater-bruger.html skabelon ser ud:

 Navn E-mail 

Endelig har vi index.html fil, der viser listen over vedvarende enheder sammen med linkene til redigering og fjernelse af eksisterende:

Ingen brugere endnu!

Brugere

NavnE-mailRedigereSlet
RedigereSlet

Tilføj en ny bruger

For enkelhedens skyld ser skabelonerne ret skelet ud og giver kun den nødvendige funktionalitet uden at tilføje unødvendig kosmetik.

For at give skabelonerne et forbedret, iøjnefaldende udseende uden at bruge for meget tid på HTML / CSS, kan vi nemt bruge et gratis Twitter Bootstrap UI-sæt, som Shards.

7. Kørsel af applikationen

Lad os endelig definere applikationens startpunkt. Som de fleste Spring Boot-applikationer kan vi gøre dette med en almindelig gammel hoved () metode:

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

Lad os nu trykke på "Kør" i vores IDE, derefter åbne vores browser og pege på den // localhost: 8080.

Hvis build er succesfuldt kompileret vi skulle se et grundlæggende CRUD-brugerdashboard med links til tilføjelse af nye enheder og til redigering og fjernelse af eksisterende.

8. Konklusion

I denne vejledning lærte vi, hvordan man bygger en grundlæggende CRUD-webapplikation med Spring Boot og Thymeleaf.

Som normalt er alle kodeeksempler vist i artiklen tilgængelige på GitHub.