Vytvorte webovú aplikáciu MVC s grálmi

1. Prehľad

V tomto tutoriále sa dozvieme, ako vytvoriť jednoduchú webovú aplikáciu pomocou programu Grails.

Grails (presnejšie jeho najnovšia hlavná verzia) je rámec postavený na vrchole projektu Spring Boot a na vývoj webových aplikácií používa jazyk Apache Groovy.

Je inšpirovaný rámcom Rails pre Ruby a je postavená na filozofii konvencie prekonania konfigurácie, ktorá umožňuje znížiť štandardný kód.

2. Inštalácia

V prvom rade poďme na oficiálnu stránku s prípravou prostredia. V čase tohto tutoriálu je najnovšia verzia 3.3.3.

Zjednodušene možno povedať, že existujú dva spôsoby inštalácie Grails: pomocou nástroja SDKMAN alebo stiahnutím distribúcie a pridaním binárnych súborov do premennej prostredia PATH.

Krok za krokom sa nebudeme venovať nastaveniu, pretože je dobre zdokumentované v dokumente Grails Docs.

3. Anatómia aplikácie Grály

V tejto časti lepšie pochopíme štruktúru aplikácie Grails. Ako sme už spomenuli, Grails uprednostňuje konvencie pred konfiguráciou, a preto umiestnenie súborov definuje ich účel. Pozrime sa, čo máme v grails-app adresár:

  • aktíva - miesto, kde ukladáme súbory so statickými prostriedkami, ako sú štýly, súbory javascript alebo obrázky
  • konf - obsahuje konfiguračné súbory projektu:
    • aplikácia.yml obsahuje štandardné nastavenia webových aplikácií, ako sú zdroj údajov, typy MIME a ďalšie nastavenia súvisiace s grálami alebo jarami
    • resources.groovy obsahuje definície jarných bôbov
    • logback.groovy obsahuje konfiguráciu protokolovania
  • radiče - zodpovedný za vybavovanie žiadostí a generovanie odpovedí alebo ich delegovanie na názory. Podľa konvencie, keď názov súboru končí * Kontrolórrámec vytvára predvolené mapovanie adries URL pre každú akciu definovanú v triede radiča
  • doména - obsahuje obchodný model aplikácie Grails. Každá trieda, ktorá tu žije, bude GORMom namapovaná na databázové tabuľky
  • i18n - používa sa na podporu internacionalizácie
  • init - vstupný bod aplikácie
  • služby - obchodná logika aplikácie tu bude žiť. Podľa dohody vytvorí Grails pre každú službu jarné jednolôžkové fazule
  • taglib - miesto pre vlastné knižnice značiek
  • názory - obsahuje zobrazenia a šablóny

4. Jednoduchá webová aplikácia

V tejto kapitole vytvoríme jednoduchú webovú aplikáciu na správu študentov. Začnime vyvolaním príkazu CLI na vytvorenie kostry aplikácie:

grails create-app

Keď sa vygeneruje základná štruktúra projektu, prejdime k implementácii skutočných komponentov webovej aplikácie.

4.1. Doménová vrstva

Keď implementujeme webovú aplikáciu na prácu so študentmi, začnime s generovaním triedy domény s názvom Študent:

grály create-domain-class com.baeldung.grails.Student

A na záver pridajme krstné meno a priezvisko vlastnosti:

trieda Študent {String firstName String lastName}

Grails uplatňuje svoje konvencie a nastaví objektovo-relačné mapovanie pre všetky triedy nachádzajúce sa v grails-app / doména adresár.

Navyše vďaka vlastnosti GormEntity všetky triedy domén budú mať prístup ku všetkým operáciám CRUD, ktoré použijeme v nasledujúcej časti na implementáciu služieb.

4.2. Servisná vrstva

Naša aplikácia zvládne nasledujúce prípady použitia:

  • Prezeranie zoznamu študentov
  • Vytváranie nových študentov
  • Odstraňujú sa existujúci študenti

Implementujme tieto prípady použitia. Začneme generovaním triedy služieb:

grály create-service com.baeldung.grails.Student

Poďme k grails-app / services adresár, nájdite našu novovytvorenú službu v príslušnom balíku a pridajte všetky potrebné metódy:

@Transactional class StudentService {def get (id) {Student.get (id)} def list () {Student.list ()} def save (student) {student.save ()} def delete (id) {Student.get (id) .delete ()}}

Upozorňujeme, že služby predvolene nepodporujú transakcie. Túto funkciu môžeme povoliť pridaním @ Transakčné anotácia k triede.

4.3. Vrstva radiča

Aby sme obchodnú logiku sprístupnili používateľskému rozhraniu, vytvorme StudentController vyvolaním nasledujúceho príkazu:

grály create-controller com.baeldung.grails.Student

Predvolene, Grál vstrekuje fazuľa podľa mien. Znamená to, že si môžeme ľahko podať injekciu StudentService singleton instance do nášho radiča vyhlásením inštančnej premennej s názvom študentiSlužba.

Teraz môžeme definovať akcie na čítanie, vytváranie a mazanie študentov.

trieda StudentController {def studentService def index () {respond studentService.list ()} def show (Long id) {respond studentService.get (id)} def create () {respond new Student (params)} def save (Student student) {studentService.save (student) akcia presmerovania: "index", metóda: "GET"} def delete (Long id) {studentService.delete (id) akcia presmerovania: "index", metóda: "GET"}}

