Proljetna čizma CRUD aplikacija s majčinom dušicom

1. Pregled

Implementacija DAO slojeva koji pružaju CRUD funkcionalnost na JPA entitetima može biti ponavljajući, dugotrajan zadatak koji u većini slučajeva želimo izbjeći. Srećom, Spring Boot olakšava stvaranje CRUD aplikacija kroz sloj standardnih CRUD repozitorija temeljenih na JPA.

U ovom uputstvu naučit ćemo kako razviti CRUD web aplikaciju s Spring Boot i Thymeleaf.

2. Ovisnosti Mavena

U ovom ćemo se slučaju osloniti na spring-boot-starter-parent za jednostavno upravljanje ovisnostima, izradu verzija i konfiguraciju dodataka. Kao rezultat, nećemo trebati navesti verzije ovisnosti o projektu u našem pom.xml datoteka, osim nadjačavanja Java verzije:

 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. Sloj domene

Sa svim postojećim ovisnostima o projektu, implementirajmo naivni sloj domene.

Radi jednostavnosti, ovaj će sloj sadržavati jednu jedinu klasu koja će biti odgovorna za modeliranje Korisnik entiteti:

@Entity javni razred korisnika {@Id @GeneratedValue (strategy = GenerationType.AUTO) private long id; @NotBlank (message = "Ime je obavezno") ime privatnog niza; @NotBlank (message = "E-pošta je obavezna") privatni niz e-pošte; // standardni konstruktori / postavljači / getteri / toString}

Imajmo na umu da smo razred označili s @ Entitet bilješka. Stoga je provedba JPA, koja je hibernacija, u u ovom će slučaju moći izvršavati CRUD operacije na entitetima domene. Za uvodni vodič za hibernaciju posjetite naš vodič o hibernaciji 5 s proljećem.

Osim toga, ograničili smo Ime i e-mail polja s @NetBlank ograničenje. To podrazumijeva da Hibernate Validator možemo koristiti za provjeru valjanosti ograničenih polja prije trajnog ili ažuriranja entiteta u bazi podataka.

Za osnove o tome pogledajte naš udruženi vodič o provjeri valjanosti graha.

4. Sloj spremišta

U ovom trenutku naš uzorak web aplikacije ne čini ništa. Ali to će se promijeniti.

Proljetni podaci JPA omogućuje nam da implementiramo spremišta temeljena na JPA (neobično ime za implementaciju DAO uzorka) s minimalnom mukom.

Spring Data JPA ključna je komponenta Spring Boot-a spring-boot-starter-data-jpa što olakšava dodavanje CRUD funkcionalnosti putem moćnog sloja apstrakcije postavljenog na vrh JPA implementacije. Ovaj sloj apstrakcije omogućuje nam pristup sloju postojanosti bez potrebe za pružanjem vlastitih DAO implementacija od nule.

Da bismo našoj aplikaciji pružili osnovnu CRUD funkcionalnost na Korisnik objektima sve što trebamo učiniti je proširiti CrudRepository sučelje:

Javno sučelje @Repository UserRepository proširuje CrudRepository {}

I to je to! Samo proširivanjem CrudRepository sučelje, Spring Data JPA pružit će nam implementacije CRUD metoda spremišta.

5. Sloj kontrolera

Zahvaljujući sloju apstrakcije koji spring-boot-starter-data-jpa mjesta na vrhu implementacije JPA, lako možemo dodati neke CRUD funkcionalnosti u našu web aplikaciju putem osnovnog web stupnja.

U našem slučaju, jedna klasa kontrolera bit će dovoljna za rukovanje GET i POST HTTP zahtjevima, a zatim ih mapirati u pozive na naš UserRepository provedba.

Klasa kontrolera oslanja se na neke od ključnih značajki Spring MVC-a. Za detaljan vodič o proljetnom MVC-u, pogledajte naš vodič za MVC za proljeće.

Krenimo od kontrolera showSignUpForm () i addUser () metode.

Prvi će prikazati obrazac za registraciju korisnika, dok će drugi zadržati novi entitet u bazi podataka nakon provjere valjanosti ograničenih polja.

Ako entitet ne prođe provjeru valjanosti, obrazac za prijavu bit će ponovno prikazan. Inače, nakon što je entitet spremljen, popis postojanih entiteta ažurirat će se u odgovarajućem prikazu:

@Controller javna klasa UserController {@GetMapping ("/ prijava") javni String showSignUpForm (korisnik korisnika) {return "add-user"; } @PostMapping ("/ adduser") javni niz addUser (@Valid User user, BindingResult result, Model model) {if (result.hasErrors ()) {return "add-user"; } userRepository.save (korisnik); return "preusmjeravanje: / indeks"; } // dodatne CRUD metode}

Trebat će nam i mapiranje za /indeks URL:

@GetMapping ("/ index") javni niz showUserList (model modela) {model.addAttribute ("users", userRepository.findAll ()); return "indeks"; }

Unutar UserController imat ćemo i showUpdateForm () metoda koja je odgovorna za dohvaćanje Korisnik entitet koji odgovara isporučenom iskaznica iz baze podataka.

Ako entitet postoji, on će se proslijediti kao atribut modela u prikaz obrasca za ažuriranje, stoga se obrazac može popuniti vrijednostima Ime i e-mail polja:

@GetMapping ("/ edit / {id}") javni String showUpdateForm (@PathVariable ("id") dugi id, model modela) {User user = userRepository.findById (id) .orElseThrow (() -> new IllegalArgumentException (" Nevažeći korisnički ID: "+ id)); model.addAttribute ("korisnik", korisnik); vratiti "update-user"; } 

Napokon, imamo updateUser () i deleteUser () metode unutar UserController razred.

Prvi će zadržati ažurirani entitet u bazi podataka, dok će posljednji ukloniti zadani entitet.

U oba slučaja, popis postojanih entiteta bit će ažuriran u skladu s tim:

@PostMapping ("/ update / {id}") javni niz updateUser (@PathVariable ("id") dugi id, @Valid User User, BindingResult rezultat, model modela) {if (result.hasErrors ()) {user.setId (iskaznica); vratiti "update-user"; } userRepository.save (korisnik); return "preusmjeravanje: / indeks"; } @GetMapping ("/ delete / {id}") javni niz deleteUser (@PathVariable ("id") long id, model modela) {User user = userRepository.findById (id) .orElseThrow (() -> new IllegalArgumentException ( "Nevažeći korisnički ID:" + id)); userRepository.delete (korisnik); return "preusmjeravanje: / indeks"; }

6. Sloj pogleda

U ovom smo trenutku implementirali klasu funkcionalnih kontrolera koja izvodi CRUD operacije Korisnik entiteta. Unatoč tome, u ovoj shemi još uvijek nedostaje komponenta: sloj pogleda.

Ispod src / main / resources / predlošci mapu trebamo stvoriti HTML predloške potrebne za prikaz obrasca za prijavu, obrasca za ažuriranje i prikazivanja popisa trajnih Korisnik entiteti,

Kao što je navedeno u uvodu, koristit ćemo Thymeleaf kao temeljni mehanizam predloška za raščlanjivanje datoteka predložaka.

Evo relevantnog odjeljka add-user.html datoteka:

 Ime e-pošte 

Primijetite kako smo koristili @ {/ adduser} Izraz URL-a za specificiranje obrazaca akcijski atribut i ${} varijabilni izrazi za ugradnju dinamičkog sadržaja u predložak, poput vrijednosti Ime i e-mail polja i pogreške nakon provjere valjanosti.

Slično add-user.html, evo kako update-user.html predložak izgleda:

 Ime e-pošte 

Napokon, imamo index.html datoteka koja prikazuje popis postojanih entiteta zajedno s vezama za uređivanje i uklanjanje postojećih:

Još nema korisnika!

Korisnici

ImeE-mailUrediIzbrisati
UrediIzbrisati

Dodajte novog korisnika

Radi jednostavnosti, predlošci izgledaju prilično skeletno i pružaju samo potrebnu funkcionalnost bez dodavanja nepotrebne kozmetike.

Da bismo predlošcima dali poboljšani, privlačan izgled bez trošenja previše vremena na HTML / CSS, lako možemo koristiti besplatni Twitter Bootstrap UI set, poput Shards.

7. Pokretanje aplikacije

Na kraju, definirajmo ulaznu točku aplikacije. Kao i većina Spring Boot aplikacija, to možemo učiniti s običnim starim glavni() metoda:

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

A sada, pritisnite "Run" u našem IDE-u, a zatim otvorite svoj preglednik i usmjerite ga prema // localhost: 8080.

Ako je gradnja uspješno kompilirana trebali bismo vidjeti osnovnu nadzornu ploču korisnika CRUD s vezama za dodavanje novih entiteta te za uređivanje i uklanjanje postojećih.

8. Zaključak

U ovom uputstvu naučili smo kako izraditi osnovnu CRUD web aplikaciju s Spring Boot i Thymeleaf.

Kao i obično, svi uzorci koda prikazani u članku dostupni su na GitHubu.