Spring Boot CRUD-applikasjon med Thymeleaf

1. Oversikt

Implementeringen av DAO-lag som gir CRUD-funksjonalitet på JPA-enheter kan være en repeterende, tidkrevende oppgave som vi i de fleste tilfeller vil unngå. Heldigvis gjør Spring Boot det enkelt å lage CRUD-applikasjoner gjennom et lag med standard JPA-baserte CRUD-arkiver.

I denne opplæringen lærer vi hvordan vi kan utvikle et CRUD-webapplikasjon med Spring Boot og Thymeleaf.

2. Maven-avhengighetene

I dette tilfellet vil vi stole på spring-boot-starter-parent for enkel avhengighetsadministrasjon, versjonering og plugin-konfigurasjon. Som et resultat trenger vi ikke å spesifisere versjonene av prosjektavhengighetene i vår pom.xml fil, bortsett fra å overstyre Java-versjonen:

 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. Domenelaget

Med alle prosjektavhengighetene som allerede er på plass, la oss nå implementere et naivt domenelag.

For enkelhets skyld vil dette laget inneholde en enkelt klasse som vil være ansvarlig for modellering Bruker enheter:

@Entity offentlig klasse bruker {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat lang id; @NotBlank (message = "Navn er obligatorisk") privat strengnavn; @NotBlank (message = "E-post er obligatorisk") privat streng e-post; // standard konstruktører / settere / getters / toString}

La oss huske at vi har kommentert klassen med @Enhet kommentar. Derfor implementeres JPA, som er i dvalemodus, i i dette tilfellet vil kunne utføre CRUD-operasjoner på domenenhetene. For en innledende guide til dvalemodus, besøk vår veiledning om dvalemodus 5 med våren.

I tillegg har vi begrenset Navn og e-post felt med @NotBlank begrensning. Dette innebærer at vi kan bruke dvalemodus til å validere de begrensede feltene før vi vedvarer eller oppdaterer en enhet i databasen.

For det grunnleggende om dette, sjekk ut den tilknyttede veiledningen vår om Bean Validation.

4. Lagringslaget

På dette tidspunktet gjør eksempelprogrammet vårt ingenting. Men det er i ferd med å endre seg.

Vårdata JPA lar oss implementere JPA-baserte repositories (et fancy navn for implementering av DAO-mønster) med minimalt oppstyr.

Spring Data JPA er en nøkkelkomponent i Spring Boot's spring-boot-starter-data-jpa som gjør det enkelt å legge til CRUD-funksjonalitet gjennom et kraftig lag med abstraksjon plassert på toppen av en JPA-implementering. Dette abstraksjonslaget gir oss tilgang til utholdenhetslaget uten å måtte tilby våre egne DAO-implementeringer fra bunnen av.

Å gi applikasjonen vår grunnleggende CRUD-funksjonalitet på Bruker gjenstander alt vi trenger å gjøre er å utvide CrudRepository grensesnitt:

@Repository offentlig grensesnitt UserRepository utvider CrudRepository {}

Og det er det! Ved å bare utvide CrudRepository grensesnitt, vil Spring Data JPA gi implementeringer for depotets CRUD-metoder for oss.

5. Kontrollerlaget

Takk til laget av abstraksjon som spring-boot-starter-data-jpa plasserer seg på toppen av den underliggende JPA-implementeringen, kan vi enkelt legge til litt CRUD-funksjonalitet i webapplikasjonen vår gjennom et grunnleggende nettnivå.

I vårt tilfelle vil en enkelt kontrollerklasse være tilstrekkelig for å håndtere GET og POST HTTP-forespørsler, og deretter kartlegge dem til anrop til UserRepository gjennomføring.

Kontrollerklassen er avhengig av noen av Spring MVCs hovedtrekk. For en detaljert guide om Spring MVC, sjekk ut vår MVC tutorial.

La oss starte med kontrolleren showSignUpForm () og addUser () metoder.

Førstnevnte vil vise brukerregistreringsskjemaet, mens sistnevnte vil vedvare en ny enhet i databasen etter validering av de begrensede feltene.

Hvis enheten ikke godkjenner validering, blir registreringsskjemaet vist på nytt. Ellers, når enheten er lagret, vil listen over vedvarende enheter bli oppdatert i den tilsvarende visningen:

@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 (bruker); return "redirect: / index"; } // ytterligere CRUD-metoder}

Vi trenger også en kartlegging for / indeks URL:

@GetMapping ("/ index") offentlig String showUserList (modellmodell) {model.addAttribute ("brukere", userRepository.findAll ()); returner "indeks"; }

Innen UserController vi vil også ha showUpdateForm () metoden som er ansvarlig for å hente Bruker enhet som samsvarer med den leverte id fra databasen.

Hvis enheten eksisterer, vil den bli videreført som et modellattributt til oppdateringsskjemavisningen, og skjemaet kan følgelig fylles ut med verdiene til Navn og e-post Enger:

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

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

Den første vil vedvare den oppdaterte enheten i databasen, mens den siste vil fjerne den gitte enheten.

I begge tilfeller vil listen over vedvarende enheter bli oppdatert tilsvarende:

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

6. Visningslaget

På dette tidspunktet har vi implementert en funksjonell kontrollerklasse som utfører CRUD-operasjoner på Bruker enheter. Allikevel mangler det fremdeles en komponent i dette skjemaet: visningslaget.

Under src / hoved / ressurser / maler mappen vi trenger for å lage HTML-malene som kreves for å vise påmeldingsskjemaet, oppdateringsskjemaet og gjengi listen over vedvarende Bruker enheter,

Som nevnt i innledningen, bruker vi Thymeleaf som den underliggende malmotoren for å analysere malfilene.

Her er den relevante delen av add-user.html fil:

 Navn E-post 

Legg merke til hvordan vi har brukt @ {/ adduser} URL-uttrykk for å spesifisere skjemaets handling attributt og ${} variable uttrykk for å legge inn dynamisk innhold i malen, for eksempel verdiene til Navn og e-post feltene og feilene etter validering.

Lik add-user.html, her er hvordan update-user.html mal ser ut:

 Navn E-post 

Endelig har vi index.html fil som viser listen over vedvarende enheter sammen med koblingene for redigering og fjerning av eksisterende:

Ingen brukere ennå!

Brukere

NavnE-postRedigereSlett
RedigereSlett

Legg til en ny bruker

For enkelhets skyld ser malene ut som skjelett og gir bare den nødvendige funksjonaliteten uten å legge til unødvendig kosmetikk.

For å gi malene et forbedret, iøynefallende utseende uten å bruke for mye tid på HTML / CSS, kan vi enkelt bruke et gratis Twitter Bootstrap UI-sett, som Shards.

7. Kjøre applikasjonen

Til slutt, la oss definere programmets inngangspunkt. Som de fleste Spring Boot-applikasjoner, kan vi gjøre dette med en vanlig gammel hoved() metode:

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

La oss nå trykke "Kjør" i IDE-en vår, så åpne nettleseren vår og peke den mot // lokal vert: 8080.

Hvis bygningen har blitt samlet vi bør se et grunnleggende CRUD-brukerdashboard med lenker for å legge til nye enheter og for redigering og fjerning av eksisterende.

8. Konklusjon

I denne opplæringen lærte vi hvordan vi bygger en grunnleggende CRUD-webapplikasjon med Spring Boot og Thymeleaf.

Som vanlig er alle kodeeksemplene vist i artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found