Introducere în grajduri

Introducere în Grails

Dezvoltarea aplicațiilor web nu a fost niciodată foarte ușoară și rapidă. Și mulți dezvoltatori din întreaga lume încearcă să remedieze cumva această situație. Dar în timp ce unii oameni caută, alții și-au găsit deja drumul. "Nu avem nevoie de un glonț de argint atunci când deja am găsit Sfântul Graal", spune dezvoltatorii Grails.







Să încercăm să înțelegem, din cauza a ceea ce ar putea fi dorința de a veni cu o nouă abordare a procesului de dezvoltare a aplicațiilor web.

De obicei, dezvoltarea web în Java este un proces foarte obositor și nu este necesar să vorbești despre viteză. Imaginați-vă câte acțiuni trebuie luate pentru a adăuga o nouă pagină la aplicație:

  • Creați un șablon de pagină. Șablonul în acest caz este o reprezentare.
  • Creați o clasă DTO (Data Transfer Object), de fapt este o clasă de model pentru MVC.
  • Creați o clasă de Assembler care va putea să formeze obiectul DTO din obiecte de domeniu.
  • Creați o fatadă de afaceri și implementarea acesteia (deși acest lucru nu este întotdeauna necesar). Fatadele de afaceri sunt obiecte care realizează o logică complexă a aplicațiilor, de multe ori metodele de fațadă ale afacerii sunt realizate tranzacțional.
  • Creați o interfață DAO (Obiect de acces de date) și implementarea acesteia. Obiectele DAO sunt folosite pentru a lucra cu baza de date.
  • Creați o clasă de controler care să se ocupe de cererile primite, să invocați metodele necesare ale fațadei noastre și să colectați modelul și afișajul împreună (adică părțile componente ale MVC) și să returnați rezultatul.
  • Și configurați toate clasele create cu Spring.

De fapt, acest proces descrie un caz general, și nu întotdeauna avem nevoie, de exemplu, de cursuri DTO sau Assembler. Cea mai obositoare este de obicei procesul de configurare. Deoarece trebuie să creăm o mulțime de cod XML care să descrie și să inițieze obiectele noastre, precum și relațiile dintre ele.

Ca și în Grails

Diagrama de mai jos nu este singura și, probabil, programatorii care nu sunt familiarizați cu Java și Spring nu vor înțelege foarte bine cum funcționează acest lucru. Dar cel mai important lucru, după cum se poate vedea, este complexitatea și durata procesului. În schimb, procesul de creare a unei noi pagini în aplicația Grails existentă este după cum urmează:

  • Creați un nou șablon de pagină.
  • Creați un nou controler.
  • Creați un serviciu nou. Ca parte a serviciului Grails - există o clasă care trebuie să realizeze o logică complexă de afaceri, iar metodele de serviciu pot fi tranzacționale.

Ultimul pas nu este întotdeauna necesar. Și, cel mai important, nu este nevoie de XML!

Mult mai ușor, nu-i așa?

Deci, înainte de a începe exemplele și detaliile, trebuie să înțelegeți lucrurile de bază.

Graile se bazează pe:

Figura 1. Arhitectura graiurilor

În Grails, există o serie de concepte pe care ar trebui să le citiți mai întâi:

Să începem în ordine. Obiectele de domeniu sunt cărămizile aplicației web, conceptele domeniului. De exemplu, dacă scriem un e-magazin, atunci cel mai probabil vom avea obiecte precum "Utilizator", "Comandă", "Bunuri" și altele. Pentru obiectele de domeniu, Grails generează automat tabele în bază de date împreună cu chei, constrângeri, indici și totul - totul. Cererile către baza de date se efectuează de asemenea prin intermediul acestor obiecte, cum ar fi utilizarea ActiveRecord în Ruby on Rails.

Atunci când un utilizator introduce URL-ul site-ului nostru, atunci primul lucru pe care îl are interogatorul în cadrul acestei solicitări. Controlorul primește date de utilizator, generează un model bazat pe ele și îl trimite pe ecran.

Servicii - entități speciale, a căror sarcină este de a executa logica de afaceri a aplicației. După cum sa menționat deja mai sus, în aplicațiile Java logica de afaceri este folosită pentru a executa logica de afaceri.

