# Grails

Grails è un framework open source per applicazioni web progettato per consentire un'elevata produttività. È basato sul linguaggio di programmazione Groovy, un linguaggio dinamico eseguito sulla piattaforma Java. Grails è stato creato per dare agli sviluppatori Java funzionalità per lo sviluppo di applicazioni web che non erano mai state disponibili prima.
Siccome Grails è un framework web, non include nessuno strumento per servire altre architetture. Il lavoro di sviluppo cominciò nel luglio 2005 e la versione 0.1 venne pubblicata il 29 marzo 2006.

## Panoramica

Grails è stato sviluppato con molteplici obiettivi:
* Fornire un framework web per la Piattaforma Java che garantisse un'elevata produttività.
* Riutilizzare tecnologie Java di successo come Hibernate e Spring, fornendo un'interfaccia semplice e coerente.
* Offrire un framework semplice e facile da imparare.
* Offrire documentazione per le porzioni di interesse del framework.
** Framework di persistenza potente e coerente.
** Template di visualizzazione potenti e coerenti con l'uso di GSP (Groovy Server Page).
** Librerie di tag dinamici per creare facilmente componenti per pagine web.
** Un buon supporto per AJAX, facile da estendere e personalizzare.
* Fornire applicazioni di esempio che mettano in evidenza le potenzialità del framework.
* Offrire una modalità di sviluppo completa e rapida, con l'inclusione di un web server nell'ambiente di programmazione e funzionalità di reloading automatico delle risorse.

## Produttività

Grails ha tre caratteristiche che aumentano significativamente la produttività degli sviluppatori rispetto ai framework Java tradizionali:
* Nessuna configurazione XML
* Ambiente di sviluppo pronto all'uso
* Funzionalità disponibili tramite mixin

### Nessuna configurazione XML

Tipicamente, creare un'applicazione web in Java comporta la configurazione di ambienti e framework prima e durante lo sviluppo. Questa configurazione è molto spesso contenuta in file XML per facilitare il lavoro ed evitare di introdurre queste configurazioni all'interno del codice applicativo.
L'XML fu inizialmente utilizzato in quanto dava maggiore coerenza alla configurazione delle applicazioni. Negli ultimi anni è però divenuto evidente che sebbene l'XML sia ottimo per la configurazione, esso diventa tedioso per la preparazione di un ambiente. Questo può incidere negativamente sulla produttività in quanto gli sviluppatori perdono tempo a comprendere e manutenere la configurazione del framework con il crescere dell'applicazione. Aggiungere o cambiare le funzionalità di un'applicazione che fa uso di una configurazione XML aggiunge un passo aggiuntivo allo scrivere il codice applicativo, che rallenta la produttività e può ridurre l'agilità dell'intero processo.
Grails elimina la necessità di aggiungere configurazioni in file XML. Il framework fa invece uso di una serie di regole o convenzioni, analizzando il codice delle applicazioni basate su Grails. Per esempio, una classe il cui nome termina con Controller (ad esempio BookController) viene considerato un controller web.

### Ambiente di sviluppo pronto all'uso

Utilizzando i tradizionali strumenti per la programmazione Java, la configurazione degli ambienti è a carico del programmatore. Grails fornisce fin dall'installazione un ambiente di sviluppo già operativo che non necessita di configurazione per poter iniziare a sviluppare. Tutte le librerie necessarie sono incluse nella distribuzione di Grails, che prepara automaticamente l'ambiente di deploy/esecuzione.

### Funzionalità disponibili tramite Mixin

Grails fornisce metodi dinamici per diverse classi tramite mixin. Un mixin è una funzionalità (nel caso di Grails i mixin sono metodi) aggiunta dinamicamente ad una classe come se fosse compilata nel programma.
Questi metodi dinamici permettono agli sviluppatori di eseguire operazioni senza dover implementare interfacce o estendere le classi base. Grails fornisce metodi dinamici in base al tipo di classe. Per esempio le classi di dominio hanno metodi per automatizzare le operazioni di persistenza come save, delete e find.