SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Downloaden Sie, um offline zu lesen
GWT
Google Web Toolkit

              OXIANE – NOVAE LR




           ©Copyright OXIANE      Page 1
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
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 l'historique, JSNI,
      Gestion des évènements, Log, ….




                             ©Copyright OXIANE                        Page 3
Naissance des RIA (1)

•   L'histoire du développement d'applications 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 d'interactivité
         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
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 l'ajout 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
      d'installation et de mise à jour (ex: Eclipse RCP)




                              ©Copyright OXIANE                        Page 5
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
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
Avantages de l'approche 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 l'internationalisation
      Optimales : versions spécifiques des fichiers javacript
      produits plutôt que génériques
•   Utiliser la myriade d'outils 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
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é d'intégrer des frameworks JavaScript
      Ext-JS, Scriptaculous, JSCalendar, …
                                 ©Copyright OXIANE                           Page 9
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 s'exé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 d'arrêt, …
      Tests unitaires avec Junit et GWTTestCase
•   Compiler en JavaScript ensuite
      Déployer et tester (mode "production", ex mode "web")
                              ©Copyright OXIANE                   Page 10
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 d'entré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 : n'utilise que les fichiers Java (pas les .class)
      Nécessité de disposer des sources de toutes ses
      librairies utilisées

                           ©Copyright OXIANE                 Page 11
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 l'utilisation de la bande passante
      Diminue l'empreinte mémoire dans le navigateur
•   Modes de compilation
      OBFUSCATE, PRETTY, DETAILED




                              ©Copyright OXIANE                 Page 12
DeferredBinding

•   Technique pour pallier l'absence 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 d'une 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
Développer une
application 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 d'une application par "webAppCreator"
       webAppCreator -out c:/Hello com.oxiane.App


      Permet de créer l'arborescence et les fichiers de base
          App.gwt.xml : configuration du module
          Sous package client : code client comprenant App.java : classe "point d'entré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
Tester l'application : 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 l'url




                             ©Copyright OXIANE            Page 16
Déployer l'application : Mode Production

•   Compilation de l'application en JavaScript
      Prend beaucoup de temps
•   Utiliser la target "war" du script Ant
      Génère un war de l'application, prêt à déployer
      Déposer le war dans un server web type Tomcat
      Tester avec l'url http://localhost:8080/<NomApplication>




                              ©Copyright OXIANE                  Page 17
Interface EntryPoint

•   L'interface désignant un point d'entrée d'application
•   Méthode onModuleLoad()
      Equivalent au main() de l'application 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
Les fenêtres et les panels

•   Notions classiques des interfaces graphiques
      Widget = contrôle utilisé par l'utilisateur
         En général en correspondance avec un équivalent HTML
         Button, TextBox, TextArea, CheckBox, RadioButton, …
      Panel = conteneur de widgets (ou d'autres panels)
         Exemple : table disposant un bouton et un champ en ligne
         Panel pour disposer (layout) mais peut aussi offrir de l'interactivité (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
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
Autres composants

•   La bibliothèque s'étoffe à chaque version
      DatePicker, DockLayouttPanel, …
•   Projets open sources proposent d'autres widgets
      Table triée, calculatrice, panel de dessin, bulle d'aide,…
      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
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
•    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
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 classe
QuantiteWidget.java
public 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
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
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 parsing
      et les temps de rendus
      du navigateur
      Identifie et fournit
      des conseils sur les
      problèmes
      de performance




                               ©Copyright OXIANE       Page 27
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
Notions
complémentaires




            ©Copyright OXIANE   Page 29
Code Splitting

 •   Fragmentation de code pour générer plusieurs fichiers
     de code Javascript
        Chargement au besoin des différents fichiers javascripts
            Évite ainsi d'avoir qu'un seul gros fichier
        En plaçant des points de rupture dans le code java client
public 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
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 d'appel 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
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 l'utilisateur voit une page différente
      L'utilisateur peut vouloir annuler en utilisant le bouton "back"
•   Solution : gérer intelligemment le bouton "back"
•   Classes History, Hyperlink et ValueChangeHandler
      Gestion transparente d'un "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
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);
                           }-*/;
      D'optimiser
      De gérer des spécifités, d'inté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
Autres (1)

•   I18n utilise le DeferredBinding : GWT.create()
        Autant de fichiers js que de locales           Créer l'interface
                                                        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 d'image), 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
        d'onglet)

                                   ©Copyright OXIANE                                    Page 34
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
Conclusion




  ©Copyright OXIANE   Page 36
R.E.X

•   Annuaire de 4000 personnes pour gérer les conseillers
    des prud'hommes
•   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
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 d'une 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
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
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

Weitere ähnliche Inhalte

Was ist angesagt?

