GWT : Google Widget Toolkit

Transcription

GWT : Google Widget Toolkit
Article : Méthodologie de développement
Xavier MEHAUT est un consultant senior
d'EDIS Consulting. Il assume aussi
depuis peu le leadership du Centre de
Compétences Interne en Génie Logiciel.
Méthodologie de développement
GWT : Google Widget Toolkit

Son expérience et sa curiosité l’amènent
régulièrement à identifier, très tôt, les
vrais sujets de demain. Il nous livre dans
cet article un très riche retour
d’expérience.
Introduction
Août est là ; il fait chaud dehors, les esprits fondent, les idées s’évaporent. Voici la douche fraîche tant
attendue : GWT. Kesako ? Google Widget Toolkit, le framework RIA open source de Google. RIA ? Encore un
gros mot pour Rich Internet Application, le pendant Web du RCP (Rich Client Platform) cher à l’écosystème
Eclipse.
En d’autres termes, GWT est un framework de développement dont le but est de permettre la création
d’applications Web dont la richesse fonctionnelle et graphique n'a rien à envier à celle des applications de type
« desktop » et que l’on nomme traditionnellement client lourd voire riche.
GWT existe depuis mai 2006 et a été développé par Google. Pour ma part, j’ai commencé à l’utiliser dès sa
sortie pour le maquettage d’une application chez mon client d’alors. J’avais pour contrainte de ne pas utiliser de
serveur, et je devais donc m’orienter vers une approche tout Visio / PowerPoint, ou tout JavaScript pour pouvoir
maquetter l’application.
Ces contraintes n’étaient pas compatibles avec le temps que j’avais pour formaliser les exigences de la maîtrise
d’ouvrage et réaliser cette maquette. Je m’apprêtais à utiliser Flash quand GWT est apparu ; c’était le genre de
paradigme de développement que je cherchais depuis longtemps. J’ai aussitôt téléchargé la première bêta pour
l’évaluer. Quelques pages de démos plus tard, je décidai de réaliser ma maquette avec GWT. Un an après, je
ne regrette rien ; la technologie, encore perfectible, est au rendez-vous des attentes que je mettais en elle.

La technologie
Au lieu de paraphraser, voici ce que Google dit de son poulain :
« Google Web Toolkit (GWT) is an open source Java software development
framework that makes writing AJAX applications like Google Maps and Gmail easy for
developers who don't speak browser quirks as a second language. Writing dynamic
web applications today is a tedious and error-prone process; you spend 90% of your
time working around subtle incompatibilities between web browsers and platforms, and
JavaScript's lack of modularity makes sharing, testing, and reusing AJAX components
difficult and fragile.
GWT lets you avoid many of these headaches while offering your users the same
dynamic, standards-compliant experience. You write your front end in the Java
programming language, and the GWT compiler converts your Java classes to
browser-compliant JavaScript and HTML »
Ce qui est à retenir, c’est qu’il n’est point besoin d’écrire ses pages Web en HTML et JavaScript pour obtenir un
comportement riche voire de l’AJAX (appel asynchrone à des services distants types webservices ou XMLRPC,
par exemple).
L’idée est de développer son IHM en Java sous Eclipse ou Netbeans comme on le ferait avec Swing ou SWT,
de tester l’application avec son debugger préféré et enfin de générer le code HTML / JavaScript pour mettre
celui-ci en production. Le schéma ci-dessous décrit les principales étapes de développement avec GWT :
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
1/14
Article : Méthodologie de développement
Figure 1 : Workflow d’un développement avec GWT.
Expliquons plus précisément ce schéma :

on écrit le code coté client en Java ; l’IHM est un assemblage de panels dans lesquels vont être placés
des widgets graphiques. Ces panels et widgets abstraient des composants HTML/DOM sont
manipulables comme des objets classiques auxquels on adjoint des listeners pour capturer et traiter les
évènements issus du navigateur.

si l’application a pour vocation de communiquer avec un serveur, on écrit dans un deuxième temps, en
Java, les GWT servlets qui seront appelés par l’application coté client.

une fois l’application testée en mode émulé, appelé « hosted », on peut générer le code HTML/
JavaScript final grâce au compilateur fourni par Google. On obtient alors un fichier .war qu’il est possible
de déployer dans son Tomcat ou Jetty ou JBoss preféré.

