AJAX AJAX - Latece
Transcription
AJAX AJAX - Latece
AJAX A. Obaid © - Programmation du web (INF2005) Ajax . 1 AJAX • Asynchronous JavaScript And XML. • Technologie pour créer des pages web interactives • Basées sur XML, HTML et JavaScript • Utilise: • • • • HTML pour le marquage XHTML pour stocker le résultat CSS pour la présentation JavaScript (et DOM) pour récupérer les données et leur afficher dynamiquement A. Obaid © - Programmation du web (INF2005) Ajax . 2 1 1 Rôle de JavaScript • • • • • • • • • • Définit une objet pour envoyer des requêtes HTTP Initie la requête Obtient l'objet Requête Désigne une fonction (callBack) pour traiter la réponse. Définit des événements d'arrivée de la réponses Initie des requêtes GET ou POST Manipule la réponse Attend que la réponse soit arrivée Extrait le texte résultat Traite le résultat A. Obaid © - Programmation du web (INF2005) Ajax . 3 Rôle de HTML • Charge JavaScript • Désigne contrôles qui initient la requête • Donne les identificateurs (id) pour saisir les éléments qui seront lus par le script A. Obaid © - Programmation du web (INF2005) Ajax . 4 2 2 Modèle Ajax Navigateur Interface usager Navigateur Interface usager Appel JavaScript HTML + CSS Machine JavaScript Requête HTTP HTML + CSS Serveur web Documents Web Programme Requête HTTP XML Serveur web/XML Documents Web Programme A. Obaid © - Programmation du web (INF2005) Ajax . 5 Interactions avec AJAX • Lorsqu'on soumet un formulaire, JavaScript envoie une requête à un serveur, obtient le résultat et rafraichit l'écran avec les nouvelles données • Sans l'intervention explicite de l'usager • XML est utilisé comme format des données échangées • Les interactions sont asynchrones: • L'usager peut continuer à utiliser l'application web pendant que le navigateur cherche de l'information du serveur. • Les applications sont "pilotées" par les données A. Obaid © - Programmation du web (INF2005) Ajax . 6 3 3 Exemples d'utilisation • Google Maps • L'usager peut faire bouger la carte qui se met à jour sans utiliser de bouton. • Google Suggest • Au fur et à mesure qu'on tape un texte, Google fait des suggestions. • Gmail • La boite de réception est rafraichie sans intervention de l'usager. A. Obaid © - Programmation du web (INF2005) Ajax . 7 Transaction Ajax • Un transaction consiste en • L'envoi de la requête d'ouverture avec open() • On y spécifie la méthode (GET, POST ou HEAD): • La réception de la réponse du serveur • L'envoi de données avec send() xmlhttp.open("HEAD","Demo.jsp",true); Server: Microsoft-IIS/5.1 Date: Fri, 03 Mar 2006 17:47:47 GMT Content -Type: text/xml Accept -Ranges: bytes Last-Modified: Fri, 03 Mar 2006 14:07:51 GMT Content -Length: 21 xmlhttp.send(null); A. Obaid © - Programmation du web (INF2005) Ajax . 8 4 4 Transactions Ajax xmlhttp.open("HEAD","Demo.jsp",true); Server: Microsoft-IIS/5.1 Date: Fri, 17 Nov 2010 17:47:47 GMT Content -Type: text/xml Accept -Ranges: bytes Last-Modified: Fri, 17 Nov 2010 14:07:51 GMT Content -Length: 21 xmlhttp.send(null); xmlhttp.open("GET","Demo.jsp?Prenom=Abdel&Nom=Obaid",true); Server: Microsoft-IIS/5.1 Date: Fri, 17 Nov 2010 17:47:47 GMT Content -Type: text/xml Accept -Ranges: bytes Last-Modified: Fri, 17 Nov 2010 14:07:51 GMT Content -Length: 200 … Donnees de la response … xmlhttp.send(null); A. Obaid © - Programmation du web (INF2005) Ajax . 9 Transactions Ajax xmlhttp.open("POST","Demo.jsp",true); Server: Microsoft-IIS/5.1 Date: Fri, 17 Nov 2010 17:47:47 GMT Content -Type: text/xml Accept -Ranges: bytes Last-Modified: Fri, 17 Nov 2010 14:07:51 GMT Content -Length: 200 … Donnees de la response … xmlhttp.setRequestHeader("Content -Type","application/x-www-form-urlencoded;"); xmlhttp.send("FPrenom=Abdel&Nom=Obaid"); A. Obaid © - Programmation du web (INF2005) Ajax . 10 5 5 Envoi de la requête function envoyerRequete() { requete = obtenirObjetRequete(); requete.onreadystatechange = traiterReponse ; requete.open("GET", "URL", true); requete.send(null); } A. Obaid © - Programmation du web (INF2005) Ajax . 11 Traitement de la réponse function traiterReponse () { if (requete.readyState == 4) { alert("Reponserecue : "+ requete.responseText); } } </script> A. Obaid © - Programmation du web (INF2005) Ajax . 12 6 6 L'objet Request • Contient la requête du client Ajax • Les méthodes utilisées pour créer un objet Request dépendent du navigateur • Internet Explorer: • new ActiveXObject("Microsoft.XMLHTTP"); • FireFox, Safari, …: • new XMLHttpRequest(); A. Obaid © - Programmation du web (INF2005) Ajax . 13 Objet XMLHttpRequest • Permet de communique avec l'application sur le serveur • Permet d' échanger des informations XML, HTML ou texte • Effectue l'interaction asynchrone avec le serveur A. Obaid © - Programmation du web (INF2005) Ajax . 14 7 7 Création de XMLHttpRequest <script type="text/javascript"> var requete; function obtenirObjetRequete() { if (window.ActiveXObject) { return(new ActiveXObject("Microsoft.XMLHTTP")); } else if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } else { return(null); } } A. Obaid © - Programmation du web (INF2005) Ajax . 15 Exemple <html> <body> <script type="text/javascript"> function ajaxFunction() { var xmlHttp; try { xmlHttp=new XMLHttpRequest(); // Firefox, Opera, Safari } catch (e) { try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // IE } catch (e) { try { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { alert("Votre navigateur ne supporte pas AJAX!"); return false; <form name="mf"> } Name: <input type="text" name="username" /> } Time: <input type="text" name="time" /> } </form> } </body> </script> </html> A. Obaid © - Programmation du web (INF2005) Ajax . 16 8 8 Requête HTTP • Les requêtes se font grâce à des l'objet de requête dans un script JavaScript. • Deux versions de l'objet de requête: • XMLHTTP : objet ActiveX de MicroSoft , pour IE. • XMLHttpRequest : Objet ayant les mêmes méthodes et propriétés que XMLHTTP (pour Mozilla, …). • On doit vérifier quel navigateur on utilise. if (window.XMLHttpRequest) { // Mozilla,... httpRequest = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } A. Obaid © - Programmation du web (INF2005) Ajax . 17 Lancement de la requête • On utilise les méthodes open() et send(). • open() a 3 paramètres: • Méthode HTTP (GET, POST, ...) • URL de la page demandée : doit être du même domaine que la page demandante. • Flag de synchronisme (true/false). • send() a un paramètre: données envoyées au serveur si la méthode POST ou null si la méthode set GET.. httpRequest.open('GET', 'http://www.info.uqam.ca/document.type', true); httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); httpRequest.send("prenom=Abdel&nom=Obaid&tel=514-1234567" ); A. Obaid © - Programmation du web (INF2005) Ajax . 18 9 9 Réponses asynchrones • Le synchrone impose que le client attende la réponse du serveur • En asynchrone on n'attend pas. On ne sait pas quand la réponse va arriver. • On doit donc écrire un code pour attende la réponse. • On utilise une fonction Callback qui attend l'arrivée d'un événement "Changement dans l'état de la réponse" • L'événement est capturé par la propriété onreadystatechange de l'objet xmlhttp A. Obaid © - Programmation du web (INF2005) Ajax . 19 Traitement de la réponse • La réponse doit avoir un type MIME text/XML. • Après avoir reçu la réponse du serveur, on doit spécifier (avec onreadystatechange ) à XMLHttpRequest, le nom de la fonction (callback) JavaScript qui traitera la réponse. httpRequest = new XMLHttpRequest(); httpRequest.overrideMimeType('text/xml'); httpRequest.onreadystatechange = fonctionDeTraitement; A. Obaid © - Programmation du web (INF2005) Ajax . 20 10 10 Traitement de la réponse • L’état de la réponse est désigné par une valeur de 0 à 4. • Une valeur de 4, signifie que la réponse du serveur a été reçue entièrement et qu’elle est prête pour le traitement. httpRequest.onreadystatechange = fonctionDeTraitement; Valeurs de la réponse: –0 (non initialisée) –1 (en cours de chargement) –2 (chargée) –3 (en cours d'interaction) –4 (terminée) if (httpRequest.readyState == 4) { …// Réponse reçue } else { …// pas encore prête } A. Obaid © - Programmation du web (INF2005) Ajax . 21 Réponse du serveur • Les propriétés responseText et responseXML de XMLHttpRequest contiennent la réponse du serveur. • responseText. Contient la réponse en tant que chaine de caractères. • On peut la mettre sous forme HTML • responseXML : contient la réponse sous forme de document XML. • On peut la manipuler avec les API DOM appropriées. A. Obaid © - Programmation du web (INF2005) Ajax . 22 11 11 Propriétés de XMLHttpRequest • onreadystatechange • On y met le nom d ’une fonction qui recevra les données du serveur. • Cette fonction sera appelée automatiquement pour traiter la réponse du serveur. • readyState • Contient l’état de la réponse du serveur. A chaque fois que cette propriété change, la fonction onreadystatechange sera exécutée. A. Obaid © - Programmation du web (INF2005) Ajax . 23 Propriétés de XMLHttpRequest • responseText • Stocke les données en format texte envoyées par le serveur • responseXML • Stocke les données en tant qu'objet XML envoyées par le serveur A. Obaid © - Programmation du web (INF2005) Ajax . 24 12 12 Méthodes de XMLHttpRequest • abort() : annule le requête XMLHttp. • getAllResponseHeaders() : retourne les valeurs de tous les en-têtes HTTP • getResponseHeader(header) : retourne la valeur de l' entête HTTP spécifiée. A. Obaid © - Programmation du web (INF2005) Ajax . 25 Méthodes de XMLHttpRequest • open(Methode,URL,Async) : initialise l'objet XMLHttpRequest. • send(Données) : envoie la requête HTTP au serveur dont l'URL est spécifiée dans send(): • Si la méthode dans open() est GET, l'argument DonneesPost est null. • setRequestHeader(entete,valeur) : assigne une valeur à une entête HTTP spécifique. A. Obaid © - Programmation du web (INF2005) Ajax . 26 13 13 Exemple function debut() { … var contenu = document.getElementById("contenu"); if (typeof xmlhttp == "undefined") { ContentDiv.innerHTML = "<h1> XMLHttp non cree!</h1>"; } else { xmlhttp.open("HEAD", "http://www.uqam.ca", true); xmlhttp.onreadystatechange= function() { ContentDiv.innerHTML += "<h2> État pret: " + xmlhttp.readyState + "</h2>"; } xmlhttp.send(null); } } … A. Obaid © - Programmation du web (INF2005) Ajax . 27 Exemple xmlhttp.open("GET", "Demo.jsp?Prenom=Abdel&Nom=Obaid", true); xmlhttp.onreadystatechange= function() { if (xmlhttp.readyState==4 && xmlhttp.status ==200) { contenu.innerHTML=xmlhttp.responseText; } } xmlhttp.send(null); … <body> <a href="javascript:debut()">Commencer </a> <div id="contenu"></div> </body> A. Obaid © - Programmation du web (INF2005) Ajax . 28 14 14 Exemple Complet <script type="text/javascript "> function Requete (url ) { var requeteHTTP= false; if (window.XMLHttpRequest) { requeteHTTP = new XMLHttpRequest(); if (requeteHTTP.overrideMimeType) { requeteHTTP.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { try { requeteHTTP = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { requeteHTTP = new ActiveXObject(" Microsoft.XMLHTTP"); } catch (e) {} } } if (!requeteHTTP) { alert('Abandon : Impossible de créer une instance XMLHTTP'); return false; } requeteHTTP.onreadystatechange = function() {changerContenu(requeteHTTP); }; requeteHTTP.open('GET',url, true); requeteHTTP.send(null); } A. Obaid © - Programmation du web (INF2005) Ajax . 29 Exemple function changerContenu(requeteHTTP) { if (requeteHTTP.readyState == 4) { if (requeteHTTP.status == 200) { document.formulaire1.heure.value =requeteHTTP.responseText; } else { alert('Un problème est survenu avec la requête.'); } } } </script> </head> <body> <h2> Ceci est un exemple de Ajax </h2> <form name="formulaire1"> Nom: <input type="text" onkeyup= Requete('ex2.jsp') name="nom" /> Heure: <input type="text" name="heure" /> </form> </body> <% java.util.Calendar cal = java.util.Calendar.getInstance(); %> </html> <% out.print (cal.getTime().toString()); %> Fichier ex2.jsp A. Obaid © - Programmation du web (INF2005) Ajax . 30 15 15 Traitement de la requête • Plusieurs technologies: • Servlets et JSP: objets Java sur un container web • Langages de programmation classique (C, C++) • Langages de scriptage dédiés: • PHP, Python, Perl, Ruby,... A. Obaid © - Programmation du web (INF2005) Ajax . 31 Servlet - Exemple public void doGet (HttpServletRequest requete, HttpServletResponsereponse) throws IOException, ServletException { String leNom= request.getParameter("nom"); PrintWriter sortie = reponse.getWriter(); reponse.setContentType("text/xml"); reponse.setHeader("Cache-Control", "no-cache"); reponse.write("<html>…."); } A. Obaid © - Programmation du web (INF2005) Ajax . 32 16 16 PHP - Exemple … function envoyerRequete(param) { alert('1!'); requete = obtenirObjectRequete(); requete.onreadystatechange = traiterReponse; requete.open("GET", "chercher.php?nomProf="+param, true); requete.send(null); } <?php… $profs = array ( "Obaid"=>array( "PK-4740", "3206","Teleinformatique" ), "Tremblay"=>array ("PK-4435","8213","Genie logiciel"), … ); $leProf=$_GET["nomProf"]; // nomProf dans le formulaire echo "Prof: " . $leProf ."<br />"; echo "Bureau: " . $profs[$leProf ][0]."<br />"; echo "Telephone: " . $profs[$leProf][1]."<br />"; echo "Domaine: " . $profs[$leProf][2]."<br />"; ?> ajax4_1.html chercher.php A. Obaid © - Programmation du web (INF2005) Ajax . 33 La méthode GET • On spécifie la méthode HTTP et l'URL dans la méthode open(). • Les informations (contenu des formulaires) sont ajoutées à l'URL • Avantages: • Plus légère. • On peut les mettre dans un signet • Inconvénients: • Ces informations sont visibles dans la fenêtre d'adresses du navigateur • Ne pas y transférer des mots de passe ! • La quantité d'informations est limitées (2000 octets) requeteHTTP.open('GET',traitement.php?prenom=abdel&nom=Obaid, true); requeteHTTP.send(null); Ajaxa4_.html (/serveur) A. Obaid © - Programmation du web (INF2005) Ajax . 34 17 17 La méthode POST • On spécifie la méthode HTTP et l'URL dans la méthode open(). • Les informations (contenu des formulaires) sont envoyées séparément avec la méthode send() ). • Avantages • Les informations ne sont pas visibles • On peut transmettre une grande quantité d'informations • Inconvénients: • Il y a une limite (ex. 8 Mo). • Moins rapide que la méthode GET. ajax4_2.html (serveur) requete.open("POST","traitement.php",true); requete.setRequestHeader("Content-type","application/x -www-form-urlencoded"); requete.send("prenom=Abdel&nom=Obaid"); A. Obaid © - Programmation du web (INF2005) Ajax . 35 POST - Exemple ajax4_2.html function envoyerRequete(param) { requete = obtenirObjectRequete(); requete.onreadystatechange = traiterReponse; requete.open("POST", "chercher2.php", true); requete.setRequestHeader("Content-type","application/x-www-form-urlencoded"); requete.send("nomProf="+param); } <?php $profs = array ( "Obaid"=>array( "PK-4740", "3206","Teleinformatique" ), "Tremblay"=>array ("PK-4435","8213","Genie logiciel"), … ); $leProf=$_POST["nomProf"]; // nomProf dans le formulaire echo "Prof: " . $leProf ."<br />"; echo "Bureau: " . $profs[$leProf ][0]."<br />"; echo "Telephone: " . $profs[$leProf][1]."<br />"; echo "Domaine: " . $profs[$leProf][2]."<br />"; ?> A. Obaid © - Programmation du web (INF2005) chercher2.php Ajax . 36 18 18 Réponses en XML • On identifie les éléments DOM recherchés: lesProfs=reponse.getElementsByTagName("prof"); • On parcourt l'arbre à partir de ces éléments: for (i=0;i<lesProfs.length;i++) { texteHTML=texteHTML+ "<srtong>"+ lesProfs[i].childNodes[0].nodeValue+"</strong> : " + lesProfs[i].childNodes[1].nodeValue+"<br />" } • On place le résultat dans la page HTML: ajax_xml.html document.getElementById("contenu").innerHTML=texteHTML A. Obaid © - Programmation du web (INF2005) Ajax . 37 Exemple- Données XML <profs> <prof > <nom>Obaid</nom> <bureau>PK- 4740</bureau> <poste>3206</ poste> <specialites > <specialite> Teleinformatique</specialite> <specialite> Reseaux sans fil</specialite> </specialites > </prof > … <prof > <nom>Laforest</nom> <bureau>PK- 4740</bureau> <poste>3206</ poste> <specialites > <specialite>Algorithmique</specialite> <specialite>Combinatoire</specialite> </specialites > </prof > </profs> A. Obaid © - Programmation du web (INF2005) Ajax . 38 19 19 Reponses XML • On utilise la propriété responseXML • La méthode getElementsByTagName() permet de retrouver les éléments particuliers de l’arbre DOM. • L'API DOM de JavaScript permet de parcourir cet arbre. … listeElements=reponseEnXML.getElementsByTagName("prof"); for (i=0;i<listeElements.length;i++) { var children =listeElements[i].childNodes; for (var j = 0; j < children.length; j++) x1 = children[j].nodeName + ":" + children[j].nodeValue; sortieXML=sortieXML + x1+ "<br />" ; }; ajax_xml.html } … A. Obaid © - Programmation du web (INF2005) Ajax . 39 20 20