Podľa dohody, the index () akcia z tohto radiča bude namapovaná na URI / student / index, the šou() akcia na / študent / prehliadka a tak ďalej.

4.4. Zobraziť vrstvu

Po nastavení akcií radiča môžeme teraz pokračovať vo vytváraní zobrazení používateľského rozhrania. Vytvoríme tri stránky servera Groovy pre zoznam, vytváranie a odstraňovanie študentov.

Podľa konvencie Grails vykreslí zobrazenie na základe názvu a akcie radiča. Napríklad,index () akcia od StudentController sa odhodlá k /grails-app/views/student/index.gsp

Začnime s implementáciou pohľadu / grails-app /views / student / index.gsp, kde sa zobrazí zoznam študentov. Použijeme značku vytvoriť tabuľku HTML zobrazujúcu všetkých študentov vrátených z index () činnosť v našom kontrolóri.

Podľa odpovede, keď odpovieme zoznamom objektov, Grails pridá k názvu modelu príponu „Zoznam“ aby sme mali prístup k zoznamu študentských objektov s premennou zoznam študentov:

  • Vytvoriť

Teraz prejdeme k výhľadu / grails-app /názory/študent / create.gsp, ktorý umožňuje používateľovi vytvárať nových študentov. Použijeme zabudovaný tag, ktorý zobrazuje formulár pre všetky vlastnosti daného fazule:

Nakoniec vytvoríme pohľad / grails-app /názory/študent / show.gsp na prezeranie a prípadné mazanie študentov.

Okrem iných značiek využijeme aj , ktorý berie fazuľu ako argument a zobrazuje všetky jej polia:

  • Zoznam študentov

4.5. Jednotkové testy

Grails využíva hlavne Spock na testovacie účely. Ak nie ste oboznámení so Spockom, dôrazne odporúčame prečítať si najskôr tento návod.

Začnime s jednotkovým testovaním index () akcia našej StudentController.

Vysmejeme sa zoznam () metóda z StudentService a vyskúšať, či index () vráti očakávaný model:

void "Test akcie indexu vráti správny model" () {given: controller.studentService = Mock (StudentService) {list () >> [nový študent (meno: 'John', priezvisko: 'Doe')]} keď: „Vykoná sa akcia indexu“ controller.index () potom: „Model je správny“ model.studentList.size () == 1 model.studentList [0] .firstName == 'John' model.studentList [0]. priezvisko == 'Srnka}}

Teraz otestujme odstrániť () akcia. Overíme, či odstrániť () bol vyvolaný z StudentService a overte presmerovanie na indexovú stránku:

void "Test akcie odstránenia pomocou inštancie" () {given: controller.studentService = Mock (StudentService) {1 * delete (2)} when: "Inštancia domény je odovzdaná akcii odstránenia" request.contentType = FORM_CONTENT_TYPE požiadavka .method = 'DELETE' controller.delete (2) then: "Užívateľ je presmerovaný na index" response.redirectedUrl == '/ student / index'}

4.6. Integračné testy

Ďalej sa pozrime, ako vytvoriť integračné testy pre vrstvu služby. Hlavne otestujeme integráciu s databázou nakonfigurovanou v grails-app / conf / application.yml.

Grails štandardne používa databázu H2 v pamäti pre tento účel.

Najskôr začnime s definovaním pomocnej metódy na vytváranie údajov na vyplnenie databázy:

private Long setupData () {new Student (firstName: 'John', lastName: 'Doe') .save (flush: true, failOnError: true) new Student (firstName: 'Max', lastName: 'Foo') .save ( flush: true, failOnError: true) Študent študent = nový Študent (meno: 'Alex', priezvisko: 'Bar') .save (flush: true, failOnError: true) student.id}

Vďaka @Rollback anotácia k našej triede testov integrácie, každá metóda bude prebiehať v samostatnej transakcii, ktorá bude vrátená späť na konci testu.

Zoznámte sa s tým, ako sme implementovali test integrácie pre naše zoznam () metóda:

void "test list" () {setupData () when: List studentList = studentService.list () then: studentList.size () == 3 studentList [0] .lastName == 'Doe' studentList [1] .lastName == 'Foo' studentList [2] .lastName == 'Bar'}

Poďme tiež vyskúšať odstrániť () metóda a overiť, či sa celkový počet študentov zníži o jedného:

void "test delete" () {Long id = setupData () expect: studentService.list (). size () == 3 when: studentService.delete (id) sessionFactory.currentSession.flush () then: studentService.list () .size () == 2}

5. Spustenie a nasadenie

Spustenie a nasadenie aplikácií je možné vykonať vyvolaním jediného príkazu cez Grails CLI.

Na spustenie aplikácie použite:

grails run-app

Grails predvolene nastaví Tomcat na porte 8080.

Prejdime k // localhost: 8080 / student / index ako naša webová aplikácia vyzerá:

Ak chcete svoju aplikáciu nasadiť do kontajnera servletu, použite:

vojna grálov

vytvoriť vojnový artefakt pripravený na nasadenie.

6. Záver

V tomto článku sme sa zamerali na to, ako vytvoriť webovú aplikáciu Grails pomocou filozofie konvencie nad konfiguráciou. Tiež sme videli, ako vykonať jednotkové a integračné testy s rámcom Spock.

Ako vždy, všetky tu použité kódy nájdete na GitHub.


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