GWT
Créer des applications web interactives avec Google Web Toolkit (versions 1.7 et 2.0)
Olivier Gérardin Directeur technique de Sfeir Benelux (groupe Sfeir)
Préface de Didier Girard Directeur des opérations et de l'innovation de Sfeir Paris (groupe Sfeir) 978-2-10-054628-2 Préface
JavaScript : je t’aime, moi non plus Depuis que je développe des sites ou des applications web, j’ai toujours recherché la technologie qui me permettrait de développer des sites web avec la meilleure expérience utilisateur. La raison est simple, meilleure est l’expérience utilisateur et plus il y a de chances pour que l’internaute revienne. C’est tellement simple, c’est tellement vrai. Cette quête permanente de la meilleure technologie fait certainement de moi un technophile. Je n’en suis pas moins un technophobe : la technologie ne m’intéresse pas pour ce qu’elle est, mais pour ce qu’elle me permet de créer. Ainsi, chaque mois je teste un grand nombre de « nouveautés qui vont révolutionner le monde du développement logiciel » et j’en rejette autant avec tout le dégoût provoqué par la perte du temps consacré. Pour tester une technologie, mon approche est simple, quinze minutes pour comprendre, une heure pour faire un Hello World et huit heures pour résoudre un problème qui me tient à cœur. C’est ainsi qu’au fil des années, j’ai développé des sites web en Shell, Perl, SSJS, ASP, .NET, Flex et Java. Année après année, une technologie revenait sur mon banc de test : sa puissance, son universalité, sa simplicité me plaisait. Pourtant, après quelques heures d’utilisation, je n’avais qu’une envie : la jeter par la fenêtre. Cette technologie était JavaScript. Pendant des années mes sites ont donc contenu le minimum syndical de JavaScript et je voyais arriver la vague AJAX comme un raz de marée qui allait m’engloutir faute de pouvoir aimer le cœur de cette approche.
GWT : Bon pour l’utilisateur, bon pour le développeur GWT va me sauver. Sur le papier, cette technologie pensée par Google correspond à ce que j’attendais : bonne pour l’utilisateur, bonne pour le développeur. En cinq minutes, j’ai compris son fonctionnement et sa puissance « coder en java, compiler en JavaScript » ; en quinze minutes, j’ai fait mon premier Hello World ; en huit heures j’ai développé une application qui me semblait impossible à réaliser quelques heures auparavant. J’étais conquis. L’accueil par les développeurs Web 2.0 était pourtant mitigé, l’approche adoptée par GWT blessait les puristes ou les influenceurs du Web : JavaScript n’était plus considéré comme un langage pour programmer le Web, mais VI GWT
comme un simple assembleur permettant d’exécuter le Web. L’intensité du rejet par ces puristes était sans doute à l’échelle du potentiel de GWT qui : • propose une bonne expérience utilisateur ; • est facile d’utilisation ; • est compatible avec les meilleurs environnements de développement ; • aide à résoudre des problèmes difficiles de manière simple et efficace ; • est soutenu par une communauté enthousiaste et en expansion rapide ; • facilite la maintenance ; • garantit une bonne performance ; • est fun ; • est gratuit et libre d’utilisation.
Et nous : Invention et Innovation En créant GWT, Google ouvre une nouvelle ère du développement et rend accessible à tous les développeurs la réalisation de sites web de nouvelle génération. Cette invention permet d’améliorer la satisfaction client tout en innovant, c’est pour cela que je l’ai adoptée et que je la conseille à mes clients.
Ce livre Il existait actuellement beaucoup d’ouvrages en anglais sur GWT, il manquait un ouvrage en français qui permette aux nombreux développeurs francophones de découvrir cette technologie et ces concepts dans leur langue. C’est ce que propose Olivier avec talent. Présenter une technologie n’est jamais aisée, les livres sont souvent trop techniques ou pas assez, c’est selon. Ce livre a le bon dosage, il vous permettra à la fois de bien débuter avec la technologie mais aussi d’approfondir les concepts importants afin de développer des applications ayant la qualité requise pour une utilisation en entreprise. Je le conseille donc à toute personne qui veut bien démarrer avec GWT, que ce soit dans le cadre d’une activité de veille technologique, dans le cadre du démarrage d’un projet ou dans le cadre de monitorat. Bonne aventure technologique, Didier Girard http://www.google.com/search?q=Didier+Girard Table des matières
Préface ...... V
Avant-propos ...... XIII
Première partie – Développer avec GWT
Chapitre 1 – De HTML à GWT ...... 3 1.1 AucommencementétaitHTML ...... 3 1.1.1 La notion d’URL ...... 4 1.1.2 La technologie derrière les pages ...... 5 1.2 L’apparition despagesdynamiques...... 5 1.2.1 CGI ...... 6 1.2.2 Server-side Scripting : PHP & Cie ...... 6 1.2.3 Java côté client : les applets ...... 6 1.2.4 Les servlets et JSP ...... 7 1.2.5 Client-side Scripting et JavaScript...... 7 1.2.6 Du vrai client-serveur en JavaScript : XmlHttpRequest et AJAX ...... 9 1.3 L’étapesuivante: GoogleWeb Toolkit ...... 9 1.3.1 Les challenges ...... 9 1.3.2 Les réponses de GWT ...... 10 1.3.3 L’historique de la plate-forme...... 11 VIII GWT
Chapitre 2 – Hello, GWT ...... 13 2.1 L’environnement de développement...... 13 2.1.1 Les plugins GWT ...... 15 2.2 Installation...... 15 2.2.1 Le choix de la plate-forme ...... 15 2.2.2 Installation d’Eclipse...... 16 2.2.3 Installation de GWT ...... 16 2.2.4 Google Plugin pour Eclipse ...... 17 2.3 Anatomied’unprojetGWT ...... 18 2.3.1 Nommage des packages et structure des dossiers ...... 18 2.3.2 La page HTML hôte ...... 19 2.3.3 Le point d’entrée ...... 20 2.3.4 Le fichier module...... 21 2.4 Hello,GWT...... 22 2.4.1 Création du projet...... 22 2.4.2 Création du module GWT ...... 24 2.4.3 Création du point d’entrée ...... 27 2.4.4 Création de la page HTML hôte...... 28 2.4.5 Lancement de l’application ...... 29
Chapitre 3 – Développer avec GWT ...... 31 3.1 Hosted mode vs web mode ...... 31 3.2 ContraintessurlecodeJava...... 32 3.2.1 Support du langage ...... 32 3.2.2 Émulation des classes du JRE ...... 33 3.3 Lancerenmodehôte...... 35 3.3.1 Le serveur d’applications intégré ...... 36 3.4 Compileretlancerenmodeweb...... 36 3.4.1 Les fichiers générés par le compilateur GWT ...... 37 3.5 Développementavecl’IDE...... 38 3.5.1 Debug et cycle de développement ...... 39 Table des matières IX
Chapitre 4 – Widgets, panels, etc...... 41 4.1 Uneinterface graphiquedynamique...... 41 4.1.1 Les widgets GWT...... 42 4.1.2 GWT et les aspects graphiques ...... 42 4.2 Widgetsetpanels...... 43 4.2.1 Événements et Handlers ...... 43 4.2.2 Widgets simples ...... 44 4.2.3 Panels ...... 60
Chapitre 5 – Communiquer avec le serveur...... 71 5.1 Codeclientvscodeserveur...... 71 5.2 LesprincipesdeGWTRPC...... 72 5.2.1 Classes et interfaces mises en jeu ...... 73 5.3 Lacréationd’unservicepasàpas...... 74 5.3.1 Écriture des interfaces et de l’implémentation ...... 74 5.3.2 Déploiement sur le serveur embarqué ...... 76 5.3.3 La réalisation d’un appel RPC ...... 77 5.4 Exemplecomplet...... 78 5.5 Utilisationd’unserveurexterne ...... 81 5.6 Contraintesdesérialisation...... 82 5.6.1 Types sérialisables déclarés par l’utilisateur ...... 83 5.7 Lesexceptions...... 83
Deuxième partie – Aller plus loin avec GWT
Chapitre 6 – Internationalisation ...... 89 6.1 Les possibilités d’internationalisation de GWT...... 89 6.1.1 Importer le module I18N ...... 90 6.2 Internationalisation « statique » ...... 90 6.2.1 L’interface Constants ...... 91 6.2.2 Gestion des locales multiples ...... 96 6.2.3 Annotations...... 102 6.2.4 L’interface ConstantsWithLookup ...... 103 X GWT
6.2.5 L’interface Messages ...... 104 6.3 Leformatagedesdatesetnombres...... 105 6.3.1 NumberFormat ...... 105 6.3.2 DateTimeFormat ...... 106
Chapitre 7 – Mécanismes avancés du compilateur ...... 107 7.1 JSNI(JavaScript Native Interface)...... 108 7.1.1 Le principe ...... 108 7.1.2 Écrire une méthode JSNI ...... 108 7.1.3 Accéder à des objets Java depuis JSNI ...... 108 7.1.4 Règles de passage de paramètres ...... 110 7.1.5 Traitement des exceptions ...... 110 7.2 Deferred Binding ...... 110 7.2.1 Principes...... 110 7.2.2 Mise en oeuvre du Deferred Binding ...... 112
Chapitre 8 – Le mécanisme d’historique de GWT...... 115 8.1 Leproblème...... 115 8.2 L’approchedeGWT...... 116 8.2.1 URL et fragment...... 116 8.2.2 Encoder l’état de l’application ...... 116 8.2.3 Mise en oeuvre ...... 117 8.3 Unexemple...... 117 8.3.1 Créer une entrée dans l’historique ...... 117 8.3.2 Réagir à un événement historique ...... 118 8.4 LewidgetHyperlink...... 119
Chapitre 9 – Envoyer des requêtes HTTP...... 121 9.1 Au-delàdeGWTRPC...... 121 9.2 RequêtesHTTPenGWT...... 122 9.2.1 Réalisation d’un appel HTTP ...... 122 9.3 ManipulationdeXML...... 124 9.3.1 Le DOM XML ...... 124 9.3.2 Parsing d’un document XML ...... 124 Table des matières XI
9.3.3 Création d’un document XML ...... 125 9.4 ManipulationdeJSON...... 126 9.5 Accèsàdes web services JSON ...... 128 9.6 Proxyserveur...... 131
Chapitre 10 – Créer ses propres widgets...... 133 10.1 Sous-classerun widget existant...... 134 10.2 Utiliserlaclasse Composite...... 134 10.3 Implémenter complètement un widget en Java...... 135 10.4 Implémenter tout ou partie d’un widget en JavaScript...... 136
Chapitre 11 – Bibliothèques tierces ...... 139 11.1 Bibliothèquesdecomposants...... 139 11.1.1 GWT-ext ...... 139 11.1.2 Ext-GWT ...... 145 11.1.3 SmartGWT...... 149 11.1.4 Autres composants ...... 149 11.2 Bibliothèquesutilitaires...... 152 11.2.1 Gwittir ...... 152 11.2.2 GWT Server Library ...... 152 11.2.3 Google API ...... 152
Chapitre 12 – GWT 2.0 ...... 159 12.1 Obtenirla dernièreversion deGWT...... 160 12.1.1 Prérequis ...... 160 12.1.2 Génération de GWT ...... 161 12.2 OOPHM...... 161 12.2.1 Utilisation ...... 164 12.3 Code splitting &SOYC...... 166 12.3.1 Insérer un split point...... 166 12.3.2 Story Of Your Compile (SOYC) ...... 168 12.3.3 Optimiser avec le code splitting ...... 172 XII GWT
12.4 UiBinder...... 174 12.4.1 Utilisation ...... 174 12.4.2 Un exemple ...... 176 12.5 ClientBundle...... 178
Annexes ...... 179 Liste des classes de la bibliothèque d’émulation JRE (chapitre 3)...... 181 Exemple de FlexTable avec cellule baladeuse (chapitre 4) ...... 184 Exemple d’appel à un service RPC (chapitre 5) ...... 186 Exemple de mise en œuvre du mécanisme d’historique (chapitre 8) ...... 188 Appel à un service web JSON (chapitre 9) ...... 191 Exemple d’utilisation de l’API Google Gears (chapitre 11) ...... 194 Exemple d’utilisation d’UiBinder pour créer un widget composite (chapitre 12) ...... 197
Webographie ...... 199
Index ...... 201 Avant•propos
Le Google Web Toolkit, ou GWT, est apparu en 2006 un peu comme un OVNI sur la scène du développement d’applications dites RIA (Rich Internet Applications) ou « Web 2.0 ». En effet, il ne rentrait dans aucune des catégories d’outils existant alors pour faciliter le développement de ce genre d’applications. Était-ce un framework web de plus ? Non... Une énième bibliothèque de composants JavaScript ? Non... Une nouvelle plate-forme nécessitant encore un plugin pour fonctionner dans le navigateur ? Non plus... GWT est fondé sur un concept tellement original qu’il n’a pas convaincu grand monde à l’époque : développer et mettre au point en pur Java, et traduire en JavaScript au moment de déployer l’application sur le Web. Les avantages : on développe dans un langage familier et avec un typage fort (Java), dans un environnement familier (son IDE préféré – Eclipse, NetBeans, peu importe), avec des concepts familiers (boutons, panels, listeners, MVC, etc.) ; par conséquent la courbe d’apprentissage pour des développeurs Java est très rapide. D’autre part, toute la complexité de l’adaptation aux différents navigateurs est entièrement assumée par le traducteur Java-JavaScript, et le cauchemar de la prise en compte des différentes variantes de JavaScript entre Firefox, IE, Safari, n’est plus qu’un souvenir. GWT est la traduction technique de la vision qu’a Google des technologies du Web 2.0 : « The browser is the platform » (le navigateur est la plate-forme). GWT n’impose pas de nouveau runtime (pas de plugin nécessaire), il profite de l’infrastructure et des outils en place, et s’intègre parfaitement dans les architectures et avec les technologies existantes. Il offre une transition idéale entre le développement classique et le développement d’applications RIA, avec un investissement humain et technique minimal. La promesse semble trop belle pour être vraie, et pourtant... difficile de lui trouver des défauts : si les premières versions souffraient de quelques problèmes, GWT n’a cessé de progresser, et depuis la version 1.4, on peut considérer qu’il est totalement fiable et efficace, et l’a prouvé sur de nombreux projets. La licence initiale, jugée restrictive par certains, a été remplacée par la licence Apache 2.0, considérée comme une des plus libérales de l’Open Source, ce qui garantit la pérennité du produit. Le XIV GWT
groupe de discussion consacré à GWT compte plus de 20 000 membres, preuve de la vitalité de la plate-forme. J’ai personnellement découvert GWT en 2006, et l’approche m’a immédiatement séduite car elle me permettait enfin de réconcilier la création d’applications AJAX avec l’univers Java qui est le mien depuis de nombreuses années. Cela signifiait surtout qu’il serait désormais possible de mener à bien un projet de ce type en se passant (enfin) d’un « expert JavaScript », ce magicien qui connaît par cœur les subtilités (et les bugs) des différentes implémentations dans les navigateurs, et les astuces qui permettent de les contourner... Si l’approche de GWT m’a séduite, j’avoue avoir eu des doutes sur son applicabi- lité : comment émuler fidèlement la bibliothèque Java du Java Runtime Environment (JRE) ? Comment gérer la généricité ? Comment tester le code ? Les différences entre le langage interprété qu’est JavaScript et le langage compilé qu’est Java ne seront-elles pas rédhibitoires ? Et qu’en sera-t-il des performances ? Cependant, comme à son habitude, Google a fait taire mes doutes en apportant des réponses techniques adéquates, efficaces et innovantes, et c’est sans doute ce qui a fait de GWT un produit réellement utilisable, et pas seulement un concept original. À ce jour, cela fait deux ans que je participe à des projets mettant en œuvre GWT, et sur chacun d’eux il a fait la preuve de sa maturité de la meilleure manière : en se faisant oublier... une fois la configuration en place, il devient un rouage de la mécanique, et permet de se concentrer sur les problématiques propres à l’application. L’intérêt des développeurs pour GWT est fort, mais malheureusement la littérature francophone sur le sujet est rare. J’espère donc au travers de ce livre vous donner toutes les clés qui vous permettront de vous mettre à GWT.
À qui s’adresse ce livre ? Ce livre s’adresse principalement aux développeurs Java ayant un minimum d’ex- périence et qui veulent découvrir et mettre en œuvre Google Web Toolkit. Une connaissance de base du langage Java est requise, ainsi que des principales technologies du Web : HTTP, HTML et CSS, JavaScript. Pour les aspects client-serveur, une connaissance des principes de JEE (Java Enter- prise Edition) est souhaitable, même si nous essayerons d’en rappeler les principales notions lorsque nous y aurons affaire. Avant•propos XV
Comment est structuré ce livre ? Ce livre est découpé en deux parties : • La première partie expose les bases qui permettent de comprendre GWT et de réaliser une application complète : – en situant GWT dans son contexte et en expliquant ses ambitions et le cheminement qui a conduit à son apparition (chap. 1) ; – en montrant comment mettre en place l’environnement logiciel nécessaire et créer un premier projet GWT (chap. 2). Vous y apprendrez également la façon de développer et déboguer avec GWT (chap. 3) ; – en présentant les éléments de construction d’une application GWT, aussi bien graphiques (widgets, chap. 4) qu’architecturaux (communication avec le serveur, chap. 5). • La deuxième partie explorera des concepts avancés qui ne sont pas forcément nécessaires dans toutes les applications GWT, mais qui peuvent répondre à une problématique spécifique : – les possibilités d’internationalisation de GWT (chap. 6) ; – les possibilités avancées du compilateur : JSNI pour incorporer du code JavaScript dans des méthodes Java, et le deferred binding pour générer des versions de code optimisées pour chaque environnement (chap.7); – la gestion de l’historique du navigateur (chap. 8) ; – les possibilités d’envoi direct de requêtes HTTP (chap. 9). On y verra aussi comment manipuler XML et JSON avec GWT ; – les différentes manières de créer ses propres composants graphiques (chap. 10) ; – l’utilisation de bibliothèques tierces avec GWT, que ce soit pour enrichir la palette de composants d’interface utilisateur ou pour fournir d’autres fonctionnalités (chap. 11) ; – enfin, le chapitre 12 qui fera un tour d’horizon des nouveautés de GWT 2.0.
Si la première partie est plutôt linéaire, la seconde peut être consultée indépen- damment et servir de référence.
Remerciements Ce livre n’aurait pas été possible sans la patience de mon épouse, qui a supporté les nombreuses heures durant lesquelles j’étais plongé dans la rédaction de cet ouvrage. Merci également à Didier Girard pour avoir eu l’amabilité de rédiger la préface, pour m’avoir mis en contact avec l’éditeur et pour ses conseils toujours précieux.
PREMIÈRE PARTIE
Développer avec GWT
1 De HTML à GWT
Objectif Dans ce chapitre, nous verrons comment le Web « original » a été conçu, quelles technologies sont apparues pour le rendre plus dynamique et permettre l’émergence d’applications web. Nous verrons quels inconvénients ces technologies possèdent, et comment GWT propose une solution élégante à la création d’applications web dynamiques.
1.1 AU COMMENCEMENT ÉTAIT HTML
Le Web est un concept tellement familier que nous le manipulons quotidiennement pour la plupart d’entre nous. Mais le Web d’aujourd’hui est passablement différent du Web tel qu’il a été imaginé par ses concepteurs, et tel qu’il a vu le jour. Le Web, ou World Wide Web comme on l’appelait encore il n’y a pas si longtemps, est un concept inséparable de celui d’hypertexte. Pour schématiser, l’hypertexte, c’est du contenu (au sens large : texte, images, médias), augmenté de liens qui permettent de passer d’une ancre (l’origine du lien) à la cible du lien (un autre document). L’hypertexte a été implémenté de plusieurs manières, indépendamment du WWW, notamment dans des systèmes propriétaires et fermés. Tous les documents liés se trouvaient alors dans une base unique, permettant de créer des systèmes documentaires plus riches qu’une collection de simples documents, mais limités à leur propre domaine. La véritable révolution est née de la combinaison d’un langage de description de page (HTML pour Hypertext Markup Language), d’un protocole de transfert approprié aux contenus hypertextes (HTTP pour Hypertext Transfer Protocol), et d’un réseau de données à l’échelle mondiale, l’Internet. Il devenait alors possible de créer des pages 4 Chapitre 1. De HTML à GWT
avec un contenu « riche » (texte et images), incluant des liens vers n’importe quelle autre page, du même site ou d’un autre site quelque part sur la planète.
L’invention du Web L’histoire retiendra que le Web a été conceptualisé au début des années 1990 au CERN à Genève, par Tim Berners•Lee, un physicien anglais, et Robert Cailliau, un informaticien belge. Dès 1990, s’appuyant sur les concepts hypertextes existants, ils envisagent de construire une « toile » reliant des nœuds constitués de pages hypertextes, accessibles au travers de « browsers » sur un réseau. Le concept se concrétise en 1992 avec l’apparition des premiers sites web, et se popularise dès 1993 avec la disponibilité du premier browser graphique, Mosaic, qui remplace avantageusement Lynx, son prédécesseur, un browser uniquement textuel. Dès lors, le nombre de sites et de pages web ne cessera d’augmenter. http://news.netcraft.com/archives/web_server_survey.html
1.1.1 La notion d’URL
Un concept essentiel à la réussite du Web est la notion d’URL, Uniform Resource Locator. Dans le WWW, une URL est une chaîne de caractères formalisée qui est la façon normalisée de désigner une ressource accessible via le Web (en général une page HTML, mais ce n’est pas obligatoire). Une URL est constituée de plusieurs parties, dont certaines sont optionnelles et d’autres non. Dans sa forme la plus commune, une URL se présente de la manière suivante :
http://code.google.com:80/webtoolkit/overview.html On reconnaît les parties suivantes :
• http est le schema qui désigne le protocole à utiliser. À noter que sa valeur conditionne aussi le format du reste de l’URL ; on se limitera ici à la description des URL de type « http » ; • code.google.com est le hostname, c’est-à-dire la désignation de la machine qui héberge la ressource ; • 80 est le port IP à utiliser pour la connexion ; • le reste de l’URL constitue le chemin d’accès à la ressource sur le serveur.
Additionnellement, on peut encore trouver à la suite du chemin :
• une query string commençant par un point d’interrogation ? et spécifiant la valeur de certains paramètres de la ressource, par exemple des critères de recherche : http://www.google.com/search?q=gwt ; • un indicateur de fragment, commençant par un symbole dièse #, qui désigne une sous-partie de la ressource. Dans les pages HTML, cet indicateur est utilisé pour désigner un signet, c’est-à-dire un marqueur dans la page (début de section par exemple). 1.2 L’apparition des pages dynamiques 5
L’URL joue un rôle essentiel dans le WWW car : • elle permet la création de liens hypertextes : la cible de tout lien est désignée par son URL ; • elle permet l’inclusion de ressources (par exemple des images dans une page HTML) en les désignant par leur URL.
Contrairement à un système fermé où la cible d’un lien appartient forcément au système au même titre que la source, le WWW permet de désigner n’importe quelle ressource, quel qu’en soit le propriétaire, au travers de cette chaîne de caractères qu’est l’URL.
1.1.2 La technologie derrière les pages Grâce au WWW et à la notion d’URL, il est donc aisé de saisir une « adresse web » sous forme d’une URL dans un navigateur, et d’accéder à la page correspondante. Que se passe-t-il exactement quand nous tapons une adresse dans un navigateur pour accéder à un site web ? L’URL est alors « déréférencée », c’est-à-dire interprétée et utilisée pour obtenir son contenu. La séquence des événements est la suivante : 1. L’URL est parsée et ses composants isolés. 2. Si le hostname est indiqué par son nom, une requête DNS est faite pour obtenir l’adresse IP correspondante. 3. Une connexion TCP est établie vers cette machine, sur le port spécifié (ou un port par défaut qui dépend du protocole, 80 pour HTTP). 4. Une requête HTTP est construite et envoyée au serveur via la connexion ouverte. Cette requête peut contenir un certain nombre d’informations, mais elle contient en particulier le chemin relatif du document accédé (dans notre exemple, /webtoolkit/overview.html). 5. Le serveur répond en renvoyant une réponse HTTP. Si tout est correct, la réponse contient le document demandé, ainsi que d’autres informations, en particulier un type MIME qui indique le type du document. 6. En fonction du type MIME de la réponse, le navigateur interprétera le contenu différemment : par exemple s’il s’agit de HTML, il va parser et afficher le document ; s’il s’agit d’un fichier PDF, il proposera de l’ouvrir ou de le sauvegarder, etc.
1.2 L’APPARITION DES PAGES DYNAMIQUES
Si ce système fonctionne de façon satisfaisante, il s’agit alors de pages statiques, c’est-à-dire de pages HTML stockées sous forme de fichiers, et servies telles quelles au client. Le besoin apparaît de générer la réponse à une requête HTTP dynamiquement, par l’exécution de code côté serveur, plutôt que par le simple contenu d’un fichier HTML immuable. 6 Chapitre 1. De HTML à GWT
1.2.1 CGI
La norme CGI (Common Gateway Interface) résulte d’une idée simple : le résultat de l’appel à une URL est fourni par l’exécution d’une commande du système d’exploitation. La norme spécifie que les paramètres de la requête (la query string) sont passés à la commande sous forme d’une variable d’environnement ; la sortie standard de la commande est capturée et constitue le résultat qui sera renvoyé au client. C’est la configuration du serveur web qui détermine quelles sont les commandes qui sont ainsi exécutables ; en général un sous-répertoire nommé cgi-bin est désigné et toutes les URL qui pointent vers ce chemin sont considérées comme désignant une commande CGI à exécuter plutôt que comme un fichier dont le contenu doit être renvoyé. Si CGI permet effectivement de générer des pages dynamiques et a été pendant des années le fondement du Web dynamique, il souffre de plusieurs problèmes dont le principal est une inefficacité liée à son principe même : chaque requête déclenche l’exécution d’une commande au niveau de l’OS, et donc le lancement d’un processus. Or la création d’un processus est une opération assez coûteuse en termes de ressources et de temps, et CGI s’est avéré peu adapté lorsqu’il s’agit de monter en charge.
1.2.2 Server•side Scripting : PHP & Cie
Dans le sillage de CGI, d’autres technologies pour rendre dynamique tout ou partie de la page HTML sont apparues, faisant appel à des mécanismes de scripting côté serveur. On retiendra celui qui a le mieux réussi : PHP. PHP propose d’inclure à l’intérieur même de la page HTML des balises spéciales qui sont destinées à être décodées par le serveur. Entre ces balises, du code PHP, un langage interprété et qui est devenu au fil des ans très riche en termes de bibliothèques intégrées. Le serveur web, en général au travers d’un module dédié, reconnaît la présence de code PHP dans une page et l’exécute. Le code PHP peut à son tour produire du HTML dynamique qui sera inclus dans la page retournée au client. Cette technologie a beaucoup d’avantages, notamment la versatilité et la relative simplicité du langage PHP, et la possibilité pour un utilisateur de mettre en ligne lui-même des pages PHP sans compromettre la sécurité. C’est ce qui a fait son succès jusqu’à aujourd’hui. Cependant, PHP reste interprété et donc relativement peu efficace.
1.2.3 Java côté client : les applets
Lorsque le langage Java a été introduit par Sun, sa première application a été la possibilité d’insérer des mini-applications à l’intérieur même d’une page HTML : les applets. Ces mini-applications pouvaient disposer de toute la puissance et la richesse de Java, fournir une interface graphique évoluée avec les composants AWT (et plus tard Swing), ou bien dessiner directement en mode bitmap. 1.2 L’apparition des pages dynamiques 7
Est-ce que l’interactivité, le dynamisme et la richesse des interfaces web seraient finalement apportés par les applets Java ? Malheureusement, les applets ont rapidement et injustement été rangées dans la catégorie « gadgets animés qu’on peut mettre dans un coin d’une page web ». Les raisons de ce semi-échec sont multiples : • le support de Java dans les navigateurs n’était pas universel à l’époque, et était souvent associé à un temps de démarrage important ; • l’implémentation de Java fournie par Microsoft présentait des différences importantes avec celle de Sun qui rendaient difficile la création d’une applet fonctionnant à la fois avec la JVM (Java Virtual Machine) de Sun et celle de Microsoft ; • l’interaction entre l’applet et le reste de la page est la plupart du temps inexistante, car très complexe à mettre en place.
1.2.4 Les servlets et JSP
Pour répondre au problème de scalabilité des pages dynamiques, que CGI et PHP ne résolvent pas de façon satisfaisante, Sun a imaginé le concept de servlet. Une servlet est un composant logiciel (une classe Java) qui est écrit spécifiquement pour répondre à une requête HTTP. La norme spécifie très précisément comment s’effectue l’invocation des servlets, la transmission des paramètres à la requête et en retour du résultat renvoyé par la servlet. L’énorme avantage en comparaison de CGI est que chaque requête est traitée dans un fil d’exécution (thread), ce qui épargne le coût de la création systématique d’un processus. Le serveur contrôle strictement le nombre de threads présents et la distribution des requêtes aux threads au travers d’un dispatcher. Les pages JSP (Java Server Pages) sont intimement reliées aux servlets — bien qu’elles se présentent sous une apparence semblable à une page PHP, c’est-à-dire du HTML dans lequel des balises spéciales introduisent des parties dynamiques —, puisqu’elles sont en fait compilées sous forme de servlet à leur première utilisation. On pourrait dire que servlets et JSP sont donc deux visages de la même technologie, ou plus exactement que JSP est une autre façon d’écrire des servlets. Cependant, dans la mesure où les documents renvoyés par les servlets/pages JSP restent des pages HTML complètes, l’interactivité n’est que peu améliorée en regard des pages servies par CGI ou PHP, puisque la moindre action de l’utilisateur qui nécessite une requête au serveur doit passer par une action de submit HTML et le rechargement complet de la page. Tout au plus a-t-on optimisé le temps de réponse du serveur.
1.2.5 Client•side Scripting et JavaScript
Pour franchir un pas dans l’interactivité, il fallait une technologie capable d’exécuter du code côté client, pour pouvoir réagir aux événements qui se produisent dans le navigateur (frappe d’une touche, changement du focus, clic sur un bouton, etc.). Ainsi 8 Chapitre 1. De HTML à GWT
est apparue la balise HTML