XML - dut info reims
Download
Report
Transcript XML - dut info reims
AJAX
Jérôme CUTRONA
[email protected]
10:56:05
Programmation Web 2013-2014
1
AJAX ?
AJAX : Asynchronous JavaScript And XML
(JavaScript asynchrone et XML)
JavaScript : langage de script côté client (navigateur)
Asynchrone : par rapport au chargement de la page
Web et des portions de page Web
XML : langage à balises permettant, entre autre, de
structurer des données
Permet, grâce à JavaScript, la récupération de
données XML (mais aussi texte ou JSON)
disponibles sur un serveur Web
10:56:05
Programmation Web 2013-2014
2
AJAX ?
N'est PAS une technologie
N'est PAS un logiciel
N'est PAS un greffon (plug-in)
N'est PAS un détergent
C'est l'utilisation conjointe de :
10:56:06
HTML
CSS
DOM / JavaScript
XMLHttpRequest (JavaScript)
XML (ou JSON)
Programmation Web 2013-2014
3
Asynchrone ? (une vision)
Fonctionnement classique du Web :
Chargement d'une page
Interaction de l'utilisateur (clic, sélection, formulaire, …)
Chargement d'une autre page
Interaction de l'utilisateur (clic, sélection, formulaire, …)
Chargement d'une autre page
...
Fonctionnement "AJAX" du Web :
10:56:06
Chargement d'une page
Interaction de l'utilisateur (clic, sélection, formulaire, …)
Chargement d'une partie de page
Interaction de l'utilisateur (clic, sélection, formulaire, …)
Chargement d'une autre partie de page
...
Programmation Web 2013-2014
4
Échanges client/serveur classiques
Client
url
Serveur
Demande de la page
Traitement
clic
Envoi de la page
Demande de la page
Traitement
clic
Envoi de la page
Demande de la page
Traitement
Envoi de la page
10:56:06
Programmation Web 2013-2014
5
Échanges client/serveur en AJAX
Client
url
Serveur
Demande de la page
Traitement
clic
Envoi de la page
JavaScript
Demande de données
Traitement
clic
10:56:06
JavaScript
Envoi des données
JavaScript
Demande de données
JavaScript
Envoi des données
Programmation Web 2013-2014
Traitement
6
XMLHTTPRequest
Cœur d'AJAX
Objet JavaScript
En fait, objets JavaScript
Microsoft :
ActiveXObject("Msxml2.XMLHTTP")
ActiveXObject("Microsoft.XMLHTTP")
Les autres :
XMLHttpRequest()
Permet d'effectuer des requêtes HTTP et d'en
récupérer le résultat
10:56:06
Programmation Web 2013-2014
7
XMLHTTPRequest : propriétés
Gestionnaire d'événements pour les
changements d'état. Il faut assigner
onreadystatechange
une fonction à cette propriété pour
traiter sur les données renvoyées.
readyState
responseText
Statut de l'objet.
Réponse sous forme de chaîne de
caractères.
responseXML
Réponse sous forme d'objet DOM.
status
Code numérique de réponse du
serveur HTTP.
statusText
Message accompagnant le code de
réponse.
10:56:06
Programmation Web 2013-2014
8
XMLHTTPRequest : méthodes
abort
Abandonne la requête HTTP.
getAllResponseHeaders
getResponseHeader
open
Renvoie l'ensemble des entêtes
HTTP de la réponse.
Renvoie la valeur d'un champ
d'entête HTTP.
Prépare une requête HTTP en
indiquant ses paramètres.
send
Effectue la requête HTTP, en
envoyant les données.
setRequestHeader
Assigne une valeur à un champ
d'entête HTTP.
10:56:06
Programmation Web 2013-2014
9
Utilisation de XMLHTTPRequest
1. Instancier l'objet
2. Initialiser une requête
Méthode, URL
Asynchrone ?
3. Associer une fonction au traitement du résultat
de la requête
4. Effectuer la requête
Envoyer des données ?
5. Traiter le résultat
10:56:06
Texte ?
XML / JSON ?
Programmation Web 2013-2014
10
Utilisation de XMLHTTPRequest
1. Instancier l'objet
2. Initialiser une requête
Méthode, URL
Asynchrone ?
3. Associer une fonction au traitement du résultat
de la requête
4. Effectuer la requête
Envoyer des données ?
5. Traiter le résultat
10:56:06
Texte ?
XML / JSON ?
Programmation Web 2013-2014
11
Instancier XMLHTTPRequest
function GetXmlHttpObject() {
var objXMLHttp = null ;
if (window.XMLHttpRequest) { // pour non-IE
objXMLHttp = new XMLHttpRequest() ;
}
else {
if (window.ActiveXObject) {
try { // pour IE
objXMLHttp =
new ActiveXObject("Msxml2.XMLHTTP") ;
}
catch (e) {
try { // pour une autre version de IE
…
10:56:06
Programmation Web 2013-2014
12
Instancier XMLHTTPRequest
…
objXMLHttp =
new ActiveXObject("Microsoft.XMLHTTP") ;
}
catch (e) {
window.alert("Votre navigateur ne prend
pas en charge l'objet XMLHTTPRequest.") ;
}
}
}
}
return objXMLHttp ;
Variable globale
}
var xmlHttp = GetXmlHttpObject() ;
10:56:06
Programmation Web 2013-2014
13
Utilisation de XMLHTTPRequest
1. Instancier l'objet
2. Initialiser une requête
Méthode, URL
Asynchrone ?
3. Associer une fonction au traitement du résultat
de la requête
4. Effectuer la requête
Envoyer des données ?
5. Traiter le résultat
10:56:06
Texte ?
XML / JSON ?
Programmation Web 2013-2014
14
XMLHTTPRequest::open()
Initialiser une requête HTTP
open (method, URL [, asyncFlag[,
userName [, password]]])
Paramètres :
method :
URL :
asyncFlag :
userName :
password :
"GET" ou "POST" (ou "HEAD")
relative ou absolue
mode asynchrone ? true ou false
nom d'utilisateur
mot de passe
Remarque : l'URL peut contenir des paramètres,
test.php?id=12&a=salut
10:56:06
Programmation Web 2013-2014
15
Paramètres d'URL
Caractères réservés des URL [/#?&:~…]
non admissibles dans les paramètres
encodage sous la forme %code_hexadécimal
Caractère
SPACE
<
>
#
%
{
}
|
\
^
~
10:56:06
Code
%20
%3C
%3E
%23
%25
%7B
%7D
%7C
%5C
%5E
%7E
Caractère
[
]
`
;
/
?
:
@
=
&
$
Programmation Web 2013-2014
Code
%5B
%5D
%60
%3B
%2F
%3F
%3A
%40
%3D
%26
%24
16
Paramètres d'URL en JavaScript
Comment échapper une chaîne en JavaScript ?
Écrire une table de transcription (bof…)
Utiliser string escape(string)
escape("J'ai faim !")
J%27ai%20faim%20%21
Comment déséchapper une chaîne ?
Écrire une table de transcription inverse (bof…)
Utiliser string unescape(string)
unescape("J%27ai%20faim%20%21")
J'ai faim !
var url="test.php?v="+escape(valeur_v)
10:56:06
Programmation Web 2013-2014
17
Utilisation de XMLHTTPRequest
1. Instancier l'objet
2. Initialiser une requête
Méthode, URL
Asynchrone ?
3. Associer une fonction au traitement du résultat
de la requête
4. Effectuer la requête
Envoyer des données ?
5. Traiter le résultat
10:56:06
Texte ?
XML / JSON ?
Programmation Web 2013-2014
18
Changements d'état de la requête
Chaque changement d'état de la requête
engendre un événement
L'état de la requête est reflété par l'état de l'objet
XMLHTTPRequest : propriété readyState
10:56:06
0 non initialisé
1 ouverture. La méthode open() a été appelée
avec succès
2 envoyé. La méthode send() a été appelée avec
succès
3 en train de recevoir. Des données sont en train
d'être transférées, mais le transfert n'est pas terminé
4 terminé. Les données sont chargées
Programmation Web 2013-2014
19
Fonction de traitement du résultat
Désigner la fonction qui sera lancée lors des
changements d'état de la requête
Désigner la fonction qui sera lancée quand la
requête sera terminée et donc que les données
seront disponibles
XMLHTTPRequest.onreadystatechange
Requête
terminée
function traiter() {
if (xmlHttp.readyState == 4)
window.alert('Données dispo !');
}
xmlHttp.onreadystatechange=traiter;
10:56:06
Programmation Web 2013-2014
20
Utilisation de XMLHTTPRequest
1. Instancier l'objet
2. Initialiser une requête
Méthode, URL
Asynchrone ?
3. Associer une fonction au traitement du résultat
de la requête
4. Effectuer la requête
Envoyer des données ?
5. Traiter le résultat
10:56:06
Texte ?
XML / JSON ?
Programmation Web 2013-2014
21
XMLHTTPRequest::send()
Effectue la requête HTTP initialisée avec
XMLHTTPRequest::open()
Requête de type "GET" ou "HEAD"
Aucune donnée à envoyer
xmlHttp.send(null) ;
Requête de type "POST"
10:56:06
données à envoyer
xmlHttp.setRequestHeader(
'Content-Type',
'application/x-www-form-urlencoded') ;
xmlHttp.send("v=valeur&x=12");
Programmation Web 2013-2014
22
Utilisation de XMLHTTPRequest
1. Instancier l'objet
2. Initialiser une requête
Méthode, URL
Asynchrone ?
3. Associer une fonction au traitement du résultat
de la requête
4. Effectuer la requête
Envoyer des données ?
5. Traiter le résultat
10:56:06
Texte ?
XML / JSON ?
Programmation Web 2013-2014
23
Traiter le résultat de la requête
Traitement effectué dans la fonction associée au
changement d'état de la requête quand l'état est
4 (requête terminée)
Le résultat peut se présenter sous 3 formes :
texte qui peut aussi être du code HTML
XML (http://dej/XML/COURS/introduction_XML.pdf)
JSON
Le traitement consiste généralement en une
modification de la page Web courante en
utilisant JavaScript, le DOM et les CSS
10:56:06
Programmation Web 2013-2014
24
Récupérer le résultat de la requête
Sous forme de texte
texte brut
texte contenant du code HTML
XMLHTTPRequest.responseText
Sous forme d'un objet DOM XML
XMLHTTPRequest.responseXML
Serveur : Content-Type: text/xml
Sous forme de données JSON
10:56:06
texte contenant du code JSON
eval(XMLHTTPRequest.responseText)
Programmation Web 2013-2014
25
Exploiter des données au format texte
Texte brut
document.mon_formulaire.saisie.value
= xmlHttp.responseText
Texte contenant du code HTML
10:56:06
document.getElementById('txt').innerHTML
= xmlHttp.responseText
Programmation Web 2013-2014
26
Exemple d'utilisation d'AJAX
Serveur
Réseau
Traitement
Saisie
showHint(str) {
function stateChanged()
xmlHttp = GetXmlHttpObject() ;
{
xmlHttp.onreadystatechange=stateChanged
;
if (xmlHttp.readyState == 4) {
xmlHttp.open("GET",url,true)
;
document.getElementById("txtHint").innerHTML
xmlHttp.send(null)
;
=xmlHttp.responseText
; }
}
10:56:06
Programmation Web 2013-2014
27
Exploiter des données au format XML
Objet XML :
getElementsByTagName(n) Collection de nœuds
Collection de nœuds :
length nombre d'éléments
[x]
accès au xéme élément
Nœud :
10:56:06
firstChild
childNodes
hasChildNodes()
nodeValue
nodeName
getAttribute(a)
Premier fils
Collection de fils
Possède des fils ?
Valeur du nœud
Nom du nœud
Valeur de l'attribut
Programmation Web 2013-2014
28
Introduction (ou rappel) XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Recette SYSTEM "Recette.dtd">
<Recette>
<Titre>Tarte aux pommes</Titre>
<Auteur> <Nom>Desjardin</Nom>
<Prenom>Eric</Prenom> </Auteur>
</Recette>
Ça ressemble à du HTML où :
on utilise ses propres balises
la syntaxe est rigoureuse
Ce document ne peut pas s’afficher directement
On utilise des d’outils pour manipuler
l’information de ce document
10:56:06
Programmation Web 2013-2014
29
Introduction (ou rappel) XML
HTML
XML
Structure orientée présentation
Jeu de basiles fini et normalisé
Rendu graphique dépendant du
navigateur
Réutilisation limitée
Cible : Web
Écriture laxiste
Stockage : Fichier
Toutes structures, données
Jeu de balises extensible
Pas de présentation directe
(nécessite une feuille de style)
Exploitation sémantique
Cible : Web, PDF, échange,…
Rédaction de contenu
Stockage : Fichier, BD, natif
Normalisation de HTML en XML XHTML
XML a été conçu pour décrire, stocker et
échanger des données
10:56:06
Programmation Web 2013-2014
30
Introduction (ou rappel) XML
Déclaration XML
<?xml version="1.0" encoding="ISO-8859-1"?>
Tout élément doit avoir une balise de fermeture
<p>C'est un paragraphe</p> <br />
Les noms d'éléments sont sensibles à la casse
<Titre> et <titre> sont deux éléments différents
Les éléments doivent être correctement
appairés
<Un><Deux>Ceci est incorrect</Un></Deux>
Un élément racine qui enserre tous les autres
il doit exister et est unique dans le document
ex : <html> … </html>
10:56:06
Programmation Web 2013-2014
31
Introduction (ou rappel) XML
Ce qui est entre la balise ouvrante et la balise
fermante représente le contenu de l'élément
L'ordre des éléments est significatif même si ici
Chiffres peut être vu comme un conteneur
<Chiffres><Un /><Deux /></Chiffres>
<Chiffres><Deux /><Un /></Chiffres>
Un élément peut contenir plusieurs éléments
identiques
<Chiffres>
<Chiffre>Un</Chiffre>
<Chiffre>Deux</Chiffre>
</Chiffres>
10:56:06
Programmation Web 2013-2014
32
Introduction (ou rappel) XML
Un élément peut être qualifié par des attributs
<Chiffre combien="1" libelle="un" />
Un attribut a un nom ET une valeur
L'ordre des attributs n'a pas d'importance
≈ <Chiffre libelle="un" combien="1" />
Les valeurs des attributs doivent être encadrés
par des guillemets ou des apostrophes
Un élément ne peut pas avoir deux fois le même
attribut
<Mot style='verbe' style='futur'>verra</Mot>
10:56:06
Programmation Web 2013-2014
33
Introduction (ou rappel) XML
Le prologue d'un document XML contient tout ce
qui précède l'élément racine et peut contenir :
la déclaration XML
des instructions de traitement
des commentaires
une clause DTD
Instructions de traitement
<?xml-stylesheet type="text/css"
href="style.css"?>
Association à une référence externe à la
structure (DTD)
<!DOCTYPE La_racine SYSTEM "Recette.dtd">
10:56:06
Programmation Web 2013-2014
34
Introduction (ou rappel) XML
Commentaires XML
<!-- Je suis un commentaire -->
Entités prédéfinies
< > & " '
Entités des caractères ne faisant pas partie du
jeu utilisé
Mise en œvre => Mise en œuvre
Entités de texte définies dans la DTD
©right;
Entité référence à des fichiers binaires
<image photo="flipper">
10:56:06
Programmation Web 2013-2014
35
Introduction (ou rappel) XML
Noms des entités :
Peuvent contenir des chiffres, des lettres ou
d'autres caractères
Ne peuvent PAS commencer par un chiffre ou
un caractère de ponctuation
Ne peuvent PAS commencer par la chaîne xml
(dans toutes les casses possibles)
Ne peuvent PAS contenir des espaces
Ne doivent PAS contenir le caractère " : " qui
est utilisé par les espaces de nom
10:56:06
Programmation Web 2013-2014
36
Exemple XML DOM
<?xml version="1.0" encoding="UTF-8" ?>
<liste>
<animal idani="AC001-03">
<noman>Aquilon</noman>
<visites>1</visites>
</animal>
<animal idani="AC001-01">
<noman>Bobo</noman>
<visites>3</visites>
</animal>
</liste>
10:56:06
Programmation Web 2013-2014
37
Exemple XML DOM
liste
¶··
<?xml ¶··
version="1.0" encoding="UTF-8" ?>
¶··<liste>
<animal idani="AC001-03">
animal
animal
<noman>Aquilon</noman>
idani="AC001-03"
idani="AC001-01"
<visites>1</visites>
</animal>
¶····
¶····
¶····
<animal idani="AC001-01">
¶····
<noman>Bobo</noman>
visites
visites
noman
noman <visites>3</visites>
</animal>
¶····
¶····
</liste>
Aquilon
10:56:06
1
Bobo
3
Programmation Web 2013-2014
38
Exemple XML DOM
liste
xmlHttp.responseXML
¶··
¶··
.getElementsByTagName(
'animal')
¶··
animal
idani="AC001-03"
¶····
animal
idani="AC001-01"
¶····
¶····
visites
noman
¶····
Aquilon
10:56:06
.getAttribute('idani')
.getElementsByTagName(
'noman
')[0]
¶····
noman
[0]
visites
¶····
1
Bobo
.firstChild
.nodeValue
3
Programmation Web 2013-2014
39
39
JSON (JavaScript Object Notation)
Format de structure de données
Utilise la syntaxe des objets JavaScript
{"menu":
{"id": "file",
"value": "File"
"popup": {"item": [ {"value": "New" },
{"value": "Open"},
{"value": "Close"}] }}}
<menu id="file" value="File">
<popup> <item value="New" />
<item value="Open" />
Équivalent XML
<item value="Close" />
</popup>
</menu>
10:56:06
Programmation Web 2013-2014
40
JSON (JavaScript Object Notation)
http://www.json.org/
Deux structures :
Objet
{}
{chaîne : valeur}
{chaîne : valeur, chaîne : valeur, …}
Tableau
[]
[valeur]
[valeur, valeur, …]
Valeur :
10:56:06
chaîne|nombre|objet|tableau|true|false|null
Programmation Web 2013-2014
41
JSON (JavaScript Object Notation)
http://www.json.org/
object
{}
{ members }
members
pair
pair , members
pair
string : value
array
[]
[ elements ]
elements
value
value , elements
10:56:06
value
string
number
object
array
true
false
null
string
""
" chars "
chars
char
any-Unicode-characterexcept-"-or-\-orcontrol-character
\"
\\
\/
\b
\f
\n
\r
\t
\u four-hex-digits
char
char chars
Programmation Web 2013-2014
42
JSON (JavaScript Object Notation)
http://www.json.org/
number
int
int frac
int exp
int frac exp
exp
int
digit
digit1-9 digits
- digit
- digit1-9 digits
frac
10:56:06
e digits
digits
digit
digit digits
e
. digits
e
e+
eE
E+
E
Programmation Web 2013-2014
43
JSON (JavaScript Object Notation)
http://www.json.org/
10:56:06
Programmation Web 2013-2014
44
JSON (JavaScript Object Notation)
http://www.json.org/
10:56:06
Programmation Web 2013-2014
45
JSON (JavaScript Object Notation)
http://www.json.org/
10:56:06
Programmation Web 2013-2014
46
JSON (JavaScript Object Notation)
http://www.json.org/
10:56:06
Programmation Web 2013-2014
47
Exploiter des données au format JSON
Syntaxe des objets JavaScript
Évaluer une chaîne contenant du code JSON
Création d'un objet
var myObject = eval('('+myJSONtext+')');
Accès aux attributs de l'objet
{ "menu":
{ "id": "file",
"value": "File"
"popup": { "item": …
myObject.menu.id 'file'
10:56:06
Programmation Web 2013-2014
48
JavaScript Objet avec prototype.js
prototype.js est une bibliothèque JavaScript
Écrite par Sam Stephenson
http://prototype.conio.net/
Orientée objet
Nombreux tâches pénibles encapsulées
Encapsule AJAX de façon élégante
1800 lignes / 43 Ko
10:56:06
Programmation Web 2013-2014
49
prototype.js
10:56:06
Programmation Web 2013-2014
50
prototype.js
Fonctions utilitaires
10:56:06
$("id") ≡ document.getElementById("id")
$("id1", "id2", …) ≡
array(document.getElementById("id1"),
document.getElementById("id2"),
…)
$F(id) ≈
document.getElementById("id").value
Programmation Web 2013-2014
51
prototype.js
Ajax.Request
10:56:06
Objet encapsulant l'utilisation habituelle d'AJAX
new Ajax.Request( url, params )
url : l'url à interroger
params : objet anonyme
{method
: 'post' |'get',
parameters
: param | data,
onComplete
: callback
asynchronous : true | false}
callback (xmlHttp)
Programmation Web 2013-2014
52
Exemple prototype.js
<html> <head> <title>AJAX avec prototype.js</title>
<script type='text/javascript'
src='prototype-1.4.0.js'></script>
<script type='text/javascript'>
function stateCompleted(remote) {
$("txtHint").innerHTML=remote.responseText ;
}
function showHint(str) {
if (str.length == 0) {
$("txtHint").innerHTML = "" ; return ; }
var ajax = new Ajax.Request("gethint.php",
{ method
: "get",
parameters
: "q="+str,
onComplete
: stateCompleted,
asynchronous : true }) ;
} </script> </head> …
10:56:06
Programmation Web 2013-2014
53
Exemple prototype.js
…
<body>
<form> First Name:
<input type="text" id="txt1"
onkeyup="showHint(this.value)">
</form>
<p>Suggestions: <span id="txtHint"></span></p>
</body>
</html>
10:56:06
Programmation Web 2013-2014
54
Petit bilan autour d'AJAX
Pour :
Basé sur des standards ouverts
Minimise la bande passante
Interfaces réactives, attente réduite
Interfaces proches des clients lourds
Contre :
10:56:06
Maximise le nombre de requêtes
Coût de développement
Perte de suivant / précédent, favoris
A la mode, il faut en coller partout…
JavaScript, accessibilité des anciens navigateurs
Programmation Web 2013-2014
55