Programmation Web Avanc´
ee
AJAX
Thierry Hamon
Bureau H202 - Institut Galil´eeT´el. : 33 1.48.38.35.53 Bureau 150 – LIM&BIO – EA 3969 Universit´e Paris 13 - UFR L´eonard de Vinci 74, rue Marcel Cachin, F-93017 Bobigny cedex T´el. : 33 1.48.38.73.07, Fax. : 33 1.48.38.73.55
thierry.hamon@univ-paris13.fr
Asynchronous Javascript And XML (AJAX)
Introduction
Introduit en 2005 par Jesse James Garrett
Applications Web avec interface utilisateur
D´
eportation d’une partie des traitements li´
es `
a l’interface du
code cot´
e client
R´
eduction des ressources utilis´
ees cot´
e serveur
Economie de bande passante
Exemple d’application Web AJAX :
Google Mail, Maps, Earth, etc.
Liste de suggestions automatiques
Traitement de texte
Asynchronous Javascript And XML (AJAX)
Introduction
Regroupe un ensemble de technologie Web utilis´
ees
conjointement (HTML, CSS, DOM, Javascript,
XMLHttpRequest, XML)
Permet la r´
ecup´
eration de donn´
ees sur le serveur de mani`
ere
asynchrone, sans interf´
erer avec les donn´
ees dans la page
courante (utilisation de l’objet XMLHttpRequest)
Utilise comme format d’´
echange, XML, des fichiers textes et
aussi JSON
Asynchronous Javascript And XML (AJAX)
Introduction
Deux composants (Application Web Classique) :
Serveur (impl´
ementation JAVA ou PHP par exemple)
Contrˆ
ole g´
en´
eral de l’application
Propose des ressources statiques : Mod`
ele du document,
biblioth`
eque de scripts, feuilles de style
Traitement dynamique des donn´
ees
Composition dynamique de l’interface
Client (impl´
ementation Javascript par exemple)
Contrˆ
ole d´
el´
egu´
es en fonction du type de vue
Gestion des ´
ev`
enements utilisateur
Composition dynamique de l’interface
Traitement des donn´
ees re¸
cues
Asynchronous Javascript And XML (AJAX)
Introduction
Deux composants (Application Web AJAX) :
Serveur (impl´
ementation JAVA ou PHP par exemple)
Contrˆ
ole g´
en´
eral de l’application
Propose des ressources statiques : Mod`
ele du document,
biblioth`
eque de scripts, feuilles de style
Traitement dynamique des donn´
ees
Composition dynamique de l’interface
Client (impl´
ementation Javascript par exemple)
Contrˆ
ole d´
el´
egu´
es en fonction du type de vue
Gestion des ´
ev`
enements utilisateur
Composition dynamique de l’interface
Traitement des donn´
ees re¸
cues
Fonctionnement
Sch´
ema
Source: http:
Fonctionnement
Illustration
1
Requˆ
ete asynchrone au serveur dans une fonction JavaScript,
d´
eclench´
ee par un ´
ev´
enement
2
Transfert asynchrone de donn´
ees en XML
3
Traitement dynamique du cˆ
ot´
e client pour affichage inclusion
au document HTML, transformation XSLT, etc.
4
Requˆ
ete asynchrone sur un document XML en utilisant un
objet XMLHttpRequest (Mozilla) ou un contrˆ
ole ActiveX
XMLHTTP (IE)
Fonctionnement
Communication AJAX
Client :
Envoi de la requˆ
ete :
Cr´
eation de l’objet requˆ
ete (XMLHttpRequest)
Sp´
ecification des ´
el´
ements de la requˆ
ete (URL, m´
ethode,
headers HTTP, param`
etres)
Association d’un gestionnaire d’´
ev´
enements
Envoi de l’objet
R´
eception de la r´
eponse :
A chaque modification de l’´
etat de la requˆ
ete : tester si dans
l’´
etat ready
Traitement des donn´
ees re¸
cues (Ajout `
a l’interface,
transformation XSL)
Fonctionnement
Communication AJAX
Serveur :
D´
efinition des actions `
a r´
ealiser lors de la r´
eception d’une
requˆ
ete asynchrone AJAX
Objet XMLHttpRequest
API utilis´
ee
par JavaScript et d’autres langages de scripts
pour transf´
erer des donn´
ees au format XML, texte ou JSON
entre le client (navigateur) et le serveur Web
de mani`
ere asynchrone g´
en´
eralement. Mais possibilit´
e
d’utilisation synchrone
Cr´
eation de l’objet XMLHttpRequest : m´
ethode ActiveXObject
(IE) et objet Javascript XMLHttpRequest
Exemples de code
cr´
eation de l’objet requˆ
ete
v a r r e q = n u l l ;
f u n c t i o n g e t R e q u e s t ( )
{
i f
( window . XMLHttpRequest )
{
r e q = new XMLHttpRequest ( ) ;
}
e l s e
i f
( t y p e o f A c t i v e X O b j e c t != ” u n d e f i n e d ” )
{
r e q=new A c t i v e X O b j e c t ( ” M i c r o s o f t .XMLHTTP” ) ;
}
r e t u r n r e q ;
}
Exemples de code
cr´
eation de l’objet requˆ
ete
f u n c t i o n b a s i c A j a x E x a m p l e ( ) { v a r x m l H t t p ;
t r y {
x m l H t t p=new XMLHttpRequest ( ) ; // F i r e f o x , Opera 8 . 0 + , S a f a r i } c a t c h ( e ) { t r y { x m l H t t p=new A c t i v e X O b j e c t ( ” Msxml2 . XMLHTTP” ) ; // I E 6.0+ } c a t c h ( e ) { t r y { x m l H t t p=new A c t i v e X O b j e c t ( ” M i c r o s o f t . XMLHTTP” ) ; // I E 5.5+ } c a t c h ( e ) { a l e r t ( ” Your b r o w s e r d o e s n o t s u p p o r t AJAX ! ” ) ; r e t u r n f a l s e ; } } } }
Exemples de code
Chargement asychrone - simple
f u n c t i o n GetDataUsingAJAX ( r e q , e l t ) { // e l t : c o n t e n u d ’ un champs i f ( r e q != n u l l ) { // A s s o c i a t i o n de l a f o n c t i o n de g e s t i o n de l ’ ´e t a t v a r u r l=” h t t p : / /www . u n i v−p a r i s 1 3 . f r / m o n s c r i p t . php ? e l t =” + e l t ; // m´ethode s a n s p a r a m `e t r e r e q . o n r e a d y s t a t e c h a n g e = s t a t e C h a n g e ; r e q . o p e n ( ”GET” , u r l , t r u e ) ; r e q . s e n d ( n u l l ) ; } } f u n c t i o n s t a t e C h a n g e d ( r e q ) { i f ( r e q . r e a d y S t a t e ==4) { document . g e t E l e m e n t B y I d ( ” t x t ” ) . innerHTML=r e q . r e s p o n s e T e x t ; } }Exemples de code
Chargement asychrone - XML
f u n c t i o n GetDataUsingAJAX ( r e q , e l t ) { // e l t : e l e m e n t XML du document i f ( r e q != n u l l ) { // A s s o c i a t i o n de l a f o n c t i o n de g e s t i o n de l ’ ´e t a t v a r u r l=” h t t p : / /www . u n i v−p a r i s 1 3 . f r / m o n s c r i p t . php ? e l t =” + e l t ; // m´ethode a v e c p a r a m `e t r e s r e q . o n r e a d y s t a t e c h a n g e = f u n c t i o n ( ) { s t a t e C h a n g e ( e l t ) } ; r e q . o p e n ( ”GET” , u r l , t r u e ) ; // p o u r l e s r e q u e t e s XML r e q . s e t R e q u e s t H e a d e r ( ” A c c e p t ” , ” a p p l i c a t i o n / xml ” ) ; r e q . s e n d ( n u l l ) ; } }Exemples de code
Gestion de l’´
etat - XML
f u n c t i o n s t a t e C h a n g e ( e l t ) { // e l t : e l e m e n t XML du document
i f ( r e q . r e a d y S t a t e == 4 ) { // READY STATE COMPLETE i f ( r e q . responseXML != n u l l ) { v a r docXML= r e q . responseXML ; } e l s e { v a r docXML= r e q . r e s p o n s e T e x t ; docXML=p a r s e F r o m S t r i n g ( docXML ) ; } v a r d o c X M L r e s u l t = t r a i t e X M L ( docXML ) ; v a r s t r = ( new X M L S e r i a l i z e r ( ) ) . s e r i a l i z e T o S t r i n g ( d o c X M L r e s u l t ) ; document . g e t E l e m e n t B y I d ( e l t ) . innerHTML += s t r ; } }
Exemples de code
Transformation XSLT
// A p r`e s c h a r g e m e n t a s y n c h r o n e d e s d o c u m e n t s XML e t XSLT f u n c t i o n t r a n s f o r m XSLT ( XMLDoc , XSLDoc , i d ) { i f ( XMLDoc == n u l l | | XSLDoc == n u l l ) { r e t u r n ; } t r y { // I n t e r n e t E x p l o r e r i f ( window . A c t i v e X O b j e c t ) { v a r t a r g e t = document . g e t E l e m e n t B y I d ( i d ) ; t a r g e t . innerHTML = xml . t r a n s f o r m N o d e ( x s l ) ; } e l s e i f ( window . X S L T P r o c e s s o r ) { // S a f a r i / M o z i l l a v a r f r a g m e n t ; v a r x s l t P r o c e s s o r = new X S L T P r o c e s s o r ( ) ; x s l t P r o c e s s o r . i m p o r t S t y l e s h e e t ( x s l ) ; f r a g m e n t = x s l t P r o c e s s o r . t r a n s f o r m T o F r a g m e n t ( xml , document ) ; v a r t a r g e t = document . g e t E l e m e n t B y I d ( i d ) ; t a r g e t . a p p e n d C h i l d ( f r a g m e n t ) ; } } c a t c h ( e ) { r e t u r n e ; } }Propri´
et´
es de l’objet XMLHttpRequest
Status
Renvoie l’´
etat de la requˆ
ete
200 : OK, page trouv´
ee
404 : page non trouv´
ee
onreadystatechange
Association d’une fonction recevant et traitant les donn´
ees
retourn´
ees par le serveur apr`
es une requˆ
ete
Propri´
et´
es de l’objet XMLHttpRequest
readyState
Gestion de l’´
etat de la r´
eponse du serveur
A chaque changement d’´
etat, la fonction associ´
ee `
a
onreadystatechange est ex´
ecut´
ee
Valeurs possibles :
Etat
Description
0
Requˆ
ete non initialis´
ee
1
Connexion ´
etablie
2
Requˆ
ete re¸
cue
3
R´
eponse en cours/Traitement de la requˆ
ete en cours
4
R´
eponse envoy´
ee/Termin´
e
Propri´
et´
es de l’objet XMLHttpRequest
responseXML
Retourne un objet DOM du XML renvoy´
e par le serveur
responseText
Retourne une chaˆıne de caract`
eres contenant les donn´
ees
charg´
ees
A utiliser si on ne souhaite pas traiter les donn´
ees en
Javascript mais uniquement les afficher (par exemple, donn´
ees
HTML)
M´
ethode de l’objet XMLHttpRequest
Utilisation de 2 m´
ethodes pour l’envoi
open() – pr´
eparation de la requˆ
ete
3 arguments :
1
M´
ethode utilis´
ee pour l’envoi de la requˆ
ete (GET ou POST)
2URL du script cot´
e server
3
bool´
een indiquant si la requˆ
ete doit ˆ
etre envoy´
ee de mani`
ere
asynchrone ou non
send() – envoie de la requˆ
ete au serveur
1 argument :
1
donn´
ees `
a passer au script cot´
e serveur
m´
ethode GET : null
JavaScript Object Notation (JSON)
Format alternatif `
a XML
Natif en Javascript
Permet l’´
echange de donn´
ees entre client et serveur sans
analyse (contrairement au XML).
JSON vs. XML :
JSON : facilit´
e de lecture et simplicit´
e de mise en oeuvre
XML : extensible et reconnu dans tous les langages de
programmation
Syntaxe
El´
ements :
Objet : contient des
objets sous forme d’une liste de membres
{ nommembre1 : valmembre1, nommembre2: valmembre2, ... }
tableaux sous forme d’une liste de valeurs
[ valeur1, valeur2, ...]
Variable scalaire de type Number, String ou Boolean
Tableaux [ valeur1, valeur2, ...] (valeur : objet,
tableau, etc.)
Valeurs litt´
erales : null, false, true, valeur num´
erique,
chaˆıne de caract`
eres (entre ")
Membre :
Exemple de fichier JSON
{ ”menu” : ” F i c h i e r ” , ” commandes ” : [ { ” t i t l e ” : ” Nouveau ” , ” a c t i o n ” : ” C r e a t e D o c ” } , { ” t i t l e ” : ” O u v r i r ” , ” a c t i o n ” : ” OpenDoc ” } , { ” t i t l e ” : ” F e r m e r ” , ” a c t i o n ” : ” C l o s e D o c ” } ] } <? xml v e r s i o n=” 1 . 0 ” ?> <r o o t> <menu>F i c h i e r</menu> <commands> <i t e m> < t i t l e>Nouveau</ v a l u e> <a c t i o n>C r e a t e D o c</ a c t i o n> </ i t e m> <i t e m> < t i t l e>O u v r i r</ v a l u e> <a c t i o n>OpenDoc</ a c t i o n> </ i t e m> <i t e m> < t i t l e>F e r m e r</ v a l u e> <a c t i o n>C l o s e D o c</ a c t i o n> </ i t e m> </ commands> </ r o o t>Utilisation d’un fichier JSON
cot´
e client
R´
ecup´
eration des donn´
ees avec la m´
ethode eval() et utilisation
d’´
el´
ements et de la syntaxe Javascript :
r e q . o p e n ( ”GET” , ” f i c h i e r . j s o n ” , t r u e ) ; // r e q u ˆe t e v a r d o c = e v a l ( ’ ( ’ + r e q . r e s p o n s e T e x t + ’ ) ’ ) ; // r ´e c u p ´e r a t i o n v a r nomMenu = document . g e t E l e m e n t B y I d ( ’ j s m e n u ’ ) ; // r e c h e r c h e nomMenu . v a l u e = d o c . menu . v a l u e ; // a s s i g n a t i o n d o c . commands [ 0 ] . t i t l e // l e c t u r e de l a v a l e u r ” t i t l e ” d a n s l e t a b l e a u d o c . commands [ 0 ] . a c t i o n // l e c t u r e de l a v a l e u r ” a c t i o n ” d a n s l e t a b l e a u