Avantages de la technologie
Comme je le disais en préambule, GWT inaugure un nouveau paradigme de développement d’applications
Web (si on excepte celui proposé par les applets Java, Flash et maintenant SilverLight) : désormais une
application Web n’a plus besoin d’appeler le serveur à chaque mise à jour d’un composant graphique.
L’idée est de ne faire appel au serveur que pour mettre à jour certaines données de l’application au moment où
l’on en a besoin. Le serveur ne s’occupe plus de construire un page Web qui est affichée dans le navigateur,
mais se focalise uniquement sur la partie métier et renvoie les informations nécessaires à l’application coté
client.
Je vous laisse le soin d’aller sur le site de Google (cf. sections Liens) pour découvrir en détail les
caractéristiques de GWT dont voici, en résumé, les principales :

tout est Java et css en mode développement ; les codes HTML et JavaScript sont obtenus une fois la
compilation réalisée

très efficace (il est couramment admis que développer avec GWT permet d’être 5 fois plus efficace),
optimisation du code JavaScript produit, portabilité du code sur tout type de navigateur (Cross-browsing)
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
2/14
Article : Méthodologie de développement

communications avancées avec le serveur via XMLRPC voire JSON ; on peut par exemple transmettre
de vrais objets Java sérialisés entre le navigateur web et le serveur !

vrai debugging en mode émulé « Hosted »

développement plus simple, homogène (pas de mélange XML, HTML, JavaScript, taglibs, etc.)

permet le MDI (fenêtres imbriquées)

réduit les coûts de développement
fonctionne en mode déconnecté, d’autant plus si connecté avec Google gears


utilisation d’Ajax possible ; il n’est pas nécessaire de rafraîchir toute la page pour avoir des données
actualisées

suppression des fuites mémoire des librairies classiques JavaScript, ou de la lourdeur du chargement ;
le JavaScript est optimisé durant la compilation. Seuls le code et l’API nécessaire sont téléchargés par
le navigateur pour la plate forme cible.

meilleure sécurité

plus d'effet page blanche (transition entres pages chargées)

composants graphiques évolués

programmation modulaire

serveur sans état, états sur le client, meilleurs scalabilité

internationalisation, support de I18N/L10N

support d’IDE multiples : Eclipse, NetBeans, IntelliJ IDEA, Jdeveloper, etc. ; debugging, refactoring,
typage fort, etc.
the last but not the least : GWT est sous licence open source Apache depuis la version 1.3 (12/2006)


Inconvénients
Aucune technologie n'est parfaite, et le choix de telle ou telle technologie est la résultante d'une équation dont
les paramètres varient à l'envie.
Après quelques mois passés avec GWT, je n'ai personnellement pas rencontré de problèmes bloquants ou
rédhibitoires. GWT est très jeune, mais déjà très mature pour son âge : pas de gros bugs, des améliorations
régulières de l'outil, etc. Depuis la version 1.4RC, on peut considérer, je pense, que GWT est suffisamment
stable et abouti pour une exploitation industrielle.
Néanmoins les inconvénients de GWT sont les suivants (à pondérer selon l'équation initiale) :
 cela reste du JavaScript au final ; point positif pour certains, négatif pour d’autres…

du côté client le codage se fait en Java 1.4.2, et non 5 ou 6. Cela signifie qu’il n’y a pas d'annotations,
d'auto-boxing, de boucles de nouvelle génération... En pratique cela n'est pas vraiment gênant car il
faut répéter que le code côté client est un code de présentation et non métier et normalement
l'algorithmique associée n’est pas compliquée. De plus, il faut toujours avoir en tête que le code généré
est du JavaScript...langage non typé par excellence : à quoi peut servir une liste typée dans ce cas,
excepté pour des raisons de génie logiciel.

pour de grosses applications, le cycle émulation/compilation peut être pénible... Mais déjà Google a fait
de gros efforts d'optimisation de la compilation et les résultats sont probants.

il manque encore certains panels, ou certains widgets de base ... mais à n’en pas douter, cela va
venir :-)

quasiment tout panel est traduit en DIV une fois compilé...et on retrouve certains problèmes des DIV...
normal !
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
3/14
Article : Méthodologie de développement

Exemple
Un petit exemple vaut bien des discours. Nous allons construire une petite application d’authentification qui ne
fait pas appel à un formulaire HTML, mais qui exécute un service distant pour la validation implémenté sous
forme de servlet.
Notre application va donc comporter deux parties, une côté client et une côté serveur. Nous utilisons Eclipse
(GWT peut générer un projet Eclipse) pour notre développement. GWT est livré avec un certain nombre de
commandes (sous forme de fichiers .bat) listées ci-dessous :
Ces commandes permettent par exemple de créer un canevas d’application entière.
Nous utilisons le script projectCreator pour créer le projet NewsletterExample ; ce dernier est ensuite chargé
sous Eclipse :

