07 février 2011
Objectif : Mars
05 janvier 2011
GWT round trips
La page HTML hôte est chargée par le navigateur (potentiellement mise en cache) et inclut un lien vers le script de sélection, qui lui est configuré pour ne jamais être en cache. Ce script s'exécute et sélectionne la permutation qui convient à votre environnement : navigateur, langue, etc (potentiellement mise en cache) L'exécution de ce script construit l'UI de l'application web et enchaine généralement avec un (voir plusieurs si vous n'avez pas trop bien pensé votre appli) appels RPC.
Au final, on a donc 4 requêtes séquentielles avant que l'application soit disponible pour l'utilisateur.
Pour améliorer les performances du chargement d'une appli GWT, autrement dit la première impression qu'auront vos utilisateurs, il existe plusieurs techniques.
La première, consiste à utiliser une page hôte dynamique [1], une JSP qui va directement inclure le contenu du script de sélection, ainsi que le résultat du premier appel RPC (encodé au format JSON ou GWT-RPC) [2].
La page hôte dynamique nous évite 3 requêtes, contre une petite surcharge de travail côté serveur.
Une autre piste pour aller encore plus loin est proposé dans les derniers builds du compilo GWT, via l'issue 941802. Il s'agit de remplacer la sélection du script côté client par du code côté serveur. La page hôte peut alors contenir directement la permutation GWT adaptée au navigateur client. Ne vous emballez pas, cette option est totalement expérimentale et même pas complète dans le SDK : il vous faudra surcharger le Linker et développer le code d'identification de la permutation, autrement dit retrousser vos manches.
[1] http://code.google.com/intl/fr-FR/webtoolkit/articles/dynamic_host_page.html
[2] http://www.techhui.com/profiles/blogs/simpler-and-speedier-gwt-with
02 septembre 2010
GWT 2.1 will be maven compliant !
But things change
With 2.1 release, GWT Team is looking to nicelly integrate with Maven. We are in contact to see what changes could occur on GWT side to better fit into Maven. The first visible effort is a new "-maven" option in webAppCreator script to generate a maven compliant project structure and the adequate POM.
The maven plugin allready includes an archetype for same purpose. I'll upgrade it to match the webAppCreator one, with some improvements (including Google Eclipse configuration). I've sent the GWT / Google Eclipse Team a list of feature requests to make Maven / Eclipse / GWT work better together.
As a result, I expect to release a 2.1.0 preview releases of gwt-maven plugin for next GWT Milestones, so that the plugin could benefict from changes made on Google side, and the POM generated by webAppCreator could also use those new features.
I also called for a vote on Mojo Dev List to change the development process so that new release of he plugin match a GWT release, and don't support anymore all SDK history. This will make things technically simplier and will drop a large set of obsolete parameters.
Good days Maven users, GWT will become your favorite toolkit in near future !
Update :
You can test a first preview early-adopter draft SNAPSHOT.
Doc is deployed at http://people.apache.org/~nicolas/gwt-maven-plugin-2.1/ (much cleanup needed)
same URL is a maven repo to get the plugin. Test it using (as a single line) :
mvn archetype:generate -DarchetypeRepository=http://people.apache.org/~nicolas/gwt-maven-plugin-2.1 \
-DarchetypeGroupId=org.codehaus.mojo \
-DarchetypeArtifactId=gwt-maven-plugin _\
-DarchetypeVersion=2.1-SNAPSHOT
01 septembre 2010
bye bye bikshed
En 2009, lors de la conférence Google I/O, la session Best Practices for GWT nous présentait les patterns MVP et Event Bus, et leur application en GWT. S'en est suivi une poignée d'implémentations opensource sur googlecode (ici, là ou là) pour mettre en pratique ces bons conseils.
Pour 2010, la roadmap GWT nous annonçait un MVP "officiel", d'où de nombreuses interrogations de la part de ces communautés et une grosse attente du côté du forum des utilisateurs. Vient alors la wave de "design collaboratif" de Ray Rayan, qui sème un sérieux trouble. On y parle de data-binding, d'une nouvelle mécanique client serveur, et pas tellement de MVP ... en tout cas pas dans les termes de 2009 !
Voici qu'arrive bikeshed et sa démo Expense. L'analyse du code de l'exemple montre une véritable usine à gaz dont on comprend mal les rouages, avec pléthore de classes techniques. On comprend rapidement que cette infrastructure doit in fine être générée par l'outillage. Tiens, justement, Google annonce son rapprochement avec Spring Roo sur ce sujet !
Et hier, poum, la nouvelle tombe : bikeshed est mis au placard et retiré du trunk - ce nom étrange était-il prémonitoire ? Il n'en reste que le mécanisme d'échange avec le serveur RequestFactory (basé sur JSON) permettant de faire le lien entre un backend JPA et des DTO utilisés dans l'IHM GWT, et la génération de squelette est déportée dans Spring Roo.
bikeshed était très - trop - ambitieux et complexe. Si un socle MVP fait bien sont apparition dans GWT 2.1 (com.google.gwt.app) il ne reprend pas le vocabulaire de la session Google I/O 2009 et manque cruellement de documentation, en étant de plus marqué "Expérimental". Je regrette que l'équipe GWT se soit embarquée sur un terrain aussi glissant, plutôt que d'inclure un développement externe qui a déjà fait ses preuves et porté par une communauté, comme ils l'ont fait au préalable avec l'incubateur. Les diverses approches MVP proposées en opensource ont fait leur preuves et ne vont même pas souffrir de la concurrence d'un framework mal documenté et expérimental, même intégré au SDK.
Je ne pense pas que cela empêche l'innovation : de très bonnes extensions comme gwt-fx ou gwt-dnd proposent des fonctionnalités qui étendent le scope de GWT vers plus d'interactivité. Flex comme Java/Fx proposent un mécanisme de data-binding pour lier le modèle à la vue en une ligne de code, ce que nous devons faire à grand coup de Handlers et d'événements sur l'Event-Bus en GWT. Des solutions de binding GWT existent pourtant de longue date en opensource : le support des ProperyChangeListeners JavaBean - élément clé du DataBinding - a été proposé dès GWT 1.4, mais le sujet reste non-prioritaire
Wait & See comme on dit ...
18 décembre 2009
Juggers !
Au printemps dernier j’ai proposé à des collègues de “jouer” avec Google App Engine for Java en développant une application pour gérer l’inscription au BreizhJug. Comme beaucoup nous utilisons JugEvents et comme beaucoup nous trouvons cette appli très moche, sans parler de ses plantages réguliers.
Nous sommes partis sur un truc bien trop gros pour nos petites épaules et ça a donc fait plouf en moins de deux.
La conférence de Didier Girard m’a donné envie de repartir sur ce développement, en utilisant une approche plus pragmatique et plus économique :
Les soirées BreizhJUG sont déclarées dans un Google Calendar public. Lieu, date et sujet y sont indiquées, la description servant à définir le(s) speaker(s) – première ligne – et le sujet du jour. L’intérêt ? L’appli Juggers n’a plus à gérer la saisie des événements et les droits d’accès !
L’application utilise gwt-gdata pour accéder à ce Calendar, et récupère donc une liste d’objets structurés, de manière (presque) aussi simple qu’un appel GWT-RPC.
L’inscription elle même n’est pas développée, peut être dans un premier temps sur la base d’une simple Google Form. L’idée est de progresser par tout petits pas, histoire de ne pas finir le bec dans l’eau.
J’en profite pour expérimenter uiBinder, et comme je commence tout juste un projet Wicket je ne peux pas m’empêcher de faire un parallèle : uibinder c’est la facilité de Wicket + la force de GWT, de la bombe atomique ! J’ai ainsi maquetté un widget sympa en HTML/CSS, et je peux le convertir rapidement en widget GWT utilisable partout.
L'appli est également rendue plus sexy grâce à gwt-Fx, en quelque sorte un portage de scriptaculous en GWT (pas juste un wrapper). La dernière version est vraiment bien et très souple d’utilisation.
Vous voulez-voir ce que ça donne ? http://www.juggers.org/ – attention, ce n’est ni une béta ni même une alpha, c’est un early prototype snapshot ;)
NB : ne cherchez pas, ça rend rien de bon sous Internet Explorer. Qui aurait l’idée d’utiliser ce truc de toute façon ?
18 septembre 2009
premiers pas avec GWT 2.0
La mise en oeuvre nécessite de récupérer le SDK (prendre par exemple les builds proposés par SFEIR). Configurer ensuite le plugin en affectant le paramètre gwtHome, pour le forcer à utiliser cette version, alors que par défaut il s'adapte à vos dépendances.
26 mai 2009
Maven, Eclipse et GWT main dans la main

Avec la sortie du Plugin Google Eclipse, il me restait à intégrer proprement le couple Maven + GWT avec l'IDE le plus connu des développeurs java - je n'ai pas dit le meilleur ;p
- import du projet Maven sous Eclipse par m2eclipse. Les dépendances, répertoires de sources et de génération de code sont identifiées et configurés sous Eclipse, et surtout lesmodules d'un multi-projet et dépendances présentes dans le workspace sont "résolues" en tant que références inter-projet et non via les jars du repository local.
- ajout du support GWT (étape encore manuelle, j'y travaille) via Google Eclipse Plugin. Soucis ici, le plugin ajoute lui même les dépendances GWT qui font donc doublon avec celles gérées par m2eclipse. Ca n'a pas l'air gênant à condition bien sûr que les versions soient cohérentes. Si quelqu'un à une astuce je prend ;)
- génération des lanceurs pour les modules de l'application en lançant mvn gwt:eclipse. Cette tâche gère désormais aussi bien les lanceurs "classiques" et ceux exploitant le plugin Google Eclipse (cas par défaut). Au passage, le plugin prépare le répertoire /war du mode hosté.
- un simple run as > web application sur le lanceur généré et le mode hosté démarre. L'URL de la page web hôte n'étant pas déclarée dans le fichier module, j'ai pris comme convention qu'elle porte le même nom que le module et est présente dans son répertoire public. C'est un peu limitatif mais ça doit être assez courant. Sinon il suffit d'éditer la configuration d'exécution.
25 avril 2009
Do you have a Mac ?
09 avril 2009
Google Developer Day – community feedback
Google organisait jeudi en fin d’après midi une soirée pour présenter son AppEngine en version Java à la communauté et récolter un premier feedback. Didier Girard était de la partie, décidément toujours sur les bons coups :)
L'annonce, c'est bien sur Google App Engine for Java + GWT 1.6 + un plugin Eclipse.
Premier point, la plateforme est un pseudo tomcat tournant sur un Java6 « à la sauce Google ». Comprenez que certaines API Java sont blacklistées, soit parce qu’elles n’ont aucun sens sur le « cloud » (java.io.File par exemple), soit pour des questions de sécurité. Il n’est par exemple pas possible de lancer un Thread, et certaines pratiques de réflexion ne sont pas autorisées.
Ces petites limitations ont un gros impact sur les frameworks que nous pouvons utiliser. Guillaume Laforge a fait un gros travail d’analyse sur Groovy pour le rendre compatible (et accompagner ainsi l’annonce très relayée de Google). De nombreux autres frameworks ne sont apparemment pas compatibles. La liste des outils (in)compatibles reste bien sur à construire (je projette d'ailleurs de faire ma première appli AppEngine sur ce sujet).
Autre restriction, la « base de données » de AppEngine n’est autre que BigTable, l’espace de stockage géantissime de Google – et qui n’a rien à voir avec une base relationnelle. DataNucleus (l’ex JPOX) a été choisi pour fournir aux développeurs une approche JDO ou JPA. Bizarrement, c’est la première qui est mise en avant par les wizards et exemples du SDK. JPox était en effet un outil JDO de premier plan, mais la compatibilité JPA n’en est qu’une surcouche. Autre point, déjà JPA a tendance à nous faire faire des choses « pas très bonne au sens relationnel » car on a tendance à oublier trop facilement la base de données qui se cache derrière. Avec BigTable c’est encore pire, car il ne faut pas envisager de passer par des jointures. Autrement-dit, même API qu’en JEE « traditionnel » mais pas mêmes usages et bonnes pratiques !
Pour ceux qui ne veulent (ou peuvent) pas héberger leurs données en dehors de leur SI, Google propose une API « Secured Data Channel », une sorte de trou de souris dans votre Firewall, sécurisée en SSL, et permettant au « cloud » Google d’accéder à vos données. A priori raisonnable, mais ça sent tout de même le hack ;)
Tout ça fait beaucoup de restrictions me direz-vous. Bien sur, pour déployer sur AppEngine une appli « hello world » cela prend deux clics, et l’infrastructure Google peut alors prendre en charge des pics de charge faramineux sans qu’on ait rien eu à prévoir.
Quel est la cible de AppEngine for Java ? Pas les applications JEE, vu l’inconnue sur le bon fonctionnement des frameworks, et surtout pas en l’état vu la nécessité de repenser la persistance des données. Par contre, tout développeur qui fait du JEE au boulot se retrouve en terrain connu pour déployer son appli perso. Et c’est bien la cible de Google : plus d’applications = plus d’utilisateurs du web = plus de revenus. Vous qui n’arrivez pas à vous mettre à PHP, qui ne pipez rien à python, vous allez pouvoir faire votre petite appli Java avec les outils habituels, avec votre API JPA pour stocker des données, avec GWT 1.6 pour faire de supers applis Ajax sans rien y connaître, et publier tout ça sur le Net pour pas un radis. Et si jamais votre site de vente de schewing-gum usagé explose les scores en raison d’un Buzz incontrôlé, l’infrastructure Google tiendra le choc !
- Vous cherchiez une solution de cloud-computing pour votre entreprise ? Attendez que AppEngine se stabilise - ou plutôt, qu’on apprenne à bien l’utiliser et que les frameworks évoluent en conséquence.
- Vous cherchez à héberger votre idée de super appli délire que personne y avait pensé avant, AppEngine est pour vous ! Au mieux, vous allez lancer le nouveau YouTube, au pire, dans 2 ans, vous vous vendrez comme expert AppEngine à tous les cabinets de recrutement ;)
Merci à Didier de m'avoir transmit une invitaton pour cette soirée, qui a soulevé de nombreuses questions et beaucoup d'intérêt ;)
06 mars 2009
Contribution à la doc gwt 1.6
17 décembre 2008
beans binding dans gwt
- D'une part, parce que quelque soit l'évolution de cette JSR, elle sera toujours considérée si un nouveau groupe s'attaque à ce problème de data-binding en Java.
- D'autre part, parce qu'elle propose une API simple et focalisée sur cette unique tâche.
- Enfin, parceque le développeur de cette petite librairie a l'air très motivé !
19 novembre 2008
[VOTE] gwt-maven-plugin
Après plusieurs mois de mise au point et de test sur le terrain, je viens de lancer un vote pour une permière version "officielle" de mon plugin GWT pour maven.
01 septembre 2008
GWT 1.5
Il sera sous peu disponible dans le référentiel Maven, et je vais en profiter pour mettre à jour le plugin associé du projet Mojo.
13 août 2008
GWT et JPA, main dans la main ?
Pour ceux qui ne connaissent pas, H4GWT permet d'utiliser les entités Hibernate/JPA comme données dans une application GWT, ce qui comporte pas mal de complications techniques, habilement résolues par Bruno Marchesson.
Avec le support de Java5 dans GWT, et une "émulation" des annotations JPA, il devient possible d'utiliser le même modèle métier depuis la couche de persistance jusqu'à l'IHM web. Tout le code de type "contrôles et validation" peut alors être placé dans les setters du modèle, c'est à dire là ou il est finalement le plus logique de le placer !
Je n'ai pas pu tester personnellement (mon projet actuel ne s'y prête pas) mais l'idée me plaît beaucoup et me fait définitivement apprécier le concept phare derrière GWT : un langage et une plateforme pour toute la chaîne de développement.
30 juillet 2008
Didier Girard vous invite à déjeuner
Il lance aujourd'hui un projet sur googlecode : NouvelleCuisine. Il s'agit d'un portail web dans l'esprit d'un Netvibes ou d'un iGoogle, mais développé en GWT et uniquement basé sur des ressources statiques : pas de serveur au sens traditionnel ! Même la configuration se fait via une feuille Google SpreadSheet...
Un portail web pour 0€, infrastructure comprise, qui dit mieux ?
Que va t-il rester aux bon gros serveurs de Portlets ?
Si vous cherchez comme Didier un moyen rapide, élégant et moderne pour classer vos fiches de cuisine, c'est l'une des solutions à tester. Ca marche d'ailleurs pour plein d'autres utilisations ;-)
Amusant aussi de découvrir sur ongwt.com le compte rendu du commité de revue de l'architecture technique - comprendre le coin de nappe en papier de la cafet'.
04 juillet 2008
GWT, tests junit et MVC
Lors de la réalisation d'un prototype basé sur GWT, je me suis intéressé à la testabilité du framework. GWTTestCase est très décevant car il utilise un navigateur "hosted mode" caché et lance tout le module GWT. C'est donc un bon support pour des tests d'intégration mais nettement trop lourd (et particulièrement lent) pour des tests unitaires.
Je reprend donc mes marque-pages, et je relis cet article et celui-ci.
Avec GWT 1.5, l'utilisation des types génériques permet de créer un modèle simple pour la mise en oeuvre du pattern "Supervising Controller" :
D'abord la notion d'événement, dédié à un composant donné (nb: à cause d'un bug de blogger, j'ai mis des crochets pour la déclaration des types génériques) :
- public abstract class Event
[T] - {
- private T source;
- public Event( T source ) {..}
- }
..la source qui produit ces événements :
- public interface EventSource
[T] - {
- void addListerner( Listener
[Event[T]]listener ); - void removeListerner( Listener
[Event[T]]listener ); - }
..et une classe abstraite pour construire nos SupervisingControllers :
- public abstract class SupervisingController
- implements Listener
[Event[T]] - {
- protected T view;
- public abstract Object getModel();
- public void setView( T view )
- {
- this.view = view;
- view.addListerner( this );
- }
- }
Il suffit ensuite de définir la "vue" par une interface, comme dans cet exemple ma pop-up de login :
- public interface LoginDialog extends EventSource
[LoginDialog] - {
- String getLogin();
- String getPassword();
- void hide();
- }
Le contrôleur, lui, étend notre SupervisingController en le typant avec l'interface de la vue "supervisée".
- public class LoginController
- extends SupervisingController
[LoginDialog] - {
- private LoginService service;
- ...
.. et sur réception d'un événement de type 'validation du formulaire de login', il n'a plus qu'à invoquer le service RPC de connexion, mettre à jour les éléments visuels qui vont bien, et fermer la popup :
- public void on( Event
e ) - {
- loginService.login( view.getLogin(), view.getPassword(),
- new AsyncCallback
[ Utilisateur]() - {
- public void onSuccess( Utilisateur result )
- {
- view.hide();
- }
- } );
- }
Gràce au génériques, il n'y a pas de cast à déclarer et le code reste donc plutôt simple.
Qu'est ce que ça change ? Et bien maintenant, avec un simple Mock pour mon interface LoginDialog, et un service RPC de test, je peux tester dans un test jUnit classique la logique IHM de mon contrôleur. Elle est triviale dans l'exemple, mais vous devinez que la gestion d'un formulaire de 20 champs avec des controles croisés peut devenir un enfer sans un bon mécanisme de test.
Ce qu'il manque pour faire "encore mieux" :
- un mécanisme de data-binding entre les widgets et un "modèle". Il existe quelques initiatives opensource, dont le succés et la pérennité sont à évaluer.
- un spring-gwt, qui permettrait de déclarer dans l'exemple ci-dessus l'injection de la vue et du service RPC via une annotation @Resource. Dis Monsier Rod Johnson, tu peux m'inclure ça dans la roadmap spring 3.0 ;-)
20 juin 2008
Atelier RIA : Gwt vs SilverLight vs Flex
Valtech organisait jeudi une journée atelier RIA, une formule originale permettant de comparer sur le terrain Gwt, Flex et SilverLight. Ces trois noms dominent en effet (pour l’instant ?) le monde très actif des Rich Internet Applications.
Petite mise au point pour commencer : une Application Internet Riche n’est pas juste une application web bourrée d'effets visuels. Ce n’est pas non plus une application utilisant Ajax pour en améliorer l’ergonomie ou la réactivité.
Une RIA c’est une application qui a été conçue pour déporter sur le client la couche présentation, tout en conservant sur le serveur des services métier de haut niveau, autant que possible sans état. C’est donc à mis chemin entre le client lourd + serveur de données et le client léger + serveur web de présentation. Le serveur devient alors un conteneur de services métier, ce qui permet de converger avec l'approche SOA.Un exemple parmis d'autres, parleys.com (en version Flex ou Gwt) : le serveur héberge les vidéos et les indexes, toutes la mise en page étant gérée sur le client.
Bien sur, cela s’accompagne souvent d’effets graphiques haut de gamme pour se démarquer des applications web devenues trop statiques. Il faut bien un moyen d'accrocher l'internaute !
Quelle est la difficulté sur ce type d'applications ?
- la mutliplicité des technologies qu'on doit couvrir pour une même application : HTML + CSS + DOM + JavaScript + HTTP/Ajax + JSP + Java + ...
- les exigences de multi-plateforme, en particulier si on vise le monde mobile
- le delta qui existe entre un "hello world" et une application de 100 écrans, en particulier pour venir ajouter de nouvelles fonctionnalités
SilverLight est la solution RIA proposée par Microsoft, nécessitant un runtime encore peu répandu, mais qui pourrait rapidement se généraliser via le meilleur outil de promotion : Windows Update ;-)
La présentation SilverLight était assez décevante, trop orientée design pour un public de purs programmeurs, et ne connaissant pas l'outil Blend la première heure a quasiment été perdue. Nous sommes nombreux à en avoir eu une image négative, sans doute fausse par rapport à cette technologie. J’en retiens trois points majeurs :
- SilverLight et les outils qui l’accompagnent manquent encore de maturité (nous avons utilisé des versions beta, avec de nombreux bugs). Nous n’avons pas utilisé Visual Studio, aussi c’est donc peut-être une fausse impression.
- Le choix de Microsoft de séparer les outils de Design (Expression) de ceux de développement est discutable. Même en confiant ces rôles à deux personnes, on peut être amené à jongler entre les deux.
- SilverLight a l’avantage d’être très homogène, client et serveur se programmant en C#, notion que l’on retrouve dans Gwt.
Flex utilise le runtime Flash 9, déjà installé sur de très nombreux postes.
La présentation Flex était très démonstrative, mettant en avant les capacités graphiques du format Flash. L’environnement FlexBuilder est très appréciable (175€), même si de nombreuses fonctionnalités habituelles en Java manquent (formateur de code, refactoring…). Flex permet de laisser aux graphistes le soin de préparer les objets Flash avec toute la puissance de cet environnement. La programmation nécessite cependant de se familiariser avec ActiveScript, pas infaisable mais pas immédiat non plus. Se pose aussi la question du débogage sur des applications ambitieuses. Flexbuilder est très aboutit et probablement indispensable pour envisager ce type de développement.
Pour ces deux premiers candidats, se pose la question de la disponibilité d’un runtime sur toutes les plateformes, en particulier sur mobiles, marché d’avenir pour ces applications.
GWT est un peu l’intrus dans cette journée. Il se positionne fonctionnellement très en dessous de ses concurrents, sans support pour des effets 3D ou vidéo. Par contre, il est le seul à ne nécessiter aucune installation de runtime.
La présentation GWT était plus une visite guidée d’une application GWT, mettant en évidence les principes clé. Le très gros point fort est le développement 100% Java, qui permet ainsi de coder/tester/deboguer sous Eclipse, par simples « save + refresh », et de bénéficier de l’environnement JDT pour « découvrir » l’API GWT. La programmation GWT est donc assez naturelle pour des développeurs Swing.
J’ai été impressionné par la facilité de construction d’une IHM Flex, et surtout par le très bon niveau de FlexBuilder, qui malgré la filiation du langage ActiveScript avec JavaScript propose un éditeur riche et assez proche de celui d’Eclipse pour Java. Je n’ai pas accroché sur SilverLight, ne serait-ce qu’à cause du langage C# qui m’est peu familier, mais c’est clairement une plateforme avec laquelle il faudra compter. Enfin, GWT a été très bien vendu par Sami ;-). Il reste tout de même un besoin de compétence pour la mise au point des CSS, tout aussi peu homogène au niveau des navigateurs, point qui n'est pas abordé par Gwt - domage.
Mes conclusions ?
- Spring MVC + Spring JS pour des applications web classiques avec un bonus ergonomique, comme expliqué dans mon précédent post, cela permet une migraiton "en douceur" depuis Struts.
- GWT pour des applications RIA de type « gestion », manipulant plus des données que des vidéos ou des effets 3D. Il faut cependant développer une culture "layout" des IHM.
- Flex pour les applications « flashy » (c’est le cas de le dire), avec l’aide inconditionnelle de FlexBuilder.
22 mars 2008
Google Web Toolkit
Mes essais précédents en terme de technos JavaScript se sont tous terminé sur la conclusion : "il va falloir sacrément former les développeurs". Aussi riche que soit une librairie JavaScript, il faut déjà quelques notions pour s'y attaquer. Par ailleurs, tester du code JS, même avec jsUnit, reste un point délicat - surtout si on veut l'effectuer sur un serveur d'intégration continue (en mode console).
GWT a l'énorme avantage qu'on oublie vite qu'on fait en réalité du code JavaScript. J'ai ainsi pu apliquer une jolie décomposition MVC (voir sur le sujet http://blog.springsource.com/main/2008/02/19/enabling-test-driven-development-in-gwt-client-code) sans gros efforts.
Paradoxalement, c'est peut être la plus grande difficulté de GWT : ne pas oublier qu'on développe du code qui sera sur le client : pas de commons-* sous le coude, ni de bean Hibernate !
J'en ai profité pour revoir le plugin gwt pour maven du projet Mojo, qui était plus ou moins à l'abandon (le compilateur GWT ayant le mauvais gout de faire un System.exit() !). Je compte lui ajouter un outil de génération de DTO à partir de beans JPA/Hibernate, à utiliser avec hibernate4Gwt. Mais je ne promet rien, c'est juste un élément de plus dans ma todo-list ;-)
Pour ce qui est de la richesse visuelle des widgets, GWT-ext ou myGWT fournissent une base déjà très intéressante pour faire de jolies applications.


