JUG – Ancona Italy
Google Web Toolkit
Giovanni Baleani
Programmatore Java
Filippetti S.r.l.
AJAX e GWT
- AJAX: Tecnologia emergente, tra le prime
applicazione ajax ci sono proprio gmail e
google calendar.
- GWT: qualcosa di più che un framework ajax,
introduce un concetto nuovo...
Compilatore
Java to Javascript
- Lo sviluppatore AJAX utilizza il linguaggio
Java per implementare la Web GUI
- Il compilatore pensa alla generazione del
codice javascript necessario, ottimizzandolo e
rendendolo compatibile ai vari browser
Componenti
del framework GWT
- Un compilatore
- Un browser chiamato “hosted mode browser”
- Una serie di librerie java (.jar)
- Emulazione JDK
- Widgets HTML / AJAX
- Sistema RPC (Servizi di backend AJAX)
- Unit Testing
Crescita del progetto: versioni
- Versione 1.0 (1.0.21 - Maggio 25, 2006)
- Versione 1.1 (1.1.10 - Agosto 23, 2006)
- Inclusione delle risorse automatica
- Internazionalizzazione
- Versione 1.2 (1.2.22 - Novembre 15, 2006)
- Pieno supporto per OSX
- Velocizzata la modalità hosted
- Possibilità di usare i widgets nei nodi di un albero
Finalmente Open Source !!
- Versione 1.3 (1.3.1 (RC) - Dicembre 12, 2006)
Questa è la prima versione completamente
OpenSource
- Versione 1.3 (1.3.3 - Gennaio 18, 2007)
- Versione 1.4 (1.4.62 - Marzo 17, 2008)
- Per usare un modulo in una pagina html basta
includere un solo javascript
- ImageBundle: combina molte immagini in una
singola, per eseguire un solo download
- RPC più modulare
- Versione 1.5 (1.5.3 - Ottobre 17, 2008)
- Supporto alla sintassi Java 5
- Supporto al contextmenu (tasto destro)
- Migliorate le DOM api
- API per le Animazioni
- Temi di default
Installazione
- Download da http://code.google.com/intl/it-IT/
webtoolkit/
- Scompattare il file in una cartella
- Fatto !!!
Primo Esempio con Eclipse
Ammesso di aver installato gwt in /opt/gwtmac-1.5.3
Lanciamo i seguenti comandi:
/opt/gwt-mac-1.5.3/projectCreator -eclipse JUG_GWT_1 -out JUG_GWT_1
/opt/gwt-mac-1.5.3/applicationCreator -eclipse JUG_GWT_1 -out JUG_GWT_1
it.jugancona.gwt.client.App1
- Importiamo il progetto da Eclipse
- Lanciamo l’hosted browser attraverso il
file .launch
Eclipse e Web-Tools
Se volessimo usare i web tools di eclipse ?
1. Creare una variabile in eclipse
“GWT_HOME”
Eclipse e Web-Tools
2. Creare un progetto “Dynamic Web” ed
utilizzare “www” al posto di
“WebContent”
Eclipse e Web-Tools
3. Lanciare “applicationCreator -eclipse
[nomeprogetto]” da dentro la cartella del
progetto di eclipse precedentemente creato
4. Aggiornare il progetto da eclipse
5. Aggiungere GWT_HOME/gwt-user.jar al
classpath del progetto
Cosa si può fare con GWT ?
La versione 1.5 mette a disposizione un ottima
vetrina dei widget di gwt
GWT_HOME/samples/Showcase/www/
com.google.gwt.sample.showcase.Showcase/
Showcase.html
GMail
Google Calendar
Google Docs
Punti di debolezza
- Distinzione tra codice java “client side” e
codice java “server side” (non tutta la jdk è
emulata)
- Difficile (ma non impossibile) da integrare in
progetti fatti con altri framework ajax
- Meno “smart” di un semplice javascript che
non richiede compilazione: poco adatto per
abbellire siti html con comportamenti ed effetti
javascript.
Punti di forza
- Refactoring come in java
- Unit Testing
- Performances (ottimizzabili ad ogni rilascio di
nuove versioni del compilatore)
- Debug come in java
- Open Source
- Riesce ad integrare facilmente librerie
esistenti (JSNI)
Punti di forza
- Modulare
- Possibilità di implementare nuovi widget ajax
e di redistribuirli facilmente attraverso un .jar
- Si possono includere moduli GWT che
risiedono su domini diversi rispetto alla
pagina html di inclusione
- Pieno utilizzo dei CSS
Fino a che punto ottimizza ?
Esempio di ImageBundle
package it.jugancona.gwt.client.images;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.TreeImages;
public interface MyTreeImages extends TreeImages {
}
@Resource("cartella_chiusa.gif")
public AbstractImagePrototype treeClosed();
@Resource("cartella_aperta.gif")
public AbstractImagePrototype treeOpen();
@Resource("doc_consolidato.gif")
public AbstractImagePrototype treeLeaf();
ImageBundle
Per disegnare questo:
Il compilatore genera
questo:
ImageBundle
Non più
3 get per ognuna delle icone dell’albero
Ma ...
1 get per tutte le icone dell’albero
E questo a volte risulta più veloce, specie con
tante immagini di piccole dimensioni.
Secondo Esempio:
Utilizzo di una
Remote Procedure Call
Illustriamo come implementare una semplice
chiamata ajax ad un servizio lato server.
Remote Procedure Call
L’iterfaccia principale
package it.jugancona.gwt.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
@RemoteServiceRelativePath("TestService")
public interface TestService extends RemoteService {
}
String faiQualcosa(String param);
Remote Procedure Call
L’iterfaccia Async
package it.jugancona.gwt.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface TestServiceAsync {
}
void faiQualcosa(String param, AsyncCallback<String> callback);
Remote Procedure Call
L’implementazione
package it.jugancona.gwt.server;
import it.jugancona.gwt.client.TestService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
public class TestServiceImpl
extends RemoteServiceServlet implements TestService {
private static final long serialVersionUID = 1L;
}
public String faiQualcosa(String param) {
return "Mi hai passato '"+ param + "' come parametro.";
}
Remote Procedure Call
Il client
final TestServiceAsync service = GWT.create(TestService.class);
Button b = new Button("Prova RCP");
b.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
service.faiQualcosa("Parametro", new AsyncCallback<String>() {
public void onSuccess(String result) {
Window.alert(result);
}
public void onFailure(Throwable caught) {
Window.alert(caught.getMessage());
}
});
}
});
Remote Procedure Call
Configurazione per il testing
<?xml version="1.0" encoding="UTF-8"?>
<module>
<inherits name="com.google.gwt.user.User"/>
<entry-point class="it.jugancona.gwt.client.Example1"/>
<inherits name="com.google.gwt.user.theme.standard.Standard"/>
<servlet
class="it.jugancona.gwt.server.TestServiceImpl"
path="/TestService"/>
</module>
Funziona!
Struttura finale
del progetto
Cosa bolle in pentola ?
1.6 Roadmap
Q1 2009
- Deploy come war semplificato
- Una architettura più configurabile che
permetta di usare altri servlet containers oltre
che il Tomcat con l’Hosted Mode browser
- Event handlers Uniformati
- Altri widgets (DatePicker, LazyPanel) presi
dall’incubator
- Miglirare le performance delle Stringhe
- Compilazione più veloce
?