com.ubiside.newsletter.public
: répertoire où sont stockés le fichier HTML d’entrée
(Example.html dans notre exemple) ainsi que le .css et les images de l’application. Le fichier
Example.gwt.xml est le fichier de description XML de l’application utilisé par le compilateur GWT pour
générer le code final.

com.ubiside.newsletter.client
: par convention, le package se terminant par client
contient le code côté client

com.ubiside.newsletter.server
: le package se terminant par server contient le code
côté serveur.
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
4/14
Article : Méthodologie de développement
Côté client
Commençons par la définition de la classe Example, point d’entrée de l’application.
public class Example implements EntryPoint {
// la méthode onModuleLoad est appelée au chargement de la page HTML
// Example.html
public void onModuleLoad() {
// On récupère le point d'entrée du DOM à partir duquel on va créer notre application
RootPanel rootPanel = RootPanel.get();
// Top panel
final VerticalPanel verticalPanel = new VerticalPanel();
rootPanel.add(verticalPanel);
verticalPanel.setSize("100%", "100%");
verticalPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
verticalPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
// Table dans laquelle on place les éléments
final FlexTable flexTable = new FlexTable();
verticalPanel.add(flexTable);
flexTable.setStyleName("example-verticalpanel");
// Bouton de validation
final Button validateButton = new Button();
flexTable.setWidget(2, 2, validateButton);
validateButton.setText("Validate");
// Login label + text box
final Label loginLabel = new Label("Login");
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
5/14
Article : Méthodologie de développement
flexTable.setWidget(0, 0, loginLabel);
final TextBox login = new TextBox();
flexTable.setWidget(0, 1, login);
login.setWidth("200px");
// Password label + text box
final Label passwordLabel = new Label("Password");
flexTable.setWidget(1, 0, passwordLabel);
final TextBox password = new TextBox();
flexTable.setWidget(1, 1, password);
password.setWidth("200px");
// On intercepte les évènements sur le bouton afin de lancer la validation sur le serveur
validateButton.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
// on crée une instance de notre validateur de
// login/password
ValidatorAsync validator = Validator.Util.getInstance();
// on définit la callback utilisée pour récupérer de manière asynchrone
// les infos venant sur serveur
AsyncCallback callback = new AsyncCallback() {
public void onSuccess(Object result) {
// méthode exécutée en cas de succès
String str = (String) (result);
Window.alert(str);
}
public void onFailure(Throwable caught) {
// méthode exécutée en cas d'erreur
Window.alert("erreur de communication avec le serveur");
}
};
// On execute la commande de validation, ie on appelle le servlet
// correspondant sur le serveur.
// Ce dernier renvoie le résultat via le callback ci-dessus
validator.validate(login.getText(), password.getText(), callback);
}
});
}}
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
6/14
Article : Méthodologie de développement
Définition de l’interface Java ValidatorAsync décrivant le service distant à appeler.
public interface ValidatorAsync {
public void validate(String login,String password,AsyncCallback callback);
}
Côté serveur
Du côté serveur, on définit la classe Servlet implémentant le service décrit ci-dessus :
public class ValidatorImpl extends RemoteServiceServlet implements Validator {
private static final long serialVersionUID = 1L;
public String validate(String login, String password) {
if(login.length()==0) return "NOK";
if(password.length()==0) return "NOK";
return "OK";
}
}
Fichier de configuration XML
La configuration de GWT s’effectue au moyen de fichiers XML simples appelés Modules. Une application GWT
est composée d’un ou plusieurs modules ; pour simplifier, on peut comparer un module à une librairie Java du
type .jar. Un Module regroupe tous les paramètres de configuration dont le projet GWT a besoin, c'est-à-dire :
 Les autres modules hérités

un nom de classe de point d’entrée

les différents chemins d’accès (public et source) dont ceux pour la localisation des Servlets côté serveur

les règles de liaisons différées, incluant les fournisseurs de propriétés et les générateurs de classes
Exemple :
<module>
<inherits name="com.google.gwt.user.User"/> // Module par défaut ; on peut en ajouter d’autres
<entry-point class="com.ubiside.newsletter.client.Example"/> // Classe point d’entrée de l’appli
<servlet
appelé
path="/Validator"
class="com.ubiside.newsletter.server.ValidatorImpl"/>
//servlet
</module>
Nous n’avons plus qu’à lancer le script GWT de compilation de l’application en JavaScript et nous obtenons un
fichier .war que l’on peut déployer, par exemple sous Tomcat.
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
7/14
Article : Méthodologie de développement