Introduction à GWT - GTI780 & MTI780 - ETS - A09
Introduction à GWT - GTI780 & MTI780 - ETS - A09Introduction à GWT - GTI780 & MTI780 - ETS - A09
Introduction à GWT - GTI780 & MTI780 - ETS - A09Claude Coulombe
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileIppon
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & TechniquesRachid NID SAID
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Ippon
 
Symfony with angular.pptx
Symfony with angular.pptxSymfony with angular.pptx
Symfony with angular.pptxEsokia
 
Objet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonomeObjet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonomeformationobjetdirect
 
Responsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousResponsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousjwajsberg
 
Etat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveEtat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveAlexandre Morgaut
 
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSupport formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSmartnSkilled
 
JPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à AchillesJPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à AchillesIppon
 
L'histoire d'html5 pour les développeurs windows phone 8
L'histoire d'html5 pour les développeurs windows phone 8L'histoire d'html5 pour les développeurs windows phone 8
L'histoire d'html5 pour les développeurs windows phone 8davrous
 
Quand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les railsQuand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les railsArnaud Héritier
 
Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Cyrille Le Clerc
 

Was ist angesagt? (20)

Introduction à GWT - GTI780 & MTI780 - ETS - A09
Introduction à GWT - GTI780 & MTI780 - ETS - A09Introduction à GWT - GTI780 & MTI780 - ETS - A09
Introduction à GWT - GTI780 & MTI780 - ETS - A09
 
Support cours angular
Support cours angularSupport cours angular
Support cours angular
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
 
Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0
 
Symfony with angular.pptx
Symfony with angular.pptxSymfony with angular.pptx
Symfony with angular.pptx
 
Objet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonomeObjet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonome
 
Responsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousResponsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tous
 
Retour d'experience projet AngularJS
Retour d'experience projet AngularJSRetour d'experience projet AngularJS
Retour d'experience projet AngularJS
 
Gwt
GwtGwt
Gwt
 
Introduction à Node.js
Introduction à Node.js Introduction à Node.js
Introduction à Node.js
 
Etat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveEtat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS Geneve
 
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSupport formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
 
Formation gwt
Formation gwtFormation gwt
Formation gwt
 
JPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à AchillesJPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à Achilles
 
L'histoire d'html5 pour les développeurs windows phone 8
L'histoire d'html5 pour les développeurs windows phone 8L'histoire d'html5 pour les développeurs windows phone 8
L'histoire d'html5 pour les développeurs windows phone 8
 
Quand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les railsQuand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les rails
 
J2EE vs .NET
J2EE vs .NETJ2EE vs .NET
J2EE vs .NET
 
Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)
 

Andere mochten auch

Avoiding callback hell with promises
Avoiding callback hell with promisesAvoiding callback hell with promises
Avoiding callback hell with promisesTorontoNodeJS
 
L’origine de la facilitation
L’origine de la facilitationL’origine de la facilitation
L’origine de la facilitationIAF France
 
Iafchapter paris
Iafchapter paris Iafchapter paris
Iafchapter paris IAF France
 
Devenir Facilitateur Professionnel
Devenir Facilitateur ProfessionnelDevenir Facilitateur Professionnel
Devenir Facilitateur ProfessionnelIAF France
 
Roberta Faulhaber - Facilitation Graphique
Roberta Faulhaber - Facilitation GraphiqueRoberta Faulhaber - Facilitation Graphique
Roberta Faulhaber - Facilitation GraphiqueRoberta Faulhaber
 
Parcours Facilitateur professionnel de dynamiques collaboratives
Parcours Facilitateur professionnel de dynamiques collaborativesParcours Facilitateur professionnel de dynamiques collaboratives
Parcours Facilitateur professionnel de dynamiques collaborativesFormapart
 
Le Facilitateur, un role encore meconnu
Le Facilitateur, un role encore meconnuLe Facilitateur, un role encore meconnu
Le Facilitateur, un role encore meconnuDavid Gageot
 
Séminaire Facilitation et Posture Facilitateur
Séminaire Facilitation et Posture FacilitateurSéminaire Facilitation et Posture Facilitateur
Séminaire Facilitation et Posture FacilitateurFormapart
 

Andere mochten auch (10)

Asynchronismes en JavaScript - Devoxx 2015
Asynchronismes en JavaScript - Devoxx 2015Asynchronismes en JavaScript - Devoxx 2015
Asynchronismes en JavaScript - Devoxx 2015
 
Avoiding callback hell with promises
Avoiding callback hell with promisesAvoiding callback hell with promises
Avoiding callback hell with promises
 
L’origine de la facilitation
L’origine de la facilitationL’origine de la facilitation
L’origine de la facilitation
 
Iafchapter paris
Iafchapter paris Iafchapter paris
Iafchapter paris
 
