GWTGoogle Web Toolkit              OXIANE – NOVAE LR           ©Copyright OXIANE      Page 1
Speaker•   Emmanuel PAVAUX        Architecte / Consultant / Formateur        Ancien consultant chez BEA / Oracle•   Oxiane...
Plan de la présentation•   Introduction      RIA, Ajax et l’approche de GWT•   Développer une application GWT      Créatio...
Naissance des RIA (1)•   Lhistoire du développement dapplications a connu    plusieurs grandes phases      Les terminaux p...
Naissance des RIA (2)•   Plusieurs solutions de clients riches ont émergés      RIA (Rich Internet Application) : le navig...
Ajax•   Ajax = Asynchronous JavaScript and XML•   AJAX n’est pas une technologie en elle-même, mais un    terme regroupant...
L’approche de GWT• Mai 2006 - JavaOne : annonce de GWT    Google Web Toolkit    Écrire ses applications clientes riches en...
Avantages de lapproche GWT•   Développer et maintenir des applications JavaScript      Supportant les spécificités et les ...
Principes généraux (1)•   Compilateur de Java vers JavaScript      Supporte une version volontairement simplifiée du JRE  ...
Principes généraux (2)•   Intégration possible avec les frameworks j2ee      JSF, Spring, Struts, EJB, … : côté serveur•  ...
Compilation GWT Java vers JavaScript•   Exécuter la classe com.google.gwt.dev.GWTCompiler      Avec une définition de "mod...
Fichiers générés ("permutation")•   Autant de fichiers que de combinaisons (type de    navigateur, locale, …)•   Les fichi...
DeferredBinding•   Technique pour pallier labsence de "dynamic binding"      En clair : pas de ClassLoader en JavaScript  ...
Développer uneapplication GWT          ©Copyright OXIANE   Page 14
Créer une application•   Installer GWT      Avoir un JRE + un fichier à décompresser : gwt-2.4.0.zip•   Création dune appl...
Tester lapplication : Mode Développement•   Development Mode      Exécution en Java,      Exceptions capturées      Debug ...
Déployer lapplication : Mode Production•   Compilation de lapplication en JavaScript      Prend beaucoup de temps•   Utili...
Interface EntryPoint•   Linterface désignant un point dentrée dapplication•   Méthode onModuleLoad()      Equivalent au ma...
Les fenêtres et les panels•   Notions classiques des interfaces graphiques      Widget = contrôle utilisé par lutilisateur...
Style et placement des widgets•   Méthode setStyleName() pour affecter un style    Dans le code :                         ...
Autres composants•   La bibliothèque sétoffe à chaque version      DatePicker, DockLayouttPanel, …•   Projets open sources...
Outils©Copyright OXIANE     Page 22
Création graphique simplifiée : UiBinder (1)•    Depuis GWT 2.0, UiBinder permet la définition de     widget au format XML...
Création graphique simplifiée : UiBinder (2) •   3 règles pour lier un objet graphique à un attribut du     contrôleur Jav...
Création graphique : GWT Designer (3)•   Outil de création d’interfaces graphiques      drag and drop des composants, ajou...
Création graphique : GWT Designer (4)•   Génère le code XML UIBinder                       ©Copyright OXIANE        Page 26
Speed Tracer•   Outil de profiling sous forme de plug-in Google Chrome      Profile les requêtes,      les temps de parsin...
Bibliothèques•   Composants : GXT (=ext-gwt), GWT-Ext, SmartGWT, ...•   Courbes et graphiques       GChart : implementatio...
Notionscomplémentaires            ©Copyright OXIANE   Page 29
Code Splitting •   Fragmentation de code pour générer plusieurs fichiers     de code Javascript        Chargement au besoi...
Echange de données•   Nécessité déchanger des données avec le serveur      Chercher des données à afficher, transmettre de...
Le bouton "back" du navigateur•   Problème avec le remplacement partiel de la page      Ne compte pas comme un changement ...
Intégration JSNI•   JavaScript Native Interface      Spécifier des méthodes "natives", dont le code existera au runtime   ...
Autres (1)•   I18n utilise le DeferredBinding : GWT.create()        Autant de fichiers js que de locales           Créer l...
Autres (2)•   Log : GWT fournit un Logger        Permet d’avoir une fenêtre de log JavaScript        Configuration de logg...
Conclusion  ©Copyright OXIANE   Page 36
R.E.X•   Annuaire de 4000 personnes pour gérer les conseillers    des prudhommes•   SPA : simple page application, chargé ...
Avantages•   Utilisation de Java      Langage très connu et utilisé      Richesse de la plate-forme et des outils•   Produ...
Inconvénients•   Attention au choix des bibliothèques complémentaires•   Limitations du JRE pour la transcription Javascri...
Conclusion•   Un toolkit puissant et original      Une approche différente du web permettant une ergonomie riche      Des ...
Prochain SlideShare
Chargement dans…5
×