La maquette / prototype
Contexte
Dans le cadre de la mission prise en charge chez mon client (une filiale de Natixis spécialisée dans l'information
d'entreprise), nous avons développé un prototype fonctionnel à partir du cahier d’exigences discuté avec la
maîtrise d’ouvrage. Le but de ce prototype était de valider, très en amont dans le cycle de vie du logiciel, les
fonctionnalités à implémenter d’une part, et les grands choix ergonomiques d’autre part. Le look & feel, quant à
lui, s’il respecte la charte graphique de l’entreprise, n’était pas prioritaire.
Le but du projet est une application d’information d’entreprises :

de l’identification d’entreprise, i.e. obtenir des informations de type bilan sur une entreprise déjà
identifiée

du ciblage d’entreprises, i.e. récupérer toutes les entreprises satisfaisant un certains nombres de
critères de type pays, nombre d’employés dans l’entreprise, liens financiers (actionnaires, filiales),
structurels (sièges sociaux, établissements secondaires), etc.
J’ai fait le choix d’utiliser GWT pour réaliser cette maquette devenue prototype pour les raisons suivantes :
 la nécessité d’avoir un comportement le plus réaliste possible, en l’absence d’un accès à un serveur
Tomcat ou équivalent ; la logique devait donc être totalement déportée sur le poste client

la réalisation du prototype ne devait pas se faire au détriment de la formalisation des exigences avec la
MOA ; GWT permet un gain de temps de développement suffisamment significatif pour que ce soit le
cas

faire une application de type Web 2.0
Ci-dessous une copie d’écran d’une partie de l’application dédiée à la construction d’une liste de critères de
sélection d’entreprises :
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
8/14
Article : Méthodologie de développement
Figure 2 : Perspective construction d’une stratégie de recherche.
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
9/14
Article : Méthodologie de développement
Architecture et composants développés
Dans le cadre de la réalisation de ce prototype, outre l’implémentation effective des exigences utilisateurs, le
travail s’est articulé autour de la réalisation :
 d’une architecture inspirée d’Eclipse pour faciliter et systématiser le développement ; implémentation de
notions de Thème, Perspective, View, Inversion de contrôle, etc. Cette implémentation premier niveau
aurait besoin maintenant d'être refactorée pour la rendre plus générique.

développement de composants génériques abondamment réutilisés au cours du développement
Je ne rentrerai pas dans tous les détails dans le cadre de cet article, mais vous trouverez ci-dessous des
exemples de composants développés pour les besoins de l’application.
TreeSelection Widget avec filtre ou non
Permet la sélection d’items dans un arbre, avec possibilité ou non de filtrer les contenu de l’arbre gauche à partir
d’une chaîne de caractère entrée dans le champ texte “Choices”.
Figure 3 : Treeselection et dérivés.
Ce composant a été ensuite sous-classé pour obtenir des sélections de type arbre vers liste, arbre vers champ
texte, arbre avec entrée pour chaque sélection de valeurs associées, etc.
StateDialog
Ce composant Boîte de dialogue à états permet de composer des wizards séquentiels similaires à ceux
d’Eclipse, implémenté sous forme de div déplaçable et non de popup window.
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
10/14
Article : Méthodologie de développement
Figure 4 : State dialog.
GroupBox
Comme son nom l’indique, ce composant permet de grouper des widgets graphiques d’une part, mais aussi de
les occulter en une seule opération (voir ci-dessous) :
Figure 5 : Groupbox.
InfoComponent
Permet d’afficher un commentaire repliable avec une bulle d’info, ou un raccourci vers une page d’aide externe.
Figure 6 : Info component.
ValueChoosers
Il s’agit d’une hiérarchie de composants dont le but est l’entrée de valeurs discrètes de type entier, date,
sélection dans une combo-box, .etc.
Figure 7 : Date value chooser.
Figure 8 : Integer value chooser in two modes : single or range.
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
11/14
Article : Méthodologie de développement
Cerfa sheet component
L’idée derrière ce composant est de reproduire une feuille Cerfa de bilan d’entreprise (actif, passif, grandes
masses, etc.). Ce composant affiche les données de manière complétement automatique.
Figure 9 : Cerfa component.
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
12/14
Article : Méthodologie de développement

La concurrence
Avec GWT, nous sommes confrontés, comme indiqué précédemment, à un nouveau paradigme de
développement qui demande de repenser la façon dont on conçoit une application client léger. Jusqu’à présent,
le navigateur n’était qu’un vecteur d’affichage des informations compilées et présentées du côté serveur. Les
technologies utilisées vous les connaissez ; ce sont les JSP, ASPx, PHP, JSF, Struts, Wickets, OpenLaszlo, ...
Au fil des années, toutes ces technologies ont essayé de combler les lacunes de ce genre de développement,
mais sans changer la façon de voir les choses.
Aujourd’hui un nouveau paradigme est proposé aux concepteurs et développeurs d’applications Web : le client
devient partie intégrante de l’application et on y déporte une partie de l’intelligence de cette dernière. Le but n’est
évidemment pas d’y déporter la partie métier comme on pourrait être tenté de le faire, mais de laisser cette
tâche à la partie serveur. Le client léger devenu riche va s’appliquer à gérer les interactions de la manière la plus
souple possible avec l’utilisateur, voire à effectuer des contrôles de premier niveau, laissant le soin au serveur
de faire ceux de second degrés.
Les acteurs aujourd’hui de ce nouveau paradigme sont, en résumé, les suivants :
 Flash, Flex, Appollo (Adobe)


GWT (Google)

SilverLight (Microsoft), MoonLight (Mono)

JavaScript à la mimine ou à partir de libraries du type dojo, ui-ext, ...

XUL dans le monde Mozilla

...
Conclusions
GWT vient de fêter sa première année d’existence ; beaucoup ont eu des doutes sur cette nouvelle technologie,
mais il semble que désormais nombre de ceux-ci sont levés. Bien entendu, GWT n’est pas le Graal du
développement d’application riches pour navigateur Web. Il offre toutefois une nouvelle perspective, ce dont
nous avions besoin. Cette technologie ou celles qui lui succéderont ont pour but de réconcilier les applications
riches sur le desktop et celles sur navigateur.
Tout un spectre de possibilités s’ouvre désormais. Voici quelques pointeurs pour les mois et années à venir :
 Connexion GWT et Google Gear : persistance locale de informations

GWT+Spring, et/ou GWT/Struts2


GWT+Seam
GWT + Google Guice (http://glaforge.free.fr/weblog/index.php?itemid=208)

GWT sur Iphone (safari est le vecteur privilégier pour les applications sur l’Iphone)

GWT for Flash (prospectif, mais d’ores et déjà séduisant)
Le retour de X-Window dans un navigateur et du mainframe côté serveur ? (du poil à gratter en
perspective !)

Je ne jouerai pas les prosélytes de GWT ; les technologies viennent et partent. Les pythagoriciens l'avaient bien
compris, eux qui refusaient d'écrire leurs théories car fixer sur un support une connaissance la rendait déjà
obsolète. Ils préféraient la transmission orale à celle écrite. Je ne ferai donc que souffler à votre oreille qu'une
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
13/14
Article : Méthodologie de développement
technologie pertinente, bien pensée et réalisée (allez voir le code source de GWT !) est désormais à votre
disposition à côté d'autres tout aussi intéressantes... Laissez-vous séduire !

Liens
Vous trouverez ci-dessous quelques liens parmi d’autres vous permettant d’aller plus loin dans la
compréhension du phénomène GWT :

Le site officiel GWT, assez aride mais suffisant :
http://code.google.com/webtoolkit/

Le blog de Didier Girard sur GWT :
http://www.ongwt.com/

Un outil payant (pas cher) pour développer sous eclipse avec GWT :
http://www.instantiations.com/windowbuilderpro/gwt/

Bouquin GWT in Action :
http://www.amazon.fr/Gwt-Action-Easy-Google-Toolkit/dp/1933988231

Petit tutorial :
http://engr.smu.edu/~dharmend/cse7392/GWT%20Project%20Setup.pdf

Le MDI sous GWT GWT Window Manager :
http://www.gwtwindowmanager.org/

Article Developing ajaxified Web Applications with Ease :
http://jax.prodyna.de/jaxdocs/jaxgwt.ppt

Un premier projet en GWT expliqué pas à pas :
http://moritan.developpez.com/tutoriels/Java/gwt/premier/projet/

Et comme la pertinence émerge de la confrontation des analyses, un article présentant un avis
divergent :
http://www.dotnetguru2.org/bmarchesson/index.php?title=les_limites_du_miracle_gwt
Xavier MEHAUT, EDIS Consulting
© EDIS Consulting
www.edis-consulting.com
ISI - Article - Présentation GWT -gwt_1.6.doc
14/14