Questo articolo parla dello scaffolding di Grails, ossia della funzionalità di generare le pagine web standard in base alle tabelle del database. In particolare affrontiamo gli aspetti della generazione dello scaffold e dell’ordine di comparsa dei campi della tabella nella form HTML. La versione di Grails di cui parlo non è nuovissima, ma è quella su cui sto lavorando su comissione.

Sommario
Cos’è uno scaffold
Lo scaffold è l’impalcatura, cioè una rappresentazione grezza, anche se visavamente decorosa, delle tabelle DBMS come form HTML, che viene generata automaticamente dal framework, assieme alle implementazioni HTTP dei verbi CRUD che definiscono le operazioni su queste tabelle.
Per chi come me ha iniziato a scrivere applicazioni web nel 2000 si ricorderà che si doveva fare tutto a mano: mappare i campi della tabella in opportuni controlli (HTML), scrivere il controllo di omogeneità lato server e lato client (javascript/jQuery) . Ad esempio: range di valori, correttezza dell’input, ecc. E poi implementare le operazioni CRUD attraverso la compilazione di comandi SQL parametrici.
Dopo un po’ ci si è resi conto che questo lavoro era anche terribilmente noioso perché meccanico e ripetitivo, per cui presto si è messo a punto lo strumento dello scaffolding che automatizzava questa parte di lavoro, producendo automaticamente il codice nel linguaggio dell’application server e la parte grafica in HTML/CSS a partire dalla definizione in DDL della tabella DBMS per la realizzazione delle 4 operazioni.
Scaffolding con Grails 1: static vs dynamic
Lo scaffolding con Grails è possibile in due modi.
Dynamic scaffolding.
Il primo veloce ed economico è lo scaffolding dinamico che significa che gli HTML delle pagine che realizzano le operazioni vengono generati al volo dal framework coem anche le funzionalità CRUD del controller e viene tenuto tutto in memoria RAM dell’Application server. È sufficente aggiungere la variabile static scaffolding
inizializzata a true
nella dichiarazione del controller:
package myapp class CapitoloController { static scaffold = true // def index() { // render "Elenco dei capitoli" // } }
Come alternativa si può anche inizializzare la variabile scaffold con il nome del dominio (tabella) che si vuole implementare.
Con questa modalità però non ho nessuna azione che venga cablata nel controller, né la produzione di alcuna vista. Se arresto il server perdo tutto.
È un buon punto di partenza ma non offre alcuna flessibilità.
Static scaffolding.
Lo scaffolding statico invece produce codice (controller / view) che poi può essere personalizzato.
In IDE del tipo Groovy/Grails toolsuite esisteva un comando disponibile a menu che produceva lo scaffold per il controller (quindi le azioni standard) e per le viste (le pagine html standard per ogni verbo). Venegoo generati anche i codici Groovy per tutti questi elementi.
Io però uso IntelliJ IDEA di JetBrains che non ha questo comando. Tuttavia è solo un lack della GUI perché da linea di comando si può fare tranquillamente:
$ grails generate-controller rewards.OrderItem
ad esempio genererà il codice per il Controller con i metodi standard index(), show(), creste(), save(), update(), delete(), notFound()
e inoltre produrrà una cartella sotto views
con il nome del dominio e le viste standard: _form.gsp, create.gsp, edit.gsp, index.gsp
e show.gsp
.
Grails Scaffolding #2: decidere l’ordine di apparizione dei campi della form HTML
Parte dell’utilizzo dei database nelle applicazioni web è rivolto alla posssibilità di fornire una rappresentazione grafica della tabelle db (assieme alle relazioni) come moduli (form) html. Infatti ciò che si fa è mappare ogni record in una maschera (form) con controlli (input) che ne riportano i valori.
Se si usa la funzionalità di scaffolding di Grails per costtuire le views (le schermate), è possibile decidere in quale ordine debbano essere visualizzati i campi di una form CRUD per la gestione di una tabella DBMS (ovvero di un domain Grails).
Ovviamente se non si usa lo scaffolidng è tutto a carico del progettista, ma è anche possibile dire a Grails come generare gli scaffold.
Nella dichiarazione del domain, nella dichiarazione dei constraints, scriveremo i campi nell’ordine in cui vogliamo che compaiano:
package rewards class Customer { String firstName String lastName Long phone String email Integer totalPoints static hasMany = [awards: Award, orders: OnlineOrder] static constraints = { firstName() lastName() email() phone() totalPoints() }
Nelle dichiarazioni delle variabili, l’ordine non è importante (a questo riguardo). Per quanto riguarda l’ordine nel quale comparranno nella form, è la varibile static costraints
a guidare.
Il risultato è rappresentato in figura 1

Commenti recenti