RencontresGWT

publicité
La face cachée de
GWT
Developpez.com
Tv4it.com
Sfeir, SmartTrade
Sami Jaber
Webmaster du site DotNetGuru.org (DNG)
Architecte Valtech Toulouse
© 2007 – DNG
Programme
Introduction
Les différentes phases du compilateur GWT
Le modèle RPC
Conclusion
2
Introduction
GWT se décompose en deux grandes briques
• Le Framework de composants
• Le compilateur Java vers Javascript
Le compilateur GWT incarne les racines du
Framework
Peu ou pas d’articles traitent de cette face
cachée de GWT
Les performances de GWT découlent
directement du fonctionnement du compilateur
3
Le packaging GWT
Didier
gwt-user.jar
gwt-dev-[platform].jar
Le Framework
Sami
Les outils
4
Le compilateur
Application
Java
Site
HTML/JavaScript
GWTCompiler
com.myApplication.MyApplication
-out c:\website\com.my….
5
Les phases de compilation
Chargement du module (méta-données, règles)
Préparation des règles de permutation
Pour chaque permutation, compilation Java vers
JavaScript
Génération des fichiers
6
Chargement des modules
Le chargeur de module (ModuleDefLoader)
effectue un parcours récursif de l’arbre des
modules
Extrait les informations des schémas
• Binding
• Generators
• Extends, Properties, …
7
Les permutations
Chargement du module (méta-données, règles)
Préparation des règles de permutation
Pour chaque permutation, compilation Java vers
JavaScript
Génération des fichiers
8
Principe général
Télécharge uniquement
la version nécessaire
au navigateur client
Un seul
code
Java
… puis le met en cache
indéfiniment
9
La compilation
Chargement du module (méta-données, règles)
Préparation des règles de permutation
Pour chaque permutation, compilation Java vers
JavaScript
Génération des fichiers
10
Qu’est-ce qu’un AST ?
GWT s’appuie intensivement sur les AST
(Abstract Syntax Tree)
Un arbre syntaxique est une représentation
arborescente d’un code source (généralement)
compilé
•
•
•
Expressions
Blocks
Types
IdUse
Stmt
AssignStmt
Block
Exp
Exp
IfStmt
Stmt
11
Compilateur : Eclipse JDT
IfStmt :: “if” Exp “then” Stmt
Class ASTNode{
protected ASTNode[] children;
}
class IfStmt extends ASTNode{
final protected Token token_if, Exp exp, Token token_then, Stmt stmt;
IfStmt(Token token_if, Exp exp, Token token_then, Stmt stmt){
// parse tree construction
this.token_if = token_if;
this.exp = exp;
this.token_then = token_then;
this.stmt = stmt;
// IR tree construction
children[0] = exp;
children[1] = stmt;
}
}
12
Fusion des arbres AST
GWT s’appuie sur Eclipse JDT pour compiler
les classes et sur TypeOracle son parseur
maison pour les sources
AST JDT Java
ICompilationUnit
AST GWT
(JProgram)
IField
JClassType
JavaDoc
IType
JSNI
13
Pourquoi cette fusion ?
Optimisation et
gestion native !
14
Optimisations du compilateur
1
Pruner
• Supprime les classes, les champs et les méthodes inutilisées
2
Method and class finalizer
• Finalise les méthodes et les champs
3
MakeCallsStatic
• Réécrit le code non-polymorphique en appel statique
4
TypeTightener
• Le compilateur infère les types les plus spécifiques pour éviter
d’utiliser des types abstraits
5
MethodCallTightener
• Réalise la même opération que TypeTighener, mais pour les appels
de méthodes (appels polymorphiques transformés en appels
spécifiques)
6
DeadCodeElimination
• Elimination de code mort (jamais appelé)
7
MethodInliner
15
STATIQUE!
L’optimisation induite par le compilateur peut
réduire potentiellement par 10 la taille du code
JavaScript
Possible uniquement grâce au fait que le
chargement dynamique est impossible
• Pas d’eval() JavaScript ou de newInstance() Java
Même dans un contexte purement JavaScript
(non AJAX), le compilateur GWT a du sens !
La théorie des compilateurs appliquée à
JavaScript (il fallait oser !)
16
Le modèle de communication
Toute communication avec la couche serveur
s’opère via le protocole RPC
• Le service s’appuie sur l’API JEE Servlet
Les appels sont asynchrones (classe
AsyncCallback)
Le code serveur n’est pas converti en Javascript
• Possibilité d’utiliser le JDK 1.5 et toutes les classes du
Framework Java
Les types sont sérializés automatiquement par
GWT
• suivant un format spécifique RPC
17
Le Framework RPC
Le développeur implémente 3 classes
ServiceDefTarget
(Interface)
RemoteService
(Interface)
RemoteServiceServlet
(class)
hérite
MyServiceAsync
(Interface)
hérite
MyService
(Interface)
implémente
MyServiceImpl
(class)
relation
Classes importées du Framework
implémente
MyServiceProxy
(class)
Classes à implémenter
Générées automatiquement
Client
Serveur
18
Le service RPC côté serveur
L’implémentation du service
package com.mycompany.project.server;
import java.util.Date;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.mycompany.project.client.MyOrderService;
import com.mycompany.project.client.Person;
HttpServlet
public class MyOrderServiceImpl extends RemoteServiceServlet
implements MyOrderService {
}
public String getOrderByName(String name) {
return name;
Interface de
}
Service Remote
public Person getPersonByID(int id) {
Person p = new Person();
p.setAge(new Date());
p.setName("Martin");
JavaBean
public class Person implements
p.setId(1);
java.io.Serializable {
p.setSalary(100);
Serializable
private int id;
return p;
private float salary;
}
private String name;
private Date age;
// setters/getters
}
19
Le service RPC côté client
Définir l’interface de service
package com.mycompany.project.client;
import com.google.gwt.user.client.rpc.RemoteService;
public interface MyOrderService extends RemoteService {
public String getOrderByName(String name);
public Person getPersonByID(int id);
}
L’interface asynchrone cliente est générée par les
outils
MyOrderServiceAsync orderService = (MyOrderServiceAsync)
GWT.create(MyOrderService.class);
Instancie le bon service
et récupère un proxy Asynchrone
// Converti le proxy en ServiceDefTarget pour lui assigner l’URL
ServiceDefTarget endpoint = (ServiceDefTarget) orderService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "MyOrderService";
endpoint.setServiceEntryPoint(moduleRelativeURL);
20
Quelques remarques
GWT 1.4 a sensiblement revu son architecture
RPC pour la rendre plus extensible
Possibilité d’utiliser tout type de moteur
d’injection POJO compatible :
• Spring
• Guice, EJB 3, RMI, Corba …
Attention à la sérialisation des types
• GWT donne l’impression que le couplage client et serveur
est faible : c’est une illusion !!
• Oubliez côté client les protocoles tels que Soap ou RMI…
• Le client reste en JavaScript et JavaScript même masqué
par Java reste du bon vieux JavaScript interprété
• RPC is the way to go
21
10 raisons d’investir dans GWT
Communauté
Marge de progression
Productivité
Richesse fonctionnelle (AJAX)
Pérennisation des compétences (JAVA)
Extensibilité
Intégration avec l’existant
Standards ouverts (XML, JSon, J2EE)
Open Source
Simplicité
• attention : « simple » pas « simpliste »
22
Quelques liens
Sites
• GWT Groups
• http://www.onGWT.com
• http://www.gwtpowered.com
Livres
• GWT en Action
Formations
• 3 jours sur GWT 1.4
Me contacter : [email protected] (formation,
conseil, séminaires, mariages, baptême...)
23
Téléchargement