A partire dal 2004 si è iniziato a sentir parlare sempre più frequentemente di Web 2.0 relativamente ad una serie di nuovi servizi e applicazioni presenti in Internet.
Il termine viene però anche usato per sottolineare una nuova fase di «vitalità» della rete, successiva alla crisi della «new economy» registrata nei primi anni del nuovo millennio, nonché per sottolineare una modalità innovativa di uso delle le risorse di Internet con un ruolo più attivo da parte degli utenti.
Una possibile definizione di Web 2.0 è la seguente: «insieme delle diverse applicazioni presenti nel Web che permettono un elevato livello di interazione tra l’applicazione stessa e l’utente che ne fa uso». |
Occorre notare che questa terminologia è stata proposta solo per designare l'attuale stato evolutivo del Web rispetto alla condizione precedente, per la quale, in origine, non era previsto alcun «numero di versione».
Dal momento però che il termine Web 2.0 è diventato di uso comune, si è pensato di «battezzare» con un numero di versione anche le fasi evolutive precedenti; abbiamo dunque:
Web 1.0: è il Web statico, diffuso nei primi anni '90;
Web 1.5: è il Web dinamico, che ha portato, tra l'altro, alla diffusione delle applicazioni Web, all'avvento del Commercio Elettronico, all'integrazione con le basi di dati.
Una osservazione importante riguarda la natura evolutiva della storia del Web: ogni «versione» non ha cancellato quanto già presente ma ha portato ampliamenti e miglioramenti soprattutto a livello di servizi per gli utenti.
Dal punto di vista tecnologico le basi sono rimaste immutate e sono costituite dal protocollo HTTP e dal linguaggio HTML, risalenti al Web 1.0, cui si sono via via affiancate altre tecnologie come i CSS, i CGI, i linguaggi per le elaborazioni lato servente.
Per completezza è opportuno segnalare che si parla già anche di «Web 3.0» per indicare vari possibili sviluppi futuri fra i quali quello prevalente sembra essere il Web Semantico, che qui però non approfondiamo.
Tornando al Web 2.0, è utile distinguere due punti di vista, o accezioni, per la sua descrizione:
accezione «filosofica» o «sociale»: sottolinea gli aspetti innovativi dell'uso del Web che privilegiano la condivisione e la creazione dei contenuti rispetto alla loro semplice fruizione;
accezione tecnologica: descrive gli strumenti che stanno alla base del Web 2.0 e che permettono una forte integrazione, dinamicità e efficienza dei contenuti e delle applicazioni.
A partire dal 2004 si hanno una serie di novità che giocano un ruolo decisivo per l'affermazione del Web 2.0:
la connettività in rete aumenta in modo considerevole grazie alla sempre maggiore diffusione della banda larga;
l'uso della rete da parte degli utenti aumenta quantitativamente ma soprattutto muta dal punto di vista qualitativo in quanto essi diventano sempre più «coautori» dei contenuti e non più semplici fruitori;
vediamo alcuni esempi:
diffusione di strumenti di autoproduzione e pubblicazione sul Web di contenuti digitali, (soprattutto foto e video) come youtube.com
e flickr.com
;
esplosione del fenomeno delle comunità in rete, come facebook.com
, twitter.com
, last.fm
e molte altre; esse possono essere considerate le discendenti delle BBS (Bullettin Board System) e dei Newsgroup, affermatisi in rete in epoca «pre-Web», ma con livelli di diffusione e partecipazione enormemente superiori;
affermazione dei siti personali e dei Blog, facilmente gestibili e aggiornabili, con conseguente nascita del cosiddetto «Citizen Journalism» o «Giornalismo Partecipativo»
nascita delle enciclopedie collettive in rete (come Wikipedia) in cui i contenuti sono inseriti dagli utenti; la loro affermazione, pur positiva sotto molti punti di vista, comporta però, al pari di altri fenomeni nuovi, come il Giornalismo Collettivo, problematiche di tipo deontologico e di attendibilità;
si affermano le Web Applications (applicazioni modulari, interoperabili e di estrema semplicità d'uso) dotate di sempre maggiori possibilità di integrazione o convergenza, accompagnate dal grande successo di piattaforme per la fruizione dei contenuti alternative al tradizionale Computer;
anche in questo caso possiamo illustrare qualche esempio:
grazie al meccanismo del Mashup l'utente può usufruire dei servizi di più applicazioni Web che lavorano in «sinergia» come nel caso del sito flickr.com
che permette di condividere foto indicando il luogo dello scatto grazie all'integrazione con maps.yahoo.com
; altro esempio simile è quello di housingmaps.com
che, negli Stati Uniti, integra gli annunci immobiliari di craiglist.com
con le mappe di maps.google.com
in modo fa fornire l'ubicazione delle abitazioni oggetto degli annunci;
negli ultimi anni è letteralmente esploso il fenomeno delle «Apps» per i dispositivi iPhone e iPaddella Apple e parallelamente per la piattaforma Android, proposta da Google, basata su Linux e utilizzata in numerosi smartphone e dispositivi mobili di vari altri produttori.
Sicuramente in questi anni un ruolo fondamentale per l'affermazione del Web 2.0 è stato svolto da Google, sia per l'importanza dei servizi offerti da questa azienda, che vanno al di là del «tradizionale» motore di ricerca e che hanno rivoluzionato il mondo delle applicazioni Web, sia per la proposta della piattaforma Android, sia infine, per il lancio di Ajax, che come vedremo tra breve, è uno dei pilastri tecnologici su cui si basano le applicazioni del Web 2.0.
Tali applicazioni vengono spesso definite «beta», cioè non definitive, e siccome la loro evoluzione è continua, anche grazie all'interazione con gli utenti e fra gli utenti, si può prevedere che difficilmente raggiungeranno uno stato consolidato; questa situazione viene illustrata denominando le applicazioni del Web 2.0 come «never ending beta applications».
La novità tecnologica più importante degli ultimi anni per il Web è stata Ajax (Asynchronous JavaScript And XML).
Questo acronimo è stato proposto per la prima volta nel 2005 in un articolo del Jesse James Garrett, intitolato: «Ajax: A New Approach to Web Applications», in cui spiega il nuovo approccio per le applicazioni Web che Google aveva iniziato ad usare (e che ancora usa), nelle piattaforme Google Suggest e Google Maps.
Secondo la definizione di Garrett Ajax non è una nuova tecnologia, ma un aggregato di più tecnologie già esistenti, le quali, se usate in sinergia, permettono di aumentare l'interazione, la dinamicità e l'efficienza delle applicazioni Web.
Grazie anche ad Ajax si è avuta una massiccia evoluzione e diffusione delle cosiddette RIA (Rich Internet Application) progettate e realizzate come le corrispondenti applicazioni «desktop» e che forniscono gli stessi servizi di queste ultime, pur essendo sulla rete (Web based) e quindi usabili dagli utenti in modo diffuso e decentrato. |
Il concetto di «ricchezza» in queste applicazioni va interpretato sotto due punti di vista:
ricchezza del modello dati; significa che dal lato del cliente è possibile rappresentare e gestire strutture dati più complesse, riducendo in questo modo il carico elaborativo dal lato del servente e interagendo con quest'ultimo in modo più snello ed essenziale grazie alla comunicazione asincrona; le risposte elaborate dal servente possono essere parti di pagine e non più necessariamente intere pagine HTML (pagine modulari);
ricchezza dell'interfaccia; significa avere interfacce che sono esteticamente e funzionalmente simili a quelle delle tradizionali applicazioni «desktop».
Nei prossimi paragrafi vengono forniti alcuni dettagli relativi all'uso di Ajax.
Ajax si basa sui seguenti elementi:
presentazione standard utilizzando XHTML e CSS;
interazione con l’utente e visualizzazione dinamica dei contenuti tramite DOM;
scambio e manipolazione delle informazioni utilizzando preferibilmente XML e XSLT;
richiesta delle informazioni in maniera asincrona tramite l’oggetto JavaScript XMLHttpRequest;
uso di JavaScript per «legare» insieme tutte le tecnologie sopracitate.
Con Ajax si può superare il modello classico «richiesta/risposta» delle applicazioni Web, effettuando chiamate asincrone verso il servente.
Ricordiamo infatti che il flusso tradizionale delle applicazini Web, secondo il protocollo HTTP, è il seguente:
Qualsiasi aggiornamento dei dati presentati nella risposta presuppone l'invio di ulteriori richieste da parte del cliente.
Ricordiamo inoltre che in questo tipo di applicazioni il front-end (moduli HTML e risposte) è separato anche fisicamente dalla logica applicativa (oltre che dal back-end), cosa che non avviene nei normali programmi «desktop» nei quali tutte le componenti coesistono in un'unica unità elaborativa.
Questo rende il comportamento delle applicazioni Web particolarmente complesso, lento e macchinoso.
La novità di Ajax consiste nella possibilità di effettuare chiamate asincrone verso il servente, utilizzando codice JavaScript, anche senza che l'utente faccia una richiesta esplicita tramite il programma di navigazione.
Così è possibile ad esempio aggiornare alcuni dati presenti sulla pagina senza necessità di ricaricarla interamente.
Gli schemi delle figure 12.1 e 12.2 illustrano il comportamento delle applicazioni Ajax paragonandolo a quello delle applicazioni Web tradizionali.
Il cardine di tutto il meccanismo è l'oggetto JavaScript XMLHttpRequest grazie al quale si effettuano richieste sincrone e asincrone sfruttando il protocollo HTTP.
Lo scambio di dati che si può realizzare con questo oggetto sarebbe da effettuare, secondo chi ha coniato l'acronimo Ajax, usando il formato XML; in realtà ciò non è assolutamente obbligatorio e si possono utilizzare molti altri formati fra cui il testo puro. |
Grazie ad Ajax la pagina Web può divenire un'entità attiva, dinamica e fortemente responsiva con un comportamento interattivo simile a quello delle applicazioni «desktop»; ecco quindi che sempre più spesso anche nel campo delle applicazioni Web si sente parlare di oggetti come «controlli», «eventi», «finestre» ed altri, tipici della programmazione tradizionale.
Con Ajax la navigazione può essere più piacevole, dinamica e coinvolgente per l'utente; inoltre buona parte dell'elaborazione viene spostata nel cliente alleggerendo il carico del servente e diminuisce anche la quantità di dati da scambiare non essendo più necessario richiedere intere pagine.
Ci sono però anche alcuni svantaggi o problemi da tenere in considerazione:
le applicazioni Ajax non garantiscono compatibilità tra i diversi browser;
è necessario che JavaScript sia attivo nel cliente e questo rende necessarie alternative che consentano il corretto funzionamento dell’applicazione nel caso ciò non sia vero;
il pulsante «indietro» del programma di navigazione diventa inutile in quanto le applicazioni Ajax possono aggiornare di volta in volta una singola porzione di documento;
l'inserimento di segnalibri è praticamente impossibile perché i contenuti delle pagine Ajax sono dinamici;
per lo stesso motivo anche l'indicizzazione da parte dei motori di ricerca può essere molto difficoltosa;
l'accessibilità e l'usabilità dei contenuti può essere compromessa; si pensi ad esempio alla necessità da parte di ipovedenti o ciechi di disabilitare o sovrascrivere il foglio di stile della pagina compromettendo il corretto funzionamento di Ajax che diventerebbe solo un ulteriore intralcio per la navigazione.
Storicamente l'oggetto XMLHttpRequest trova origine nel pacchetto di supporto a XML introdotto da Microsoft nel browser Internet Explorer 5 e precisamente da un componente Activex chiamato XMLHttp.
Successivamente anche tutti gli altri programmi di navigazione hanno seguito questa strada, privilegiando però il linguaggio JavaScript e adottando l'oggetto XMLHttpRequest.
Dalla versione 7 del suo browser, anche Microsoft supporta questo oggetto e questo è sicuramente un beneficio per gli sviluppatori che non sono più costretti a usare oggetti diversi per creare applicazioni Ajax funzionanti con i più diffusi programmi di navigazione.
Per usare l'oggetto XMLHttpRequest occorre compiere le seguenti operazioni fondamentali:
istanziare l'oggetto;
eseguire il metodo open() in modo da inizializzarlo;
associare la funzione che deve gestire la risposta del servente e che prende il nome di callback function;
Vediamole in dettaglio:
per istanziare l'oggetto basta scrivere:
|
il metodo open() prevede come parametri il tipo di richiesta (get o post), l'indirizzo URL a cui inviarla, una variabile booleana da impostare a true affinché la richiesta sia asincrona (con false si ha invece una richiesta sincrona) e opzionalmente un nome utente e relativa password; avremo quindi, ad esempio:
|
la callback function (necessaria solo nel caso di chiamate asincrone) viene utilizzata per ricevere le notifiche sullo stato di avanzamento della richiesta, in modo che il codice JavaScript possa comportarsi di conseguenza e viene associata all'evento onreadystatechange.
Nell'esempio che segue si suppone che la funzione si chiami funzCallback:
|
Per utilizzare al meglio tale funzione è opportuno conoscere almeno le principali proprietà dell'oggetto XMLHttpRequest, riassunte nella tabella seguente:
Naturalmente la funzione di callback ha a disposizione i dati della risposta e anche i valori delle altre proprietà come status e statusText solo nel momento in cui il valore della variabile readyState è 4.
Vediamo una possibile funzione di callback che effettui qualche controllo sull'esito della richiesta:
|
l'invio della richiesta si effettua con il metodo send() che ha come parametro il corpo della richiesta (necessario solo se il tipo di richiesta è post).
Vediamo adesso un listato che riepiloga quanto illustrato finora eseguendo una richiesta di tipo get con lo scopo di ricevere il file eseAjax.html>
al caricamento della pagina Web in cui il codice JavaScript è inserito:
|
Al fine di verificare il funzionamento di quanto esposto, è opportuno ricordare che Ajax si appoggia comunque al protocollo HTTP e quindi la pagina deve essere richiesta ad un servente Web (eventualmente http://localhost
) e non aperta con file://
o con la scelta «Apri file» del menu «File».
Soffermiamoci sulle parti salienti del listato:
alla riga 5 c'è l'istanziazione di XMLHttpRequest con la variabile oggXHR definita globalmente in modo che sia visibile in tutte le parti del codice JavaScript;
il comportamento della funzione di callback funzCallback dovrebbe essere abbastanza chiaro: in particolare si notino le righe 10 e 11 nelle quali, in caso di richiesta esaudita positivamente, viene acquisito il contenuto della pagina ricevuta e inserito come testo HTML dell'elemento inviduato dall'identificativo carica;
tale elemento è una sezione (<div>) del corpo della pagina, definita alla riga 30;
da riga 21 a riga 25 troviamo la funzione che definisce la richiesta e la invia con il metodo send;
tale funzione viene richiamata al caricamento di questa pagina grazie all'evento onLoad definito a riga 29;
se va tutto bene si vede apparire sul browser il contenuto della pagina eseAjax.html, altrimenti la scritta definita a riga 31.
Con una chiamata di tipo post si può richiedere una risposta al servente inviandogli contemporaneamente dei dati, da inserire nel corpo della richiesta, come argomento del metodo send.
Affinché l'invio dei dati funzioni correttamente è necessario che:
venga impostata una intestazione della richiesta con il metodo setRequestHeader nella quale si specifica la chiave Content-Type e il valore application/x-www-form-urlencoded in modo da simulare l'invio dei dati da un modulo HTML;
|
si codifichino le informazioni nel modo previsto cioè con «codifica URL», (della quale abbiamo parlato nel paragrafo 6.9); per effettuare tale codifica può essere usata la funzione JavaScript encodeURIComponent().
Come esempio realizziamo un modulo con un singolo campo in cui inserire il nome di una località che viene inviato con una chiamata di tipo post al servente; la risposta sarà il corrispondente codice di avviamento postale da far apparire a fianco del campo di input.
|
Rispetto all'esempio precedente le differenze principali sono alle righe da 23 a 26 dove viene effettuata la chiamata di tipo post, viene impostata l'intestazione della richiesta e viene fatto l'invio passando il parametro contenente il dato raccolto dal campo di input del modulo.
Il dato ricevuto in risposta (righe 10 e 11) viene inserito nel modulo a fianco del campo di input (riga 40).
Il piccolo modulo usato nell'esempio viene gestito con funzioni JavaScript, sia per l'invio della richiesta (riga 42) che per la pulizia dei dati (riga 43).
Per l'elaborazione dal lato del servente si predispone uno script PHP, elabora.php
che effettua l'associazione tra codice e località usando un piccolo vettore associativo contente nomi e codici delle località Milano, Treviso e Roma (naturalmente questa soluzione non è realistica ed è proposta solo a titolo di esempio).
|
Nelle due figure 12.12 e 12.13 vediamo il comportamento della pagina appena realizzata.
|
|
Anche se non è importante nell'ambito di Ajax, il metodo XMLHttpRequest permette di effettuare anche chiamate sincrone; basta usare il metodo open passando come terzo parametro il valore false.
In questo caso non è necessario gestire l'evento onreadystatechange e quindi non serve la funzione di callback.
|
Questo esempio produce lo stesso risultato di quello «asincrono» mostrato nel paragrafo 12.4.1 con la differenza che il cliente, rimane bloccato in attesa della risposta per tutto il tempo necessario al servente ad elaborare e inviare la risposta stessa.
Si ha quindi un comportamento del tutto analogo a quello «classico» delle applicazioni Web tradizionali con tutte le conseguenze che da ciò discendono dal punto di vista della logica elaborativa e dei tempi di risposta della procedura.
Per concludere questa rapida carrellata su Ajax vediamo un esempio un po' più complesso in cui viene gestito un modulo di immissione dati su una macchina cliente grazie ad una interazione «continua» con il servente che deve ricevere e controllare le informazioni.
In particolare supponiamo che il modulo serva a registrarsi ad un qualche tipo di servizio e richieda obbligatoriamente un nome utente, una password con relativa conferma, un indirizzo di posta elettronica.
La logica di funzionamento dell'interfaccia è la seguente:
il nome utente non deve essere già esistente;
la password deve essere lunga almeno 6 caratteri;
l'indirizzo di posta deve essere sintatticamente corretto (secondo quanto stabilito nell'esempio del paragrafo 7.7) e non essere già esistente;
i controlli sui campi avvengono quando ognuno di essi perde il «focus» e prevedono la visualizzazione di un riscontro positivo o di un breve messaggio di errore, a fianco del campo stesso;
l'acquisisione definitiva dei dati da parte del servente avviene alla pressione di un apposito tasto, previo controllo sull'effettivo inserimento di tutti i campi.
Anche stavolta il motore applicativo sul servente, scritto in PHP, viene solo abbozzato utilizzando dei vettori associativi con dati predefiniti e non, come sarebbe logico, archivi gestiti dal back-end della procedura.
A differenza degli esempi dei paragrafi precedenti, la parte relativa all'interfaccia viene realizzata scrivendo le funzioni JavaScript in un file separato dal file HTML.
Analogamente agli esempi precedenti, non viene invece curato l'aspetto esteriore della pagina e dei messaggi di risposta; quindi l'uso dei CSS è ridotto al minimo indispensabile.
Iniziamo mostrando il sorgente HTML con il modulo di immissione dei dati:
|
Importante notare, all'interno del modulo, il richiamo della funzione controlla alla perdita del «focus» di ogni campo, la definizione delle aree per accogliere i messaggi di risposta di tale funzione (con uso del tag <span>), il richiamo delle funzioni inviaDati e pulisci rispettivamente alla pressione dei pulsanti di conferma e di reset.
Il file con le funzioni JavaScript e le chiamate Ajax è il seguente:
|
Servendoci della numerazione delle righe commentiamo i punti più importanti del listato:
la funzione controlla (riga 2) viene richiamata passando come parametri il nome del campo da controllare e il numero progressivo dello stesso;
la sua funzione di callback (righe da 4 a 28) è scritta direttamente all'interno e non separatamente come negli esempi precedenti;
alla riga 31 viene preparato il dato da passare allo script moduloAjax.php
sul servente grazie al nome (parametro campo) e al rispettivo valore (acquisito con la funzione JavaScript getElementById());
se il campo da controllare è la seconda password vengono passate entrambe le password per permettere il controllo sulla loro uguaglianza (righe da 32 a 34);
nella funzione di callback, alla riga 8, viene impostata il nome dell'area in cui far apparire il messaggio di risposta;
nelle righe dalla 11 alla 16 si imposta il flag flagErr in base al fatto che il campo sia errato o no; tale flag serve poi nella funzione inviaDati;
se il terzo campo è errato, cioè se la seconda password non coincide con la prima, si pulisce la seconda password (righe da 17 a 19);
la funzione pulisci elimina il testo di output dalle relative aree; il parametro che riceve indica il numero di aree da pulire (righe da 39 a 42);
la funzione inviaDati agisce solo se il relativo pulsante è stato attivato in assenza di errori sui campi (righe da 45 a 47) e prosegue passando tutti i dati allo script moduloAjaxInvio.php
sul servente (righe da 66 a 70);
nella sua funzione di callback si ha la visualizzazione del messaggio di risposta proveniente da tale script (riga 54).
Vediamo infine i due listati PHP rispettivamente per il controllo dei singoli campi e per l'elaborazione finale dei dati inviati:
|
|
Data la banalità delle elaborazioni svolte, non è necessario fornire grosse spiegazioni sul comportamento dei due script; si noti solo l'uso della funzione array_flip grazie alla quale si ha a disposizione un vettore associativo in cui è scambiato il ruolo dei valori con quello delle chiavi (la cosa è possibile solo se anche i valori, oltre alle chiavi, sono univici) e che viene usato per il controllo di non esistenza dell'indirizzo di posta.
Per il resto sottolineiamo, ancora una volta, le semplificazioni presenti sia nello script dei controlli che in quello per l'invio dai dati, nel quale, tra l'altro, manca del tutto la parte di elaborazione e memorizzazione dei dati ricevuti.
Le due figure 12.19 e 12.20 mostrano sommariamente il funzionamento dell'interfaccia nel caso ci sia un campo errato e in quello in cui l'invio dei dati è andato a buon fine.