Gwt oxiane-novae-lr

1 144 vues

Publié le

Atelier RIA : “Développement d’applications RIA avec le Google Web Toolkit”
du mercredi 27 Juin 2012 CCI Entreprises de Montpellier

Intervenant :

- Emmanuel Pavaux – Oxiane Méditérranée, cabinet d’ingénierie, de conseil et formation NTIC

GWT (Google Web Toolkit)

Le développement d’applications internet riches (RIA) est une tendance de fond. L’utilisation intensive de JavaScript, de DHTML et des échanges asynchrones (AJAX) est une réalité technique devenue courante pour les nouvelles applications intranet et internet.

La librairie GWT est la solution s’appuyant sur la plateforme java proposée par Google pour masquer la complexité de ces technologies et offrir un modèle de développement web original, simple et robuste aux développeurs.

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 144
Sur SlideShare
0
Issues des intégrations
0
Intégrations
4
Actions
Partages
0
Téléchargements
18
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Gwt oxiane-novae-lr

  1. 1. GWTGoogle Web Toolkit OXIANE – NOVAE LR ©Copyright OXIANE Page 1
  2. 2. Speaker• Emmanuel PAVAUX Architecte / Consultant / Formateur Ancien consultant chez BEA / Oracle• Oxiane Méditerranée • Les solutions Google : GWT et Android • Les portails : Liferay, WebLogic Portail, … • Les serveurs d’applications : WebLogic, … • Les applications Java / Java EE • SOA et Web Services • UML et Design Patterns • Usine logicielle ©Copyright OXIANE Page 2
  3. 3. Plan de la présentation• Introduction RIA, Ajax et l’approche de GWT• Développer une application GWT Création / Test / Déploiement, Composants graphiques• Outils UIBinder, GWT Designer, Speed Tracer, Bibliothèques• Notions complémentaires Code Splitting, Échange de données, Gestion de lhistorique, JSNI, Gestion des évènements, Log, …. ©Copyright OXIANE Page 3
  4. 4. Naissance des RIA (1)• Lhistoire du développement dapplications a connu plusieurs grandes phases Les terminaux passifs (années 70) La révolution du client-serveur (années 80) La révolution internet et intranet (années 90) Clients légers Limites graphiques du HTML (composants graphiques basiques) Manque dinteractivité Nécessité de faire des allers-retours pour une simple information à rafraîchir… Lévolution vers les clients riches (années 2000) ©Copyright OXIANE Page 4
  5. 5. Naissance des RIA (2)• Plusieurs solutions de clients riches ont émergés RIA (Rich Internet Application) : le navigateur web reste le socle côté client. Les possibilités du navigateur sont soit exploitées au maximum (JavaScript et CSS) soit enrichies par lajout de plugins (Flash, Silverlight, JavaFX, …) GWT RDA (Rich Desktop Application) : renaissance du client-serveur 2ème génération, prévoit des solutions pour le problème dinstallation et de mise à jour (ex: Eclipse RCP) ©Copyright OXIANE Page 5
  6. 6. Ajax• Ajax = Asynchronous JavaScript and XML• AJAX n’est pas une technologie en elle-même, mais un terme regroupant l’utilisation de : HTML ou XHTML pour la construction de la page CSS pour la présentation de la page DOM et JavaScript pour manipuler les éléments de la page L’objet XMLHttpRequest pour lire les données sur le serveur de manière asynchrone• La mise au point du JavaScript est délicate Différences de fonctionnement entre les navigateurs. Environnements de développement sommaires Des frameworks JavaScript ont émergés : ext-JS, jQuery, prototypeJS, Scriptaculous… ©Copyright OXIANE Page 6
  7. 7. L’approche de GWT• Mai 2006 - JavaOne : annonce de GWT Google Web Toolkit Écrire ses applications clientes riches en Java Les compiler en JavaScript• JavaScript = le bytecode du web Compris par tous les navigateurs Utilisé comme un langage bas niveau ©Copyright OXIANE Page 7
  8. 8. Avantages de lapproche GWT• Développer et maintenir des applications JavaScript Supportant les spécificités et les versions des navigateurs : IE, Firefox, Safari, Opéra, Chrome Supportant linternationalisation Optimales : versions spécifiques des fichiers javacript produits plutôt que génériques• Utiliser la myriade doutils du monde Java IDE, conception, analyse de code, test, intégration continue, … Permet de gérer des développements complexes Ne pas re-développer tout ça une nouvelle fois ©Copyright OXIANE Page 8
  9. 9. Principes généraux (1)• Compilateur de Java vers JavaScript Supporte une version volontairement simplifiée du JRE Fournit un équivalent JavaScript de ces classes Certaines subtilités String.replaceAll, replaceFirst, split : regexp de JavaScript System.out et err existent mais ne servent pas en mode production …• GWT met à disposition des librairies de classe Java Classes graphiques (widgets, panels) comme du Swing Classes de communication avec le serveur pour échanger des informations structurées (XML, JSON, …) ou des objets Java• Possibilité dintégrer des frameworks JavaScript Ext-JS, Scriptaculous, JSCalendar, … ©Copyright OXIANE Page 9
  10. 10. Principes généraux (2)• Intégration possible avec les frameworks j2ee JSF, Spring, Struts, EJB, … : côté serveur• Développement des applications Navigateur avec plug-in Pas de déploiement préalable Le code qui sexécute est du code Java Communication par socket avec le plug-in qui pilote le navigateur et court-circuite tous les événements Debug en Java, points darrêt, … Tests unitaires avec Junit et GWTTestCase• Compiler en JavaScript ensuite Déployer et tester (mode "production", ex mode "web") ©Copyright OXIANE Page 10
  11. 11. Compilation GWT Java vers JavaScript• Exécuter la classe com.google.gwt.dev.GWTCompiler Avec une définition de "module" et un fichier de configuration (modules hérités, point d’entrée)• Le compilateur part de ce point dentrée Et suit les dépendances pour ne compiler que ce qui est utilisé et minimiser la taille des fichiers générés Produit des fichiers JavaScript spécifiques pour chaque navigateur et pour chaque locale• Attention : nutilise que les fichiers Java (pas les .class) Nécessité de disposer des sources de toutes ses librairies utilisées ©Copyright OXIANE Page 11
  12. 12. Fichiers générés ("permutation")• Autant de fichiers que de combinaisons (type de navigateur, locale, …)• Les fichiers ne sont pas génériques Ne contiennent pas des "if" pour gérer les spécificités• Le navigateur ne reçoit pas de code inutile Diminue lutilisation de la bande passante Diminue lempreinte mémoire dans le navigateur• Modes de compilation OBFUSCATE, PRETTY, DETAILED ©Copyright OXIANE Page 12
  13. 13. DeferredBinding• Technique pour pallier labsence de "dynamic binding" En clair : pas de ClassLoader en JavaScript Impliquerai de tout charger et utiliser ce qui convient Typiquement gestion des spécificités des navigateurs, des locales, …• GWT gère cela à la compilation GWT gère automatiquement les permutations par le DeferredBinding GWT.create(Interface) : obtenir une implémentation dune interface• Utiliser par exemple pour gérer l’internationalisation Formatage des nombres et monnaies, traduction des messages et libellés, sens de lecture Génère un fichier JavaScript pour chaque locale ©Copyright OXIANE Page 13
  14. 14. Développer uneapplication GWT ©Copyright OXIANE Page 14
  15. 15. Créer une application• Installer GWT Avoir un JRE + un fichier à décompresser : gwt-2.4.0.zip• Création dune application par "webAppCreator" webAppCreator -out c:/Hello com.oxiane.App Permet de créer larborescence et les fichiers de base App.gwt.xml : configuration du module Sous package client : code client comprenant App.java : classe "point dentrée" de l’applcation Sous package server : code serveur, java classique sans limitation Sous package shared : code partagé entre le client et le serveur Répertoire war : contient la structure de déploiement web Génère les fichiers Eclipse (".project", ".classpath", …) importable dans les IDE• IDE : Plugin Eclipse, support natif dans IntelliJ, … ©Copyright OXIANE Page 15
  16. 16. Tester lapplication : Mode Développement• Development Mode Exécution en Java, Exceptions capturées Debug Java possible• Moteur jetty embarqué Moteur de servlet Déploiement automatique du code serveur Bouton "Launch Default Browser" ou copie de lurl ©Copyright OXIANE Page 16
  17. 17. Déployer lapplication : Mode Production• Compilation de lapplication en JavaScript Prend beaucoup de temps• Utiliser la target "war" du script Ant Génère un war de lapplication, prêt à déployer Déposer le war dans un server web type Tomcat Tester avec lurl http://localhost:8080/<NomApplication> ©Copyright OXIANE Page 17
  18. 18. Interface EntryPoint• Linterface désignant un point dentrée dapplication• Méthode onModuleLoad() Equivalent au main() de lapplication ou au service() des Servlets• Coder une classe implémentant cette interface• La désigner dans le fichier de description de module <entry-point class=com.oxiane.client.App/>• Le compilateur part de cette classe Et suit les dépendances public class App implements EntryPoint { public void onModuleLoad() { Label label = new Label("Hello world !"); RootPanel.get().add(label); } } ©Copyright OXIANE Page 18
  19. 19. Les fenêtres et les panels• Notions classiques des interfaces graphiques Widget = contrôle utilisé par lutilisateur En général en correspondance avec un équivalent HTML Button, TextBox, TextArea, CheckBox, RadioButton, … Panel = conteneur de widgets (ou dautres panels) Exemple : table disposant un bouton et un champ en ligne Panel pour disposer (layout) mais peut aussi offrir de linteractivité (TabPanel) Window = la fenêtre du navigateur Accès aux méthodes, propriétés et événements du navigateur• Plus de 30 widgets Panel Panel et panels en tout Widget Widget Widget Présentés dans le Showcase ©Copyright OXIANE Page 19
  20. 20. Style et placement des widgets• Méthode setStyleName() pour affecter un style Dans le code : Dans le fichier de styles : widget.setStyleName("special"); .special { float: right; margin: 5px; }• Placement par Layout Manager (GWT 2.0) Pour gérer au mieux le placement des composants fils dans un conteneur de type xxxLayoutPanel En fonction de la taille de lécran, re-dimensionnement, ... Solutions basées sur les standards CSS : top, left, bottom, right, width, height ©Copyright OXIANE Page 20
  21. 21. Autres composants• La bibliothèque sétoffe à chaque version DatePicker, DockLayouttPanel, …• Projets open sources proposent dautres widgets Table triée, calculatrice, panel de dessin, bulle daide,… Widgets wrappant des librairies JavaScript existantes Google Map API, Search API, … GXT (= Ext-GWT) : ré-écriture de ext-JS en GWT, bon design, … GWT-Ext : wrapper de la librairie Ext-JS (avant changement de licence) SmartGWT : wrapper de la librairie Javascript SmartClient• Privilégier les librairies "pures GWT" Plutôt que les encapsulations de librairies JavaScript Debug, compréhension du code, … ©Copyright OXIANE Page 21
  22. 22. Outils©Copyright OXIANE Page 22
  23. 23. Création graphique simplifiée : UiBinder (1)• Depuis GWT 2.0, UiBinder permet la définition de widget au format XML• Un composent graphique est caractérisé par Mécanisme de contrôle des actions une classe Java « NomClasse.java » qui hérite de la classe Composite un fichier XML « NomClasse.ui.xml » <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> <ui:style> /* Ajouter le CSS */ </ui:style> <g:HTMLPanel> /* Ajouter le Code format XML */ </g:HTMLPanel> </ui:UiBinder> ©Copyright OXIANE Page 23
  24. 24. Création graphique simplifiée : UiBinder (2) • 3 règles pour lier un objet graphique à un attribut du contrôleur Java QuantiteWidget.ui.xml <g:HTMLPanel> Utiliser le même nom <g:TextBox ui:field="quantite"> </g:TextBox> Utiliser l’attribut ui:field </g:HTMLPanel> Utiliser l’annotation @UiField dans la classeQuantiteWidget.javapublic class QuantiteWidget extends Composite { private static QuantiteWidgetUiBinder uiBinder = GWT.create(QuantiteWidgetUiBinder.class); interface QuantiteWidgetUiBinder extends UiBinder<Widget,QuantiteWidget> {} //attribut lié à l’object « quantite » dans //QuantiteWidget.ui.xml @UiField TextBox quantite; public QuatiteWidget() {initWidget(uiBinder.createAndBindUi(this));}} ©Copyright OXIANE Page 24
  25. 25. Création graphique : GWT Designer (3)• Outil de création d’interfaces graphiques drag and drop des composants, ajouter des event handlers, éditer les propriétés, internationalisation, … ©Copyright OXIANE Page 25
  26. 26. Création graphique : GWT Designer (4)• Génère le code XML UIBinder ©Copyright OXIANE Page 26
  27. 27. Speed Tracer• Outil de profiling sous forme de plug-in Google Chrome Profile les requêtes, les temps de parsing et les temps de rendus du navigateur Identifie et fournit des conseils sur les problèmes de performance ©Copyright OXIANE Page 27
  28. 28. Bibliothèques• Composants : GXT (=ext-gwt), GWT-Ext, SmartGWT, ...• Courbes et graphiques GChart : implementation pure GWT open source Open Flash Chart• Data binding : Gilead (ex Hibernate4gwt) : permet d’utiliser les objets du Domaine directement sans passer par une couche DTO GWT-Beans• Intégration avec d’autres frameworks : G4JSF : JSF dans le monde GWT GWT-SL et GWT-WL : Spring• GWT-Maven commandes maven GWT (compilation, tests unitaires, interfaces i18n, ...)• Google API Gadgets, AJAX search, Maps, Visualization, Language, ... Encapsulation pour la plupart sauf Gwt-google-apis, GWT-GData (services Google) ©Copyright OXIANE Page 28
  29. 29. Notionscomplémentaires ©Copyright OXIANE Page 29
  30. 30. Code Splitting • Fragmentation de code pour générer plusieurs fichiers de code Javascript Chargement au besoin des différents fichiers javascripts Évite ainsi davoir quun seul gros fichier En plaçant des points de rupture dans le code java clientpublic void onModuleLoad() { public void onModuleLoad() { Button b = new Button("Click me", Button b = new Button("Click me", new ClickHandler() { new ClickHandler() { public void onClick(ClickEvent public void onClick(ClickEvent event) { event) { GWT.runAsync(new RunAsyncCallback() { public void onFailure(Throwable c) {Window.alert("Fail download code");} public void onSuccess() Window.alert("Hello, AJAX"); {Window.alert("Hello, AJAX");} }); } } }); }); RootPanel.get().add(b); RootPanel.get().add(b);} } ©Copyright OXIANE Page 30
  31. 31. Echange de données• Nécessité déchanger des données avec le serveur Chercher des données à afficher, transmettre des informations, …• Plusieurs technologies possibles avec GWT RequestBuilder : une classe qui encapsule XMLHttpRequest Approche bas niveau donnant accès aux requêtes et réponses http Multiples formats de réponse possibles : XML, HTML, texte brute, JSON, … GWT-RPC : échanger directement des objets Java sérialisables Permet de masquer cette phase de décodage Définir une interface du service, une interface dappel asynchrone, une implémentation (servlet), un invocateur (proxy), … RequestFactory (GWT 2.1) : alternative à RPC où seuls les champs modifiés d’un objet transitent par le réseau (différentiel) ©Copyright OXIANE Page 31
  32. 32. Le bouton "back" du navigateur• Problème avec le remplacement partiel de la page Ne compte pas comme un changement de page pour le navigateur Mais lutilisateur voit une page différente Lutilisateur peut vouloir annuler en utilisant le bouton "back"• Solution : gérer intelligemment le bouton "back"• Classes History, Hyperlink et ValueChangeHandler Gestion transparente dun "frame" caché html pour que Le navigateur ajoute dans l’historique les changements de "pages" Générer des "history token" pour identifier les états de l’application Gère des ValueChangeEvent pour réagir aux boutons Back et Forward Pas de magie, au développeur de prendre en compte la cohérence ©Copyright OXIANE Page 32
  33. 33. Intégration JSNI• JavaScript Native Interface Spécifier des méthodes "natives", dont le code existera au runtime Intégrer le code JavaScript directement dans le code Java On met le code en commentaire derrière la définition Ça reste du code Java valide puisque dans des commentaires Le compilateur insère ce code dans le fichier généré public static native void alert(String msg) /*-{• Permet $wnd.alert(msg); }-*/; Doptimiser De gérer des spécifités, dintégrer des librairies existantes Appeler du code JavaScript depuis Java et vice versa Lire et écrire des attributs Java depuis JavaScript ©Copyright OXIANE Page 33
  34. 34. Autres (1)• I18n utilise le DeferredBinding : GWT.create() Autant de fichiers js que de locales Créer linterface public interface MySettings extends Constants { Utilisation dans le code String welcomeMsg(); MySettings s = GWT.create( String logoImage(); MySettings.class); } String msg = s.welcomeMsg(); Dans MySettings.properties welcomeMsg = Bonjour logoImage = /images/logo.jpg• Gestion des événements par xxxHandler ClickHandler (souris), LoadHandler (chargement dimage), ChangeHandler (modification du widget), FocusHandler et BlurHandler (prise / perte de focus), Key(Down/Up/Press)Handler (événements clavier), MouseXXXHandler (événements souris), OpenHandler et CloseHandler (événements de fermeture fenêtre, popup, menu, ...), ScrollHandler (déplacement des barres de défilement), SelectionHandler (sélection donglet) ©Copyright OXIANE Page 34
  35. 35. Autres (2)• Log : GWT fournit un Logger Permet d’avoir une fenêtre de log JavaScript Configuration de logging dans le fichier .gwt.xml SystemLogHandler, ConsoleLogHandler (console Javascript), PopupLogHandler, SimpleRemoteLogHandler (par RPC), ... Utilisation d’images et de ressources • ImageBundle pour le chargement de nombreuses images en une seule grande image • ClientBundle : optimisations pour des fichiers textes, CSS et XML• Tests unitaires • Intégration de JUnit par une sous-classe de GWTTestCase • Mock objets (utiliser MVP pour découpler les widgets et le métier) • Sélénuim ©Copyright OXIANE Page 35
  36. 36. Conclusion ©Copyright OXIANE Page 36
  37. 37. R.E.X• Annuaire de 4000 personnes pour gérer les conseillers des prudhommes• SPA : simple page application, chargé en 1s, très réactif Application multi profil Utilisation des widgets natives : templates de pages, refactoring, …• Retour Développement comme un client lourd, pas besoin de compétence web (sauf css) ou javascript, peu de problème de portabilité, gestion historique facile Compilation lente (faire les optimisations), showcase non exhaustif, temps nécessaire pour bien comprendre les widgets complexes ©Copyright OXIANE Page 37
  38. 38. Avantages• Utilisation de Java Langage très connu et utilisé Richesse de la plate-forme et des outils• Productivité Facilité d’apprentissage, configuration minimale Rapidité de développement dune interface riche et conviviale• Optimisation systématique du code produit Performances et scalabilité Prise en compte des navigateurs, versions, langues• Pas de plug-in dans le navigateur (hors développement)• Disponibilités croissantes de bibliothèques• Et aussi : communauté, documentation, … ©Copyright OXIANE Page 38
  39. 39. Inconvénients• Attention au choix des bibliothèques complémentaires• Limitations du JRE pour la transcription Javascript• Besoin de connaître les CSS Surtout depuis GWT 2• Sécurité AJAX Vulnérabilité Javascript XSS (Cross Site Scripting) ou CSRF (Cross Site Request Forgery) pour le vol ou l’utilisation de cookie• Indexation par les moteurs de recherche Application ou site web ?• N’impose rien sur l’organisation du code Design patterns du client lourd à base dévénements et de listeners MVP ©Copyright OXIANE Page 39
  40. 40. Conclusion• Un toolkit puissant et original Une approche différente du web permettant une ergonomie riche Des techniques très bien pensées Insertion facile dans la stack technologique serveur (java, php, ...) Respect des standards Open Source Supporté par Google ©Copyright OXIANE Page 40

×