Șabloanele, în general, precum și peste tot, sunt clicuri HTML, pe care paginile sunt generate. În Grails, pentru a simplifica crearea de șabloane, există un limbaj încorporat (GSP) (Groovy Server Pages), acesta are etichete care permit efectuarea diferitelor acțiuni, cum ar fi iterația, condițiile, ieșirile de date și altele. Dar puteți să extindeți singur setul de etichete creând propriile dvs. biblioteci de etichete.

Biblioteca de etichete din Grails este o clasă a cărei metodă poate fi apelată din șablon ca etichete GSP. Dacă în șabloane trebuie să efectuați aceleași acțiuni, atunci ar trebui să creați o etichetă specială și să transferați aceste acțiuni în ea. În acest fel, veți evita munca de rutină și reutilizați codul existent, precum și veți face viața mai ușoară pentru designerul de layout care lucrează cu șabloane.

Anterior a fost menționat că primăvara este una dintre componentele Grails. Primavara in compozitie are o functionalitate speciala (Quartz) pentru a indeplini sarcini la un program, adica face anumite lucruri necesare pentru noi la anumite intervale (desigur, puteti indeplini sarcini si intr-un timp precis). Prin crearea de sarcini în acest fel, sunteți mult mai puțin dependent de sistemul de operare decât, de exemplu, în cazul utilizării Cron.

Acum puteți merge la practică. Creați o aplicație simplă - o bibliotecă. Biblioteca noastră va păstra pur și simplu o listă de cărți și va oferi ocazia de a vedea lista, de a șterge, de a edita și de a adăuga cărți.

Pentru a efectua sarcini de rutină - crearea unui schelet de aplicații simplu, a obiectelor de domeniu, a controlorilor și a altora - este inclusă și utilitatea de comandă grails. Nu vom elabora comenzile, dar cele mai importante vor fi luate în considerare în cursul redactării cererii noastre. Și prima echipă pe care o vom cunoaște este crea-app.

bash-3.2 $ grails create-app homeLibrary

Licențiată sub licența Apache Standard 2.0

Acasă la Grails este setată la: /Library/grails-1.0.1

Lista de bază: / demo / grails

Mediul este pus în scenă

Notă: Nu s-au găsit scripturi de plugin

Rulează scriptul /Library/grails-1.0.1/scripts/CreateApp.groovy

[mkdir] Creat dir: / demo / grails / homeLibrary / src

[mkdir] Creat dir: / demo / grails / homeLibrary / src / java

[mkdir] Creat dir: / demo / grails / homeLibrary / src / groovy

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / controllers

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / services

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / domain

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / taglib







