Hozzon létre egy MVC webalkalmazást Grails alkalmazással
1. Áttekintés
Ebben az oktatóanyagban megtudhatjuk, hogyan hozhatunk létre egy egyszerű webalkalmazást a Grails segítségével.
A Grails (pontosabban ez a legújabb nagyobb verzió) a Spring Boot projekt tetejére épített keretrendszer, amely az Apache Groovy nyelvet használja webalkalmazások fejlesztésére.
A Rails Framework for Ruby és a konvenciókonfiguráció filozófiája köré épül, amely lehetővé teszi a kazánlap kódjának csökkentését.
2. Beállítás
Először térjünk át a hivatalos oldalra a környezet előkészítése érdekében. A bemutató idején a legújabb verzió a 3.3.3.
Egyszerűen fogalmazva, a Grails telepítésének két módja van: SDKMAN-on keresztül vagy a terjesztés letöltésével és bináris fájlok hozzáadásával a PATH környezeti változóhoz.
A beállítással nem foglalkozunk lépésről lépésre, mert ez jól dokumentálva van a Grails Docs-ban.
3. A Grails alkalmazás anatómiája
Ebben a részben jobban megismerjük a Grails alkalmazás szerkezetét. Mint korábban említettük, Grails a konvenciót részesíti előnyben a konfiguráció helyett, ezért a fájlok helye határozza meg céljukat. Lássuk, mi van a grails-kb Könyvtár:
- eszközök - olyan hely, ahol statikus eszközök fájljait tároljuk, például stílusokat, javascript fájlokat vagy képeket
- konf - tartalmaz projektkonfigurációs fájlokat:
- alkalmazás.yml szabványos webalkalmazás-beállításokat tartalmaz, mint például az adatforrás, a mime-típusok és más Grails vagy Spring funkcióval kapcsolatos beállítások
- források.groovy tavaszi babmeghatározásokat tartalmaz
- logback.groovy naplózási konfigurációt tartalmaz
- vezérlők - felelős a kérelmek kezeléséért és a válaszok generálásáért, vagy a nézetekre delegálásáért. Megállapodás szerint, amikor a fájlnév végződik *Vezérlő, a keretrendszer létrehoz egy alapértelmezett URL-hozzárendelést a vezérlő osztályban definiált minden művelethez
- tartomány - tartalmazza a Grails alkalmazás üzleti modelljét. Minden itt élő osztályt a GORM térképez fel az adatbázis táblákra
- i18n - nemzetköziesedési támogatásra használják
- benne - az alkalmazás belépési pontja
- szolgáltatások - itt fog élni az alkalmazás üzleti logikája. Megállapodás alapján Grails létrehoz egy tavaszi szingulbabot minden egyes szolgáltatáshoz
- taglib - az egyéni címkekönyvtárak helye
- nézetek - nézeteket és sablonokat tartalmaz
4. Egyszerű webalkalmazás
Ebben a fejezetben létrehozunk egy egyszerű webalkalmazást a hallgatók kezeléséhez. Kezdjük azzal, hogy meghívjuk a CLI parancsot egy alkalmazásváz létrehozásához:
grails create-app
Amikor a projekt alapstruktúrája elkészült, térjünk át a tényleges webalkalmazás-összetevők megvalósítására.
4.1. Domainréteg
Mivel a hallgatók kezelésére egy webalkalmazást valósítunk meg, kezdjük az úgynevezett domain osztály előállításával Diák:
grails create-domain-class com.baeldung.grails.Student
És végül tegyük hozzá a keresztnév és vezetéknév tulajdonságai:
osztály Tanuló {String keresztnév String vezetéknév}
Grails alkalmazza a konvencióit, és objektum-relációs leképezést állít fel az összes osztályban, amely itt található grails-app / domain Könyvtár.
Sőt, a GormEntity tulajdonságnak köszönhetően minden tartományosztály hozzáférhet az összes CRUD művelethez, amelyet a következő szakaszban használunk a szolgáltatások megvalósításához.
4.2. Szolgáltatási réteg
Alkalmazásunk a következő felhasználási eseteket fogja kezelni:
- A hallgatók listájának megtekintése
- Új hallgatók létrehozása
- Meglévő hallgatók eltávolítása
Végezzük el ezeket a felhasználási eseteket. Kezdjük egy szolgáltatási osztály létrehozásával:
grails create-service com.baeldung.grails.Student
Térjünk át a grails-app / szolgáltatások könyvtárban keresse meg újonnan létrehozott szolgáltatásunkat a megfelelő csomagban, és adja hozzá az összes szükséges módszert:
@ Tranzakciós osztály StudentService {def get (id) {Student.get (id)} def list () {Student.list ()} def save (hallgató) {student.save ()} def törlés (id) {Student.get (id) .delete ()}}
Vegye figyelembe, hogy a szolgáltatások alapértelmezés szerint nem támogatják a tranzakciókat. A. Hozzáadásával engedélyezhetjük ezt a funkciót @ Tranzakció jegyzet az osztálynak.
4.3. Vezérlő réteg
Annak érdekében, hogy az üzleti logika elérhető legyen a felhasználói felület számára, hozzunk létre egy StudentController a következő parancs meghívásával:
grails create-controller com.baeldung.grails.Student
Alapértelmezés szerint, Grails név szerint injektálja a babot. Ez azt jelenti, hogy könnyen beadhatjuk a StudentService singleton példányt a vezérlőnkbe egy úgynevezett példányváltozó deklarálásával hallgatókSzolgáltatás.
Most meghatározhatunk műveleteket a hallgatók olvasásához, létrehozásához és törléséhez.
osztály StudentController {def studentService def index () {válasz studentService.list ()} def show (hosszú id) {válasz studentService.get (id)} def create () {válasz új hallgató (paraméterek)} def mentés (hallgató hallgató) {studentService.save (hallgató) átirányítási művelet: "index", módszer: "GET"} def törlés (hosszú azonosító) {studentService.delete (id) átirányítási művelet: "index", módszer: "GET"}}
Egyezményesen, a index() Ennek a vezérlőnek a művelete leképezésre kerül az URI-ra / hallgató / index, a előadás() akció a / hallgató / műsor stb.
4.4. Réteg megtekintése
A vezérlő műveleteinek beállítása után folytathatjuk az UI nézetek létrehozását. Három Groovy Server oldalt hozunk létre a hallgatók felsorolásához, létrehozásához és eltávolításához.
Megállapodás alapján a Grails megjeleníti a nézetet a vezérlő neve és művelete alapján. Például,az index () akciótól StudentController meg fogja oldani /grails-app/views/student/index.gsp
Kezdjük a nézet megvalósításával / grails-app /megtekintés / hallgató / index.gsp, amely megjeleníti a hallgatók listáját. Használjuk a címkét létrehozni egy HTML táblázatot, amely megjeleníti a index() művelet a vezérlőnkben.
Megegyezés szerint, amikor objektumok listájával válaszolunk, Grails hozzáadja a „List” utótagot a modell nevéhez hogy a változóval hozzáférhessünk a tanulói objektumok listájához studentList:
- Teremt
Most folytatjuk a nézetet / grails-app /nézetek/hallgató / create.gsp, amely lehetővé teszi a felhasználó számára új Diákok létrehozását. Mi a beépítettet fogjuk használni tag, amely egy adott bab minden tulajdonságának űrlapját jeleníti meg:
Végül hozzuk létre a nézetet / grails-app /nézetek/hallgató / show.gsp a hallgatók megtekintésére és végül törlésére.
Egyéb címkék mellett kihasználjuk , amely egy babot vesz fel argumentumként, és megjeleníti az összes mezőjét:
- A hallgatók listája
4.5. Egység tesztek
Grails főként a Spock előnyeit használja ki tesztelés céljából. Ha még nem ismeri a Spockot, javasoljuk, hogy először olvassa el ezt az oktatóanyagot.
Kezdjük az egység tesztelésével index() akciónk StudentController.
Gúnyolni fogjuk lista() módszer től StudentService és tesztelje index() a várt modellt adja vissza:
void "Az index művelet tesztelése a helyes modellt adja vissza" () {megadott: controller.studentService = Gúny (StudentService) {lista () >> [új tanuló (keresztnév: 'John', vezetéknév: 'Doe')]}} "Az indexművelet végrehajtásra kerül" controller.index (), majd: "A modell helyes" model.studentList.size () == 1 model.studentList [0] .firstName == 'John' model.studentList [0]. vezetéknév == 'Doe'}
Most teszteljük a töröl() akció. Ellenőrizzük, hogy töröl() innen hívták StudentService és ellenőrizze az átirányítást az index oldalra:
void "A törlési művelet tesztelése egy példánnyal" () {given: controller.studentService = Gúny (StudentService) {1 * delete (2)} amikor: "A tartományi példány át lett adva a törlési műveletnek" request.contentType = FORM_CONTENT_TYPE kérelem .method = 'DELETE' controller.delete (2), majd: "A felhasználót indexre irányítják" response.redirectedUrl == '/ student / index'}
4.6. Integrációs tesztek
Ezután nézzük meg, hogyan hozhatunk létre integrációs teszteket a szolgáltatási réteg számára. Főként az itt konfigurált adatbázissal teszteljük az integrációt grails-app / conf / application.yml.
Alapértelmezés szerint Grails a memóriában lévő H2 adatbázist használja erre a célra.
Először is kezdjük egy segítő módszer meghatározásával az adatbázis feltöltésére szolgáló adatok létrehozásához:
private Long setupData () {new Student (keresztnév: 'John', vezetéknév: 'Doe') .save (flush: true, failOnError: true) new Student (firstName: 'Max', lastName: 'Foo') .save ( flush: true, failOnError: true) Student student = new Student (firstName: 'Alex', lastName: 'Bar') .save (flush: true, failOnError: true) student.id}
Köszönhetően a @Rollback kommentár az integrációs teszt osztályunkon, mindegyik módszer külön tranzakcióban fog futni, amelyet a teszt végén visszagörgetnek.
Vessen egy pillantást arra, hogy miként hajtottuk végre az integrációs tesztet lista() módszer:
void "tesztlista" () {setupData () mikor: List studentList = studentService.list (), akkor: studentList.size () == 3 studentList [0] .lastName == 'Doe' studentList [1] .lastName == 'Foo' studentList [2] .lastName == 'Bar'}
Vizsgáljuk meg a töröl() módszer, és érvényesítse, ha a hallgatók teljes számát eggyel csökkentik:
void "test delete" () {Hosszú id = setupData () várható: studentService.list (). size () == 3 mikor: studentService.delete (id) sessionFactory.currentSession.flush () majd: studentService.list () .size () == 2}
5. Futás és telepítés
Az alkalmazások futtatása és telepítése egyetlen parancs meghívásával történhet a Grails CLI-n keresztül.
Az alkalmazás futtatásához használja:
grails run-app
Alapértelmezés szerint Grails beállítja a Tomcat-ot a 8080-as porton.
Navigáljunk ide // localhost: 8080 / student / index hogy lássa, hogyan néz ki webalkalmazásunk:
Ha az alkalmazást egy servlet-tárolóba kívánja telepíteni, akkor használja:
megőrli a háborút
bevetésre kész háborús tárgy létrehozása.
6. Következtetés
Ebben a cikkben arra összpontosítottunk, hogyan hozzunk létre egy Grails webalkalmazást a konvenciókonfiguráció filozófiája segítségével. Láttuk azt is, hogyan kell elvégezni az egység- és integrációs teszteket a Spock keretrendszerrel.
Mint mindig, az itt használt összes kód megtalálható a GitHubon.