Devenir Facilitateur Professionnel
Devenir Facilitateur ProfessionnelDevenir Facilitateur Professionnel
Devenir Facilitateur Professionnel
 
Promises Javascript
Promises JavascriptPromises Javascript
Promises Javascript
 
Roberta Faulhaber - Facilitation Graphique
Roberta Faulhaber - Facilitation GraphiqueRoberta Faulhaber - Facilitation Graphique
Roberta Faulhaber - Facilitation Graphique
 
Parcours Facilitateur professionnel de dynamiques collaboratives
Parcours Facilitateur professionnel de dynamiques collaborativesParcours Facilitateur professionnel de dynamiques collaboratives
Parcours Facilitateur professionnel de dynamiques collaboratives
 
Le Facilitateur, un role encore meconnu
Le Facilitateur, un role encore meconnuLe Facilitateur, un role encore meconnu
Le Facilitateur, un role encore meconnu
 
Séminaire Facilitation et Posture Facilitateur
Séminaire Facilitation et Posture FacilitateurSéminaire Facilitation et Posture Facilitateur
Séminaire Facilitation et Posture Facilitateur
 

Ähnlich wie Gwt oxiane-novae-lr

Google Web Toolkit 1.5 Presentation Web Creative Common
Google Web Toolkit 1.5 Presentation Web Creative CommonGoogle Web Toolkit 1.5 Presentation Web Creative Common
Google Web Toolkit 1.5 Presentation Web Creative CommonStéphane Liétard
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflineDNG Consulting
 
Node.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascriptNode.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascriptKhalid Jebbari
 
Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Quentin Adam
 
HTML5 W3C Conference Euratechnologie
HTML5 W3C Conference EuratechnologieHTML5 W3C Conference Euratechnologie
HTML5 W3C Conference Euratechnologiewyggio
 
Les plateformes de développement des web services
Les plateformes de développement des web servicesLes plateformes de développement des web services
Les plateformes de développement des web servicesoussemos
 
JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?benjguin
 
Javascript & tools
Javascript & toolsJavascript & tools
Javascript & toolsSlim Soussi
 
Introduction à web assembly
Introduction à web assemblyIntroduction à web assembly
Introduction à web assemblyJérémy Buget
 
Google Web Toolkit - GWT
Google Web Toolkit - GWTGoogle Web Toolkit - GWT
Google Web Toolkit - GWTmohamedmed1694
 
Presentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationPresentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationStéphane Traumat
 
Rex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesRex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesChristophe Furmaniak
 
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...CERTyou Formation
 
USI 2009 - Du RIA pour SI
USI 2009 - Du RIA pour SIUSI 2009 - Du RIA pour SI
USI 2009 - Du RIA pour SIDjamel Zouaoui
 
[AzureCamp 24 Juin 2014] Interactions en "temps réel" pour les applications W...
[AzureCamp 24 Juin 2014] Interactions en "temps réel" pour les applications W...[AzureCamp 24 Juin 2014] Interactions en "temps réel" pour les applications W...
[AzureCamp 24 Juin 2014] Interactions en "temps réel" pour les applications W...Microsoft Technet France
 

Ähnlich wie Gwt oxiane-novae-lr (20)

Google Web Toolkit 1.5 Presentation Web Creative Common
Google Web Toolkit 1.5 Presentation Web Creative CommonGoogle Web Toolkit 1.5 Presentation Web Creative Common
Google Web Toolkit 1.5 Presentation Web Creative Common
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'Offline
 
Node.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascriptNode.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascript
 
Gdd07 Gwt Dig
Gdd07 Gwt DigGdd07 Gwt Dig
Gdd07 Gwt Dig
 
Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?
 
HTML5 W3C Conference Euratechnologie
HTML5 W3C Conference EuratechnologieHTML5 W3C Conference Euratechnologie
HTML5 W3C Conference Euratechnologie
 
Les plateformes de développement des web services
Les plateformes de développement des web servicesLes plateformes de développement des web services
Les plateformes de développement des web services
 
JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?
 
Javascript & tools
Javascript & toolsJavascript & tools
Javascript & tools
 
Introduction à web assembly
Introduction à web assemblyIntroduction à web assembly
Introduction à web assembly
 
Google Web Toolkit - GWT
Google Web Toolkit - GWTGoogle Web Toolkit - GWT
Google Web Toolkit - GWT
 
_JCVFr
_JCVFr_JCVFr
_JCVFr
 
J2 ee
J2 eeJ2 ee
J2 ee
 
Presentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationPresentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub Foundation
 
Rex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesRex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantes
 
Java vs .Net
Java vs .NetJava vs .Net
Java vs .Net
 
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...
 
