TUTORIAL GWT – CREARE UNA WEBAPP CON GWT 2.8

Da tempo pensavo di aggiornare i componenti che uso in ufficio e ho deciso di partire da GWT. Nel momento in cui scrivo l’ultima versione è la  2.8.2.  Mi piace GWT, mi piace l’idea di lavorare solo in java e xml e non dovermi preoccupare delle librerie javascript, durante la generazione del war sarà GWT a trasformare le classi java in unico file javascript che sarà incluso all’interno del mio progetto.

Andiamo sul sito http://www.gwtproject.org e partiamo dall’analisi dei requisiti di sistema. La nuova versione ha una dipendenza minima di JDK 1.8, Google ci avvisa che il sistema compila correttamente su JDK 1.7 ma che la modalità in devmode presenta malfunzioni.  L’IDE di riferimento è Eclipse, nel momento in cui scrivo sto usando la versione Oxygen. Su questa installiamo il GWT Eclipse plugin  e possiamo iniziare.

A questo punto avete 2 possibilità:

  1. usare il wizard che vi tira su il progetto con la sua alberatura e lo rende già eseguibile .
  2. Integrare maven, integrare il plugin disponibile e creare il nostro progetto a partire da un archetipo .

L’opzione 1 è quella più rapida, selezionando i dati di esempio,  ci permette di avere subito il progetto operativo e poterlo lanciare tramite una delle seguenti opzioni :

  1. GWT Development Mode (Avvia un server in ascolto delle richieste del client. Se tutto è ok vai all’indirizzo http://127.0.0.1:9876/ per vedere il server attivo. A questo punto occorre configurare un qualsiasi server per caricare il contesto web )
  2. GWT Development Mode with jetty (Avvia il code server ed un jetty server con il client attivo. A questo punto se tutto è ok accedete alla pagina http://127.0.0.1:8888/ e vedrete la home page dell’applicativo. Rispetto al punto precedente, abbiamo già il web server pronto.)
  3. GWT Legacy Development Mode with jetty (Avvia l’applicativo usando un processo OOHPM. Tale processo non è più supportato dai moderni browser. Infatti è possibile vederlo attivo solo su una vecchia versione di firefox su cui va installato il google web toolkit developer plugin).

Il plugin ha creato la directory war e 3 package per i sorgenti: client, server e shared. Ad ogni package corrisponde una visibilità ed un comportamento diverso. Tutti i sorgenti saranno compilati in .class sotto la WEB-INF, i sorgenti del package server sono visibile solo alla parte server del progetto e non al frontend, i sorgenti della parte client verranno trasformati in javascript, pertanto alcune classi non saranno disponibili perchè non supportate da Javascript (es. Calendar o String.format), i sorgenti del package shared saranno visibili sia al frontend che al backend.

Nota dolente di questo approccio è che il wizard fallisce qualora si chiede la creazione del progetto con struttura maven. Appena generato il progetto indica errori di compilazione e questo non è bello, visto che ha fatto tutto da solo.

Aprendo la console è possibile far partire il progetto usando la direttiva mvn war:exploded gwt:devmode, mentre in eclipse occorre configurare il progetto per correggere gli errori. Per correggere l’errore in Eclipse lanciate la direttiva mvn eclipse:eclipse e fate il refresh in Eclipse del progetto, in questo modo dovrete soltanto da aggiungere la dipendenza da GWT tramite IDE e tutto dovrebbe riattivarsi.

Adesso veniamo al punto 2, con Maven posso partire da un archetipo che mi mette a disposizione tutte le librerie che mi servono con minimo sforzo. Devo realizzare una webapp che esponga un front-end gwt e dei servizi rest per l’accesso alla base dati. Parto quindi dall’archetipo minimo previsto per gwt e a questo aggiungo spring web per la gestione dei servizi rest e restyGWT per integrarli in modo più rapido. Voglio rendere al minimo l’uso delle chiamate RPC. In questo modo potrò disaccoppiare i sistemi e un domani eventualmente sostituire GWT con un altro frontend, senza dover toccare il backend. Impostato il progetto lo facciamo partire con la direttiva e il gioco è fatto

Per riassumere trovate il pom del progetto con le dipendenze già pronte.

Buon divertimento