[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / utils

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / views

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / views / layouts

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / i18n

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / conf

[mkdir] Creat dir: / demo / grails / homeLibrary / test

[mkdir] Creat dir: / demo / grails / homeLibrary / test / unitate

[mkdir] Creat dir: / demo / grails / homeLibrary / test / integration

[mkdir] Creat dir: / demo / grails / homeLibrary / scripts

[mkdir] Creat dir: / demo / grails / homeLibrary / web-app

[mkdir] Creat dir: / demo / grails / homeLibrary / web-app / js

[mkdir] Creat dir: / demo / grails / homeLibrary / web-app / css

[mkdir] Creat dir: / demo / grails / homeLibrary / web-app / images

[mkdir] Creat dir: / demo / grails / homeLibrary / web-app / META-INF

[mkdir] Creat dir: / demo / grails / homeLibrary / lib

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / conf / spring

[mkdir] Creat dir: / demo / grails / homeLibrary / grails-app / conf / hibernate

[propertyfile] Crearea unui nou fișier de proprietate: /demo/grails/homeLibrary/application.properties

[propertyfile] Actualizarea fișierului de proprietăți: /demo/grails/homeLibrary/application.properties

Creat Grails Cerere la / demo / grails / homeLibrary

După ce a executat comanda "grails create-app homeLibrary", avem scheletul viitoarei noastre aplicații web. În Grails există un astfel de lucru ca Convenția peste configurație. Aceasta înseamnă că pentru fiecare fișier există un loc unde ar trebui să fie, iar fiecare clasă trebuie să aibă un nume clar definit (a se vedea figura 2). De exemplu, fișierele care conțin clase de controler trebuie să aibă un postfix de controler.

Figura 2. Structura aplicației

Configurarea bazei de date

Ca următorul pas, configurați aplicația pentru a lucra cu baza de date, lăsați-o să fie MySQL, dar orice altă bază de date cu care Hibernate poate funcționa (în momentul în care există suport pentru toate DBMS populare) va face. Pentru a face acest lucru, deschideți fișierul conf / DataSource.groovy:

Șoferul nostru

După cum puteți vedea. acest fișier conține trei secțiuni. sursa de date, hibernare și medii. Secțiunea dataSource este concepută pentru a configura parametrii de acces direct în DBMS. Deoarece folosim MySQL, vom schimba denumirea șoferului la "com.mysql.jdbc.Driver" în consecință, iar arhiva cu driverul ar trebui să fie plasată în directorul "lib" al proiectului nostru. Acest director este destinat pentru stocarea bibliotecilor Java folosite. Următoarea secțiune ne oferă posibilitatea de a configura Hibernate și nu este interesantă în acest stadiu, așa că vom merge direct la configurarea mediilor - medii.

Aplicația Grails poate fi executată în trei medii diferite (moduri): modul de dezvoltare, modul de testare și produsul finit. Pentru fiecare mod individual, putem seta adresa URL, login, parola pentru a vă conecta la DBMS și așa mai departe. În mod implicit, aplicația rulează în modul de dezvoltare. Dacă este nevoie, puteți crea singur moduri suplimentare. Deoarece deja am ales MySQL ca bază de date, definim șirul de conexiune: jdbc: mysql: //127.0.0.1: 3306 / home_library.

După cum am menționat deja, obiectele de domeniu sunt cărămizile aplicației, conceptele sale de bază. Deoarece aplicația noastră este concepută pentru a stoca o listă de cărți, vom crea un obiect Domain Book.

bash-3,2 $ grails crea-domeniu-clasa de carte

Licențiată sub licența Apache Standard 2.0

Acasă la Grails este setată la: /Library/grails-1.0.1

Directory: / demo / grails / homeLibrary

Mediul este pus în scenă

Notă: Nu s-au găsit scripturi de plugin

Rulează scriptul /Library/grails-1.0.1/scripts/CreateDomainClass.groovy

Creat pentru carte

Teste create pentru carte

După cum puteți vedea, prin aceasta am ajutat din nou echipa de medalii. Având în vedere faptul că fiecare instanță a clasei Carte va reprezenta informații despre o anumită carte, vom adăuga în consecință câmpurile necesare:

Numele șirului // Numele cărții

int shelfNumber // Numărul de raft

nume (nullabil: fals, gol: fals, dimensiune: 1..200)

autor (nullabil: fals, necompletat: fals, dimensiune: 1,50)

Acum, când pornim aplicația bazată pe obiectul domeniului nostru, Grails va crea o tabelă "carte" în baza de date. Această metodă de creare a obiectelor de domeniu și conectarea acestora la baza de date pare să fie mai puțin consumatoare de timp decât adnotările obișnuite Java sau fișierele de mapări. Pentru a fi sigur, executați comanda "grails run-app" și vedeți ce sa schimbat în baza de date.

mysql> arată crea carte de tabel \ G

Creare tabel: CREATE TABLE `book` (

`id` bigint (20) NU NULL auto_increment,

`versiune` bigint (20) NU NULL,

`autor` varchar (50) NU NULL,

`nume` varchar (200) NU NULL,

`shelf_number` int (11) NU NULL,

) ENGINE = MyISAM DEFAULT CHARSET = latin1

1 rând în set (0.00 sec)

După cum puteți vedea, în tabel există toate câmpurile și restricțiile definite de noi. De asemenea, s-au adăugat automat cheia primară și câmpul de serviciu "versiune". Având în vedere că mediul de dezvoltare în opțiunea de fișier de configurare DataSource.groovy «dbCreate» este setat pentru a crea «drop», atunci de fiecare dată când începe aplicarea tabelului va fi șters și creat din nou. Desigur, toate datele vor fi pierdute. Pentru a evita acest lucru, trebuie să înlocuiți valoarea cu "update". În acest caz, va fi orice modificări în obiectele noastre de domeniu, tabelele existente vor rula SQL ALTER-interogări, și, prin urmare, pierderea de date va avea loc numai în cazul îndepărtării oricăror câmpuri sau clase.

Controlor și șabloane

Acum, că avem deja un obiect de domeniu - Cartea, putem crea o interfață pentru gestionarea cărților. Aici există mai multe moduri - putem scrie totul de mână, putem folosi ceea ce se numește schele, și poate genera o existentă clasă de domeniu tot ce ai nevoie, și anume - șabloane și controler (schele - comportamentul controler atunci când în mod clar că nu există metode și modele, dar acest controler poate crea, șterge și edita date. de exemplu, putem crea un controler de gol, câmpul «def schelei = Cartea», și, astfel, acum să fie în măsură să efectueze această acțiune prin controler simplu cu obiectul Bo OK). Pentru a demonstra capacitățile Grails, încercați să mergeți pe a treia cale și să generați cod și șabloane. Din nou, utilitatea de grai vine la salvarea noastră. Executați comanda "grails generate-all Book" și executați aplicația.

Deschind browserul, vom vedea pagina principală cu o descriere și o listă a unui link - link-uri către controlerul nou generat (a se vedea Figura 3).

Figura 3. Pagina principală

Trecând peste aceasta, asigurați-vă că aplicația noastră poate crea noi înregistrări, edita și șterge noi (vezi Figura 4).

Figura 4. Aplicația CRUD simplă (creați Update Retrive Update Delete)

Pentru a începe imediat lucrul cu cărțile, vom edita fișierul de configurare conf / UrlMappings.groovy:

// aplică constrângerile aici

// Înlocuiți comportamentul implicit

// acțiunile de ștergere, salvare și actualizare acceptă numai

def allowedMethods = [șterge: 'POST', salvează: 'POST', actualizează: 'POST']

dacă (! params.max) params.max = 10

[bookList: Book.list (params)]

def carte = Book.get (params.id)

flash.message = "Crearea $ a fost creată"

Din moment ce nu metoda pe care doriți să apelați specificat, metoda standard poartă numele - «indice» (dacă metoda dorită, puteți suprascrie implicit invocată după cum urmează - adăugați un șir de caractere la controler: «def defaultAction =«spectacol»»). După cum puteți vedea din codul de mai sus, metoda "index" redirecționează pur și simplu utilizatorul folosind anteturi HTTP la o altă metodă din aceeași clasă - "listă". Toți parametrii POST și GET sunt accesibili prin câmpul params, care este o matrice asociativă.

În metoda "listă", o listă a tuturor cărților existente este extrasă din baza de date și returnată ca model. Apoi, fără știrea noastră, grails este în directorul «vizualizări / carte /» model «list.gsp» și trece în modelul nou generat. După cum puteți vedea, aici rulează și regula "Over Configuration Convention", când cadrul în sine știe unde să găsească șabloanele necesare. După ce am generat codul HTML pentru șablonul și modelul nostru, Sitemesh începe să funcționeze. În șablonul nostru am folosit o etichetă GSP specială "“. Această etichetă arată că pentru afișarea finală a paginii este necesar să se utilizeze aspectul "principal" (toate planșele sunt în directorul "Vizualizări / planșe"). Și acum Sitemesh aplică aspectul specificat șablonului de pagină deja procesat și scoate rezultatul.

După cum puteți vedea, totul este foarte simplu și transparent, ceea ce, de fapt, dezvoltatorii au căutat. Din păcate, ia în considerare toate posibilitățile grails într-un singur articol nu este posibil, prin urmare lucruri cum ar fi serviciile, biblioteci tag-ul, care îndeplinesc sarcini programate vzaimodeytvie cu Java-cod, subtilitățile de lucru cu baza de date, și mai mult, nu au fost luate în considerare.

În concluzie, aș dori să evaluez avantajele și dezavantajele acestui cadru. Folosind Grails, construirea unei aplicații Web la nivel de întreprindere cu logică complexă de afaceri este la fel de dificilă ca utilizarea instrumentelor Java convenționale. Acesta este principalul dezavantaj. Dar pentru a rezolva cele mai multe sarcini de zi cu zi există un set complet de instrumente. Beneficiile, desigur, ar trebui să includă ușurința de dezvoltare, capacitatea de a rula aplicații primite pe oricare dintre serverele Java Web (adică, containere sau servere de aplicații), precum și capacitatea de a folosi codul Java-existent cu un efort minim asupra adaptării acestuia.







Articole similare

Trimiteți-le prietenilor: