Introduzione ad AJAX - Uniudivan.scagnetto/lato_server/AJAX.pdfComplementi di Tecnologie Web A.A....
Transcript of Introduzione ad AJAX - Uniudivan.scagnetto/lato_server/AJAX.pdfComplementi di Tecnologie Web A.A....
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 1
Introduzione ad AJAX
Asynchronous Javascript And XML
(PWLS 6.9, 6.10)
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 2
Limitazioni delle applicazioni web “tradizionali”
• I limiti percepiti dall'utente sono:– lentezzalentezza nel caricamento delle pagine;
– necessità di ricaricarericaricare l'intera pagina ad ogni interazione.
• Tali limiti derivano direttamente dall'HTTP e dalla modalità di interazione client/server classica:– il browser (client) invia una richiesta (HTTP);
– il web server riceve la richiesta ed elabora una risposta;
– la risposta viene inviata al client che la visualizza/gestisce.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 3
Round-trip time (RTT)
RTT è il tempo richiesto per l'invio di una richiesta da parte del client e la ricezione della risposta (escluso il tempo di trasferimento dei dati).
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 4
Rich Internet Application (RIA)
• Una Rich Internet Application è un'applicazione web che si avvicina (dal punto di vista della qualità dell'interazione) ad un'applicazione standard di tipo desktop.
• Si cerca di “spostare” gli aspetti maggiormente interattivi sul lato client.
• Adobe Flash, Java FX e Microsoft Silverlight sono esempi di piattaforme per lo sviluppo di applicazioni di questo tipo.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 5
AJAX (1)
• AJAXAJAX significa AAsynchronous JJavascript AAnd XXML.
• Non è una tecnologia, ma un modo di modo di utilizzare assieme una serie di utilizzare assieme una serie di tecnichetecniche di programmazione lato client e lato server per ottenere applicazioni web piu interattive.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 6
AJAX (2)• HTML "tradizionale"
– ad ogni azione dell’utente corrisponde una richiesta al server,
– che provoca la spedizione di un’intera pagina HTML verso il browser
• con AJAX è possibile aggiornare parti della paginaaggiornare parti della pagina senza che sia necessario ricaricarla completamente– Esempi:– http://www.google.com/webhp?complete=1&hl=en– http://maps.google.com
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 7
AJAX (3)
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 8
AJAX (4)• Insieme di tecnologie (non specificamente server-side,
ma prevalentemente client -side):– XHTMLXHTML e CSSCSS standard;– Visualizzazione e interazione dinamica tramite
DDocument OObject MModel;– Scambio dati e manipolazione basate su XMLXML e
XSLTXSLT;– Recupero asincrono di dati tramite l’oggetto
XMLHttpRequestXMLHttpRequest;– Il tutto connesso tramite JavascriptJavascript
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 9
AJAX (5)
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 10
AJAX (6)
• AJAX è utile per creare interfacce "ricche", che vadano oltre l'attuale modello per il web.– Quindi applicazioni web e non semplici pagine
informative.• Problemi?
– Accessibilità: può degradare.– Explorer 5.5 e 6 implementano
XMLHttpRequest tramite ActiveX.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 11
Altri limiti/problemi relativi ad AJAX
• AJAX non è la “panacea” per tutti i mali; infatti presenta anche qualche svantaggio:– non rispetta alcune delle funzionalità tipiche di un
browser (come il tasto “back” per la navigazione all’indietro, o la possibilità di salvare dei bookmark)
– problemi di sicurezza,– i browser al momento non gestiscono tutti allo
stesso modo questa tecnologia; quindi è necessario porre attenzione agli aspetti specifici dei singoli browser, rendendo così piu complessa la programmazione.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 12
XMLHttpRequest: attributi• onreadystatechange: contiene la funzione che
gestisce l’evento lanciato, ad ogni cambiamento di stato.• readyState: stato corrente dell'istanza di XMLHttpRequest:– 0 = non inizializzato, 1 = aperto, 2 = richiesta inviata,
3 = risposta in ricezione e 4 = risposta ricevuta.
• responseText: risposta del server in formato stringa• responseXML: risposta del server in XML• status: codice HTTP restituito dal server
– per esempio 404 per "Not Found" e 200 per "OK".
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 13
XMLHttpRequest: (alcuni) metodi• setRequestHeader(chiave, valore): aggiunge uno
header alla richiesta.• open(metodo, URL, async): prepara una richiesta HTTP:
– metodo: GET o POST (o PUT);– URL relativo o assoluto;– async: true, lo script prosegue l’elaborazione senza aspettare; false
aspetta.
• send(content): invia la richiesta.• abort(): cancella la richiesta in atto.• getAllResponseHeaders(): restituisce sotto forma di
stringa tutti gli header HTTP ricevuti dal server.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 14
Attributi di XHTML correlati a Javascript
Esempio (controlla valori immessi, prima della spedizione):<form action="script.php" method="post" onSubmit="check()" />
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 15
Esercizio• Svilupperemo una pagina web con tre campi
di input in cui inseriremo tre numeri per i valori di R,G,B con cui impostare il colore di sfondo della pagina,
• Il tutto “asincronamente” (senza ricaricare).• (NB: si può fare tutto solo con Javascript! Ma
è l’esercizio più semplice)
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 16
Struttura
• Una pagina web dotata di alcune funzioni lato client scritte in Javascript:– dopo avere scritto la stringa nei campi di input, una
funzione invia i valori alla parte lato server e aggiorna dinamicamente la pagina alla ricezione del risultato, senza ricaricare la pagina completa;
– due parti: il codice XHTML e quello Javascript.
• Uno script PHP: riceve i valori R G B via GET dalla parte lato client, costruisce la stringa “rgb(R,G,B)” e la invia indietro alla pagina web.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 17
La parte XHTML (colori1.php)…
<body id="corpo"> <h1>Colori RGB in Ajax</h1>
R: <input type="text" name="R" id="r" value="255" size="3" onblur="spedisci(document.getElementById('r').value,document.getElementById('g').value,document.getElementById('b').value);"/>
G: <input type="text" name="G" id="g" value="255" size="3" />
B: <input type="text" name="B" id="b" value="255" size="3" />
<input type="button" value="Cambia sfondo" onclick="spedisci(document.getElementById('r').value,document.getElementById('g').value,document.getElementById('b').value);" />
<p id="descrizione"> - </p></body> </html>
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 18
La parte Javascript/1<html><head><title>Colori RGB</title> <script type="text/javascript">function spedisci(R,G,B) { document.getElementById("descrizione").innerHTML = "---attendi...----";
server = 'ajaxserver1.php?R=' + R + '&G=' + G + '&B=' + B;
richiesta = new XMLHttpRequest(); richiesta.onreadystatechange = updateasincrono; richiesta.open("GET", server, true); richiesta.send(null);}
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 19
La parte Javascript/2
function updateasincrono(){ if ((richiesta.readyState == 4) && (richiesta.status == 200)) { esito=richiesta.responseText; document.getElementById("corpo").style.background
=esito; document.getElementById("descrizione").innerHTML =esito;
} }</script></head>
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 20
Lo script lato server (ajaxserver1.php)
<? function ImpostaSfondo($r, $g, $b) { $risposta = "rgb($r,$g,$b)"; return $risposta;
}
echo ImpostaSfondo($_GET['R'],$_GET['G'], $_GET['B']);?>
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 21
Commenti• spedisci(R,G,B): invia la richiesta asincrona,
– all’url ajaserver1.php, con query uguale a R=r&G=g&B=b– stabilendo che la gestione della risposta verrà fatta dalla funzione updateasincrono()
• updateasincrono(): quando lo stato della richiesta è 4 (=risposta ricevuta) e l’esito è 200 (=OK),– tramite DOM modifica il colore di sfondo del corpo e il contenuto
dell’elemento che ha id=descrizione
• In questa versione semplice, lo script lato server si limita ad emettere una stringa, che quindi non è necessario codificare in XML– Se dovesse restituire piu dati, potremmo usare XML, JSON, o anche
XHTML direttamente!
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 22
Sicurezza
• Same Origin Policy: https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript
• Cosa vuol dire?– Uno script Javascript non può accedere a
dati/risorse al di fuori dell'origine della pagina in cui risiede.
– L'origine è definita da: protocollo, host e (se specificato) numero di porta.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 23
Un esempio piu complesso
• Costruiamo un’applicazione AJAX che, oltre a recuperare la risposta dal web server, invii anche dei dati (query).
• La pagina PHP a cui sarà indirizzata la richiesta dovrà tener conto della query nella generazione della risposta.
• In particolare vogliamo inviare al client soltanto le righe di un file di testo (sul server) che contengano la stringa inviata nella query.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 24
Dettagli dell’applicazione
• Il file di testo sul server si chiamerà “lista_computer.txt” e conterrà in ogni riga il nome di un computer.
• La pagina PHP computer.php accetta in input come parametro una stringa che utilizza come “filtro” per produrre in output soltanto le righe del file “lista_computer.txt” che la contengono.
• La pagina statica AjaxComputerList.html conterrà il codice Javascript responsabile dell’inoltro della richiesta al server web e della visualizzazione della risposta.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 25
Il file lista_computer.txt
Dell Optiplex
Dell Inspiron
Dell Dimension
iMac
Sun Ultra 1
Gateway laptop
...
Gateway 800
Palm VII
Handspring Visor
Atari
Beowulf Cluster II
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 26
computer.php
<?php
if(!isset($_REQUEST['query']))
$query="";
else
$query=$_REQUEST['query'];
$filename='lista_computer.txt';
$f = fopen($filename, "r");
$contenuto = fread($f, filesize($filename));
fclose($f);
$computer = explode("\n",$contenuto);
$risultato="";
for($i=0; $i<count($computer); $i++)
if(!(stripos($computer[$i],$query)===false))
$risultato=$risultato . $computer[$i] . "<br>";
echo $risultato;
?>
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 27
La pagina statica
<html>
<head>
<title>
</title>
<script type="text/javascript"><!--
...
//--></script>
</head>
<body>
<form name="mioform">
Inserisci una stringa: <input type="text" name="query" size="10" onBlur="javascript:RecuperaLista();"><br>
<span id="risultato"></span>
</form>
</body>
</html>
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 28
Le funzioni Javascript utilizzate
• In modo analogo all’esempio precedente vi sono due funzioni nel codice Javascript:– RecuperaLista(): funzione richiamata
dall’evento di perdita del focus della casella di testo della pagina (elemento <input>); serve a generare la richiesta dopo aver inizializzato un oggetto XMLHttpRequest;
– UpdateAsincrono(): funzione avente lo scopo di attendere la risposta dal server, aggiornando la pagina con la visualizzazione del risultato.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 29
RecuperaLista
function RecuperaLista() {function RecuperaLista() {
document.getElementById("risultato").innerHTML = " document.getElementById("risultato").innerHTML = " ricerca in corso ";ricerca in corso ";
var valore = window.document.mioform.query.value;var valore = window.document.mioform.query.value;
richiesta = new XMLHttpRequest();richiesta = new XMLHttpRequest();
richiesta.onreadystatechange = UpdateAsincrono;richiesta.onreadystatechange = UpdateAsincrono;
richiesta.open("GET","computer.php?query="+valore, richiesta.open("GET","computer.php?query="+valore, true);true);
richiesta.send(null);richiesta.send(null);
}}
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 30
UpdateAsincrono
function UpdateAsincrono() {function UpdateAsincrono() {
if((richiesta.readyState == 4) && (richiesta.status if((richiesta.readyState == 4) && (richiesta.status == 200)) {== 200)) {
var esito = richiesta.responseText;var esito = richiesta.responseText;
document.getElementById("risultato").innerHTML = document.getElementById("risultato").innerHTML = esito;esito;
}}
}}
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 31
Esempio di esecuzione
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 32
In Explorer 6…
• L’oggetto XMLHttpRequest è realizzato con un ActiveX, quindi:
if (window.XMLHttpRequest) { // Mozilla, Safari, …
richiesta = new XMLHttpRequest();} else if (window.ActiveXObject) { // IE
richiesta = new ActiveXObject(”Msxml2.XMLHTTP”); //IE6
}
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 33
Una pagina di test (I)
<html>
<head>
<title>
</title>
<script type="text/javascript"><!--<script type="text/javascript"><!--
function ajaxFunction() {function ajaxFunction() {
var xmlHttp;var xmlHttp;
var tipoBrowser="Firefox, Opera 8.0+, Safari, Internet Explorer var tipoBrowser="Firefox, Opera 8.0+, Safari, Internet Explorer 7.0+";7.0+";
try { // Firefox, Opera 8.0+, Safari, Internet Explorer 7.0try { // Firefox, Opera 8.0+, Safari, Internet Explorer 7.0
xmlHttp=new XMLHttpRequest();xmlHttp=new XMLHttpRequest();
}}
catch(e) {catch(e) {
......
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 34
Una pagina di test (II)
tipoBrowser="Internet Explorer 6.0+";tipoBrowser="Internet Explorer 6.0+";
try {try {
// Internet Explorer 6.0+// Internet Explorer 6.0+
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}}
catch(e) {catch(e) {
tipoBrowser="Internet Explorer 5.5+";tipoBrowser="Internet Explorer 5.5+";
try {try {
// Internet Explorer 5.5+// Internet Explorer 5.5+
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}}
catch(e) {catch(e) {
tipoBrowser="Il tuo browser non supporta AJAX!";tipoBrowser="Il tuo browser non supporta AJAX!";
}}
}}
}}
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 35
Una pagina di test (III)
document.getElementById("msg").innerHTML="Tipo di browser: document.getElementById("msg").innerHTML="Tipo di browser: "+tipoBrowser;"+tipoBrowser;
}}
//--></script>//--></script>
</head>
<body>
<a href="javascript:ajaxFunction()javascript:ajaxFunction()">Test</a><br />
<span id="msg"id="msg"></span>
</body>
</html>
La pagina presentata ci permette di verificare se il nostro browser supporta la tecnologia AJAX.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 36
Dobbiamo fare tutto da zero?
• Chiaramente no: esistono numerose librerie che implementano:– comunicazione asincrona,– codifica/decodifica XML,– funzioni avanzate per l’interfaccia utente
• es.: utilizzo avanzato del mouse (posizione, ecc).
• Es.: GoogleGears, XAjax