USI 2009 - Du RIA pour SI
USI 2009 - Du RIA pour SIUSI 2009 - Du RIA pour SI
USI 2009 - Du RIA pour SI
 
Java vs .Net
Java vs .NetJava vs .Net
Java vs .Net
 
[AzureCamp 24 Juin 2014] Interactions en "temps réel" pour les applications W...
[AzureCamp 24 Juin 2014] Interactions en "temps réel" pour les applications W...[AzureCamp 24 Juin 2014] Interactions en "temps réel" pour les applications W...
[AzureCamp 24 Juin 2014] Interactions en "temps réel" pour les applications W...
 

Gwt oxiane-novae-lr

  • 1. GWT Google Web Toolkit OXIANE – NOVAE LR ©Copyright OXIANE Page 1
  • 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. 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 l'historique, JSNI, Gestion des évènements, Log, …. ©Copyright OXIANE Page 3
  • 4. Naissance des RIA (1) • L'histoire du développement d'applications 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 d'interactivité 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. 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 l'ajout 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 d'installation et de mise à jour (ex: Eclipse RCP) ©Copyright OXIANE Page 5
  • 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. 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. Avantages de l'approche 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 l'internationalisation Optimales : versions spécifiques des fichiers javacript produits plutôt que génériques • Utiliser la myriade d'outils 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. 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é d'intégrer des frameworks JavaScript Ext-JS, Scriptaculous, JSCalendar, … ©Copyright OXIANE Page 9
  • 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 s'exé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 d'arrê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. 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 d'entré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 : n'utilise que les fichiers Java (pas les .class) Nécessité de disposer des sources de toutes ses librairies utilisées ©Copyright OXIANE Page 11
  • 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 l'utilisation de la bande passante Diminue l'empreinte mémoire dans le navigateur • Modes de compilation OBFUSCATE, PRETTY, DETAILED ©Copyright OXIANE Page 12
  • 13. DeferredBinding • Technique pour pallier l'absence 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 d'une 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. Développer une application GWT ©Copyright OXIANE Page 14
  • 15. Créer une application • Installer GWT Avoir un JRE + un fichier à décompresser : gwt-2.4.0.zip • Création d'une application par "webAppCreator" webAppCreator -out c:/Hello com.oxiane.App Permet de créer l'arborescence et les fichiers de base App.gwt.xml : configuration du module Sous package client : code client comprenant App.java : classe "point d'entré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. Tester l'application : 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 l'url ©Copyright OXIANE Page 16
  • 17. Déployer l'application : Mode Production • Compilation de l'application en JavaScript Prend beaucoup de temps • Utiliser la target "war" du script Ant Génère un war de l'application, prêt à déployer Déposer le war dans un server web type Tomcat Tester avec l'url http://localhost:8080/<NomApplication> ©Copyright OXIANE Page 17
  • 18. Interface EntryPoint • L'interface désignant un point d'entrée d'application • Méthode onModuleLoad() Equivalent au main() de l'application 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. Les fenêtres et les panels • Notions classiques des interfaces graphiques Widget = contrôle utilisé par l'utilisateur En général en correspondance avec un équivalent HTML Button, TextBox, TextArea, CheckBox, RadioButton, … Panel = conteneur de widgets (ou d'autres panels) Exemple : table disposant un bouton et un champ en ligne Panel pour disposer (layout) mais peut aussi offrir de l'interactivité (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. 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. Autres composants • La bibliothèque s'étoffe à chaque version DatePicker, DockLayouttPanel, … • Projets open sources proposent d'autres widgets Table triée, calculatrice, panel de dessin, bulle d'aide,… 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
  • 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. 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 classe QuantiteWidget.java public 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. 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. Création graphique : GWT Designer (4) • Génère le code XML UIBinder ©Copyright OXIANE Page 26
  • 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. 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. Notions complémentaires ©Copyright OXIANE Page 29
  • 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 d'avoir qu'un seul gros fichier En plaçant des points de rupture dans le code java client public 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. 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 d'appel 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. 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 l'utilisateur voit une page différente L'utilisateur peut vouloir annuler en utilisant le bouton "back" • Solution : gérer intelligemment le bouton "back" • Classes History, Hyperlink et ValueChangeHandler Gestion transparente d'un "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. 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); }-*/; D'optimiser De gérer des spécifités, d'inté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. Autres (1) • I18n utilise le DeferredBinding : GWT.create() Autant de fichiers js que de locales Créer l'interface 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 d'image), 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 d'onglet) ©Copyright OXIANE Page 34
  • 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. Conclusion ©Copyright OXIANE Page 36
  • 37. R.E.X • Annuaire de 4000 personnes pour gérer les conseillers des prud'hommes • 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. 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 d'une 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. 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. 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