introduzione ai principi dello sviluppo di applicazioni web interattive
Transcript
introduzione ai principi dello sviluppo di applicazioni web interattive
INTRODUZIONE AI PRINCIPI DELLO SVILUPPO DI APPLICAZIONI WEB INTERATTIVE (© I.D. Falconi ~ 21.12.2013) INTRODUZIONE AD AJAX Le caratteristiche di una applicazione Ajax sono sostanzialmente due: aggiornare una pagina web senza doverla necessariamente ricaricare interamente eseguire delle operazioni sul server in seguito ad un evento generato sul client senza necessariamente postare alcun FORM. Sappiamo come tramite la proprietà innerHTML del documento sia possibile modificare il contenuto di una porzione della pagina, e di come gli elementi possano essere resi visibili o non visibili attraverso le proprietà di stile visibility e display. Nelle applicazioni pratiche capita spesso che ad una azione dell'utente debbano essere visualizzati dati che non siano già nella memoria del browser, ma debbano essere richiesti al server. Vediamo alcune situazioni tipiche: Si pensi ad un programma per la gestione della situazione sanitaria dei pazienti di un ospedale. Quando il medico digita il codice del paziente deve apparire la pagina con la sua cartella clinica. Ovviamente non è pensabile che tutti i dati dell'ospedale siano nella memoria del browser: è quindi necessario, quando il medico chiede il dettaglio di una certa patologia, eseguire una richiesta al server "di nascosto", e aggiornare la pagina del paziente, o meglio ancora, una parte di essa, non appena si ottiene la risposta. Altro esempio, una chat. Mentre un utente digita il suo messaggio nella apposita area, deve essere possibile, nel frattempo, ricevere i messaggi degli altri utenti e, anche, mantenere aggiornata la lista degli utenti che escono o entrano in chat, senza dover necessariamente farne richiesta esplicita con conseguente ricaricamento della pagina. Terzo caso, la ricerca incrementale di Google: Ciò che sta alla base degli esempi illustrati, è la capacità di fare richieste al server in maniera asincrona, ovvero in background, senza che l'utente si accorga di niente. In questo modo Javascript può contattare il server spedendo e ricevendo informazioni senza che la pagina venga ricaricata. FLUSSO DELLE ATTIVITÀ Metodo tradizionale (sincrono) client attività utente tempo server elaborazione lato-server Metodo AJAX (asincrono) client interfaccia utente-browser attività utente AJAX elaborazione lato-client tempo server elaborazione lato-server L’OGGETTO XMLHttpRequest EVENTO (onclick, onblur, ... ) FUNZIONE di gestione evento CREAZIONE OGGETTO XMLHttpRequest Definizione parametri della richiesta: POST/GET url pagina di destinazione sinc/asinc querystring funzione di gestione della risposta INVIO RICHIESTA AL SERVER RESTITUZIONE CONTROLLO ALLA PAGINA & ATTESA RISPOSTA DAL SERVER AGGIORNAMENTO PAGINA SENZA RICARICAMENTO (DOM) ELABORAZIONE RICHIESTA COMPLETAMENTO RICHIESTA (DATI ELABORAZIONE) UN’IMPLEMENTAZIONE DI COMUNICAZIONE AJAX: L’OGGETTO AjaxCom POSTrequest GETrequest request XMLHttpRequest / ActiveXObject requestCompleted function AjaxCom() {this.request=null; // verifica che il browser supporti AJAX if (window.XMLHttpRequest) // -------- Firefox, IE7+, Opera, Safari, ... {this.request = new XMLHttpRequest();} else if (window.ActiveXObject) // ------------ IE5 IE6 {this.request = new ActiveXObject("Msxml2.XMLHTTP"); if (! this.request) {this.request = new ActiveXObject("Microsoft.XMLHTTP");} } if (!this.request) {alert ('AJAX non supportato!')}; //---------------------------------------------------------------------------this.reqCompleted = function() // ricezione risposta dal server {if (this.request.readyState == 4) {if (this.request.status== 200) {return true} else {alert('errore HTTPRequest: stato = '+ this.request.status); return false; } } } //---------------------------------------------------------------------------this.POSTrequest = function(action,asynch,respHandle,queryString) {if (queryString != null && queryString.length > 0) {try {this.request.onreadystatechange=respHandle; this.request.open("POST",action,asynch); this.request.setRequestHeader("Content-Type", "application-x-www-form-urlencoded; charset=UTF-8"); this.request.send(queryString); } catch(errv) {alert('errore: '+errv.message);} } } //---------------------------------------------------------------------------this.GETrequest = function(action,asynch,respHandle) {try {this.request.onreadystatechange=respHandle; this.request.open("GET",action,asynch); this.request.send(null); } catch(errv) {alert('errore: '+errv.message);} } } PASSI FONDAMENTALI PER L’IMPOSTAZIONE DELLA COMUNICAZIONE AJAX - Collegamento allo script contenente l’oggetto AjaxCom per la comunicazione col server <script type="text/javascript" src="AjaxCom.js"></script> - Impostazione degli eventi che avviano la richiesta <body onload=”inviaReq1();” > ... <input onenter=”inviaReq2();” ... - Assegnazione degli id agli oggetti “contenitori” della risposta. <div id=”BoxRisposta1” > ... </div> <div id=”BoxRisposta2” > ... </div> - Creazione oggetto per la comunicazione HTTP col server (a seconda del browser XMLHttpRequest / Microsoft.XMLHTTP / Msxml2.XMLHTTP) var reqCom = new AjaxCom(); - Definizione dei parametri della richiesta (che verrà inviata al verificarsi dell’evento programmato, o su richiesta dell’utente) function inviaReq1() { : : : url della pagina sul server che dovrà elaborare la richiesta ( + queryString in caso di queryString con i dati (nel caso di GET deve essere concatenata all’url e non essere specificata nella richiesta) reqCom.POSTrequest(url,true,gestisciResp,queryString); }; oppure GETrequest asincrona (true) / sincrona (false) funzione da eseguire alla ricezione della risposta dal server - Definizione della funzione per la gestione della risposta (Response Handler) function gestisciResp() Dati ricevuti dal server { if (reqCom.reqCompleted()) { var dati = reqCom.request.responseText; document.getElementById("BoxRisposta1").innerHTML=dati; } } ricevuta risposta dal server visualizzazione dei risultati