UpdateAsincrono()

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 - 1
Limitazioni delle applicazioni web
“tradizionali”
• I limiti percepiti dall'utente sono:
– lentezza nel caricamento delle pagine;
– necessità di ricaricare 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 - 2
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 - 3
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 - 4
AJAX (1)
• AJAX significa Asynchronous Javascript
And XML.
• Non è una tecnologia, ma un modo di
utilizzare assieme una serie di
tecniche di programmazione lato client e
lato server per ottenere applicazioni web
più interattive.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 5
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 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 - 6
AJAX (3)
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 7
AJAX (4)
• Insieme di tecnologie (non specificamente server-side,
ma prevalentemente client -side):
– XHTML e CSS standard;
– Visualizzazione e interazione dinamica tramite
Document Object Model;
– Scambio dati e manipolazione basate su XML e
XSLT;
XSLT
– Recupero asincrono di dati tramite l’oggetto
XMLHttpRequest;
XMLHttpRequest
– Il tutto connesso tramite Javascript
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 8
AJAX (5)
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 9
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 - 10
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ì più complessa la
programmazione.
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 11
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 - 12
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 - 13
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 - 14
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 - 15
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 - 16
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.get
ElementById('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.ge
tElementById('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 - 17
La parte Javascript/1
<html>
<head>
<title>Colori RGB</title>
<script type="text/javascript">
function spedisci(R,G,B) {
document.getElementById("descrizione").innerHTM
L = "---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 - 18
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 - 19
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 - 20
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 più 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 - 21
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 - 22
Un esempio più 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 - 23
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 - 24
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 - 25
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 - 26
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 - 27
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 - 28
RecuperaLista
function RecuperaLista() {
document.getElementById("risultato").innerHTML = "
ricerca in corso ";
var valore = window.document.mioform.query.value;
richiesta = new XMLHttpRequest();
richiesta.onreadystatechange = UpdateAsincrono;
richiesta.open("GET","computer.php?query="+valore,
true);
richiesta.send(null);
}
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 29
UpdateAsincrono
function UpdateAsincrono() {
if((richiesta.readyState == 4) && (richiesta.status
== 200)) {
var esito = richiesta.responseText;
document.getElementById("risultato").innerHTML =
esito;
}
}
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 30
Esempio di esecuzione
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 31
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 - 32
Una pagina di test (I)
<html>
<head>
<title>
</title>
<script type="text/javascript"><!-function ajaxFunction() {
var xmlHttp;
var tipoBrowser="Firefox, Opera 8.0+, Safari, Internet Explorer
7.0+";
try {
// Firefox, Opera 8.0+, Safari, Internet Explorer 7.0
xmlHttp=new XMLHttpRequest();
}
catch(e) {
...
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 33
Una pagina di test (II)
tipoBrowser="Internet Explorer 6.0+";
try {
// Internet Explorer 6.0+
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e) {
tipoBrowser="Internet Explorer 5.5+";
try {
// Internet Explorer 5.5+
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e) {
tipoBrowser="Il tuo browser non supporta AJAX!";
}
}
}
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 34
Una pagina di test (III)
document.getElementById("msg").innerHTML="Tipo di browser:
"+tipoBrowser;
}
//--></script>
</head>
<body>
<a href="javascript:ajaxFunction()">Test</a><br
/>
javascript:ajaxFunction()
<span id="msg"></span>
id="msg"
</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 - 35
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
Complementi di Tecnologie Web A.A. 2011-2012 – M.Franceschet, V.Della Mea e I.Scagnetto - 36