Top Banner
Perché Ajax è importante, oggi 25 gennaio 2006 Iacopo Sassarini, Tommaso Torti
96

Antica presentazione AJAX

Jul 16, 2015

Download

Internet

Tommaso Torti
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Antica presentazione AJAX

Perché Ajax è importante, oggi 25 gennaio 2006

Iacopo Sassarini, Tommaso Torti

Page 2: Antica presentazione AJAX

© 2006 Quinary SpA

Contenuti

• Alcune applicazioni interessanti• Che cosa è Ajax• Perché oggi?• Il “core Ajax”• I principali problemi delle applicazioni Ajax• Alcuni scenari di utilizzo di Ajax• Coffee break• Ajax Patterns (una selezione)• Toolkits e Frameworks• Ajax Security• Strumenti per lo sviluppo• Evoluzioni della tecnologia Ajax• Cosa offre Quinary, oggi: AjaxScope• Sviluppare con DWR

Page 3: Antica presentazione AJAX

© 2006 Quinary SpA

Alcune applicazioni interessanti

• WebMail: GMail• Mappe: Google Maps, Mapquest• Search Engines: Google Suggest, Yahoo Instant Search • RSS Aggregators: Google RSS Reader• Photo sharing: Flickr• Desktops virtuali: Netvibes, Google IG, Windows Live, Protopage• Condivisione documenti: Writely• Ajax APIs: Salesforce Ajax Toolkit, Google Maps APIs

Page 4: Antica presentazione AJAX

© 2006 Quinary SpA

Che cosa è Ajax

Page 5: Antica presentazione AJAX

© 2006 Quinary SpA

Cos’è Ajax

• Acronimo “Asynchronous Javascript and XML”• Non identifica propriamente una nuova tecnologia, ma piuttosto un tecnica di

utilizzo un insieme di tecnologie consolidate (XHTML, CSS, Javascript, XML) per la creazione in interfacce web di nuova generazione, ricche, dinamiche, usabili.

• E’ oggi una delle possibili risposte tecnologiche all’esigenza di superare o semplicemente arricchire il paradigma document-request su cui è fondato il “Web 1.0”.

Page 6: Antica presentazione AJAX

© 2006 Quinary SpA

Alternative ad Ajax

• XUL: linguaggio di markup per la definizione di GUI dinamiche. E’ parte del progetto Mozilla. Attualmente è compatibile solo con i browser della famiglia Mozilla

• XAML: è parte integrante del progetto Avalon (UI di prossima generazione Microsoft). E’ una tecnologia proprietaria Microsoft.

• SVG: linguaggio per descrivere grafica vettoriale ed ambedding di grafica raster. Interoperabile con Javascript. W3C recommendation. Richiede skills piuttosto difficili da reperire e le attuali implementazioni non sono completamente mature

• Java Applets• Macromedia Flash Applets

Page 7: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax ed alternative: tabella comparativa

XUL XAML SVG Flash Applets Ajax

Desktop-like UI * * * * * *

Platform Independance * * *

Vendor Independance *

Skill Set Transferrance * *

http://www.ajaxinfo.com/

Page 8: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Client Model

• Superamento dell’ impostazione document-request alla base del Web 1.0• Completo disaccoppiamento tra rendering e scambio di dati• Possibilità di interazioni multiple ed asincrone con il server all’interno

della medesima pagina• I browsers si evolvono da rendering engine a piattaforme che

implementano API standard per il deploy di applicazioni complesse ed altamente interattive

• Mozilla Firefox è oggi il prototipo dei browsers di nuova generazione

Page 9: Antica presentazione AJAX

© 2006 Quinary SpA

Server

Web/App Server

Backend services

Browser

HTML Page

Form

Server

Web/App Server

Backend services

Browser

HTML Page

Ajax Engine

Form

sub

mit

Load

nuo

va p

agin

a

GU

I eve

ntD

ata

requ

est

GU

I upd

ate

resp

onse

Page 10: Antica presentazione AJAX

© 2006 Quinary SpA

Tecnologie

• XHTML: struttura GUI• CSS: presentation, stili• Javascript: logica applicativa client-side• Javascript DOM binding: accesso in lettura-scrittura al document

model della pagina• XMLHttpRequest, IFrame, Applet, Flash: bridge tra client e server• Servizi server side (Java, PHP, ASP,…): business logic e storage• XML, JSON: dati e trasporto

Page 11: Antica presentazione AJAX

© 2006 Quinary SpA

XMLHttpRequest IFrame Applet …

Remoting Toolkit – Client Side DWR, JSON-RPC, dojo.bind, BackBase…

GUI Toolkit Dojo, BackBase, Scriptaculous, SmartClient,…

Java

scrip

t D

OM

bin

ding

Remoting Toolkit – Server Side

Java PHP ASP Ruby …

Trasporto HTTP(S)

Page 12: Antica presentazione AJAX

© 2006 Quinary SpA

Perché oggi?

Page 13: Antica presentazione AJAX

© 2006 Quinary SpA

• Applet Java e LiveConnect API• Una applet java nascosta gestisce l’interfaccia HTTP con le componenti

server, espone i propri metodi pubblici e comunica col Javascript engine tramite LiveConnect

• Event handlers Javascript (es. onclick) intercettano azioni dell’utente e chiamano funzioni Javascript sul client, che a loro volta invocano metodi sulla applet

• L’ applet invoca metodi remoti sul server• Il server ritorna codice Javascript che aggiorna lo stato della pagina• L’ applet invoca l’ eval() del codice Javascript:

<APPLET ... MAYSCRIPT>

JSObject.getWindow(this).eval(jsCode);

Page 14: Antica presentazione AJAX

© 2006 Quinary SpA

HTML

Javascript Client Logic

Applet

LiveConnect Java-Javascript bridge

Server Components

Browser

page

tran

sitio

ns

HTM

L pa

ges

in-p

age

actio

ns

Java

scrip

t cod

e

Page 15: Antica presentazione AJAX

© 2006 Quinary SpA

• Impossibile sviluppare applicazioni cross-browser a causa della scadente implementazione DHTML sui browser Netscape.

• Non completa gestione degli aspetti di GUI perché le tecnologie DHTML e CSS non erano ancora del tutto mature/complete

• Problemi di freezing e bugs con alcune versioni della JVM Microsoft• Scarsa confidenza nella possibilità di realizzare applicazioni realmente

affidabili e durevoli nel tempo

Però….

• Eresia: MSIE 4.0 era un browser all’avanguardia e per di più documentato in modo eccellente

Page 16: Antica presentazione AJAX

© 2006 Quinary SpA

• 1998: CSS Level 2 W3C recommendation• 2000: XHTML W3C recommendation• 2000: ECMA-262 Edition 4 (es. regular expressions, try/catch…)• 2000: DOM Level 2 ed ECMAScript binding W3 recommendation• 2000: XMLHttpRequest implementato in MSIE5• 2002: Mozilla 1.0• 2002: Phoenix browser (precursore di Firefox)• 2003: Inizio della fine del dominio MSIE ?• 2004: Firefox 1.0• 2004: “Altri” (Opera, Safari) conquistano quote significative di utenti• Febbraio 2005: J.J. Garrett pubblica “Ajax: A new approach to web

applications”

Page 17: Antica presentazione AJAX

© 2006 Quinary SpA

Page 18: Antica presentazione AJAX

© 2006 Quinary SpA

Conseguenze

• Il 2003 segna un’inversione di tendenza: MSIE comincia a perdere utenti a vantaggio dei browsers Mozilla

• Altri players entrano in gioco

Conseguenze:

• Chi realizza applicazioni web deve far riferimento al comune denominatore di tecnologie standard per massimizzare la compatibilità

• Chi fa i browser è costretto ad implementare gli standard in modo robusto se vuole avere diffusione del proprio prodotto

• Oggi non capita quasi più di andare sul sito e doverlo visualizzare per forza con MSIE, ma solo un anno fa….

Page 19: Antica presentazione AJAX

© 2006 Quinary SpA

Il “core” Ajax

Page 20: Antica presentazione AJAX

© 2006 Quinary SpA

XMLHttpRequest IFrame Applet …

Remoting Toolkit – Client Side DWR, JSON-RPC, dojo.bind, BackBase…

GUI Toolkit Dojo, BackBase, Scriptaculous, SmartClient…

Java

scrip

t D

OM

Bin

ding

Remoting Toolkit – Server Side

Java PHP ASP Ruby …

Trasporto HTTP(S)

Page 21: Antica presentazione AJAX

© 2006 Quinary SpA

Il “core” Ajax.

Page 22: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Core: Javascript

Javascript ha una pessima reputazione…

• Implementazioni bacate nei browsers• Codice scritto male, duplicato, mischiato all’HTML• Usato principalmente per “web hacking”• Usato da “non programmatori”• Mancanza di tools per sviluppo, debug, test

Però …

• E’ un linguaggio estremamente potente ed estendibile• Supporta Object Orientation tramite prototyping• Il codice può essere strutturato e reso manutenibile• Esistono librerie, componenti riutilizzabili, frameworks• Stanno cominciando ad essere strumenti di sviluppo

Page 23: Antica presentazione AJAX

© 2006 Quinary SpA

Il “core” Ajax

Page 24: Antica presentazione AJAX

© 2006 Quinary SpA

• XMLHttpRequest è un HTTP UserAgent Javascript. Supporta i metodi standard HTTP ed il protocollo HTTPS.

• L’introduzione di questo oggetto nelle librerie Javascript dei browsers ha contribuito al consolidamento del modello del client Ajax

• Ha reso più strutturato credibile l’intero approccio fornendo fondamenta documentate, quasi cross-browser

Page 25: Antica presentazione AJAX

© 2006 Quinary SpA

XMLHttpRequest non è un oggetto standard

• Introdotto in MSIE 5.0 come componente ActiveX• Implementato a partire da Mozilla 1.0, Safari 1.2, Opera 8.0• Non esiste alcuno standard che ne definisce il comportamento, è divenuto

uno standard di fatto.• DOM Level 3 (raccomandazione W3C 2004) include funzionalità simili (load/

save) ed è probabilmente destinato a sostituire a lungo termine l’utilizzo di XMLHttpRequest

• “La maggior parte delle pagine ben progettate che usano XMLHTTP sono destinate a nascondere le implementazioni dell'oggetto XMLHttpRequest incapsulando la sua invocazione con una funzione Javascript” (Wikipedia)

Page 26: Antica presentazione AJAX

© 2006 Quinary SpA

• Occorre scrivere codice che tenga conto delle diverse implementazioni nei browsers

function createXMLHttpRequest(){ try {return new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {}

try {return new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {}

try {return new XMLHttpRequest();} catch(e) {} return null; } ... var client = createXMLHttpRequest();

Page 27: Antica presentazione AJAX

© 2006 Quinary SpA

Usare XMLHttpRequest in modo sincrono

• XMLHttpRequest può essere utilizzato in modo sincrono

• L’esecuzione rimane bloccata sulla chiamata send(null) fino a quando l’intero stream di risposta è stato letto

• Si tratta di un utilizzo di scarsa utilità in applicazioni reali

var client = createXMLHttpRequest(); client.open(“GET”, “data.xml”, false); client.send(null); var serverResponse = client.responseText;

Modalità sincrona

Page 28: Antica presentazione AJAX

© 2006 Quinary SpA

var client = createXMLHttpRequest(); client.open(“GET”, “data.xml”, true); client.onreadystatechange = clientChanged; client.send(null);

function clientChanged(){ if (client.readyState == 0){} … }

• L’utilizzo asincrono richiede la registrazione di una funzione di callback• La funzione di callback viene chiamata ad ogni cambio di stato dell’oggetto

Page 29: Antica presentazione AJAX

© 2006 Quinary SpA

UNINITIALIZED(0)

LOADING(1)

LOADED(2)

INTERACTIVE(3)

COMPLETED(4)

send()

HTTP Statusreceived

First chunk of datareceived

Next chunk of datareceived

Last chunk of datareceived

Last chunk of datareceived

Page 30: Antica presentazione AJAX

© 2006 Quinary SpA

XMLHttpRequest: metodi

Metodo Descrizioneopen("method", "URL"[, asyncFlag[,"userName"[, "password"]]])

Inizializza la richiesta. asynchFlag controlla il carattere asincrono o meno; username/password sono usati per la basic authentication.send(content) Invia la richiesta (content = POST data)

abort() Interrompe la richiestagetAllResponseHeaders() Restituisce una mappa degli

headersgetResponseHeader("header") Restituisce uno specifico

headersetRequestHeader("label", "value") Imposta header della

request

Page 31: Antica presentazione AJAX

© 2006 Quinary SpA

XMLHttpRequest: proprietà principali

Proprietà DescrizioneonReadyStateChange Imposta la funzione di callbackreadyState Ritorna lo stato:

0 = uninitialized1 = loading2 = loaded3 = interactive4 = complete

responseText Contenuto della response, plain textresponseXML DOM XML della responsestatus Valore numerico della stato HTTPstatusText Descrizione dello stato HTTP

Page 32: Antica presentazione AJAX

© 2006 Quinary SpA

• Generazione di contenuti parziali server side

• Inserimento del contenuto negli elementi della pagina tramite innerHTML

• Il server ritorna codice Javascript• Il client effettua un eval() del

codice restituito

Ritornare dati Ritornare HTML Ritornare Javascript

• interfacciare direttamente webservices

• Il client Javascript usa responseXML per accedere ai dati (DOM/E4X)

• JSON

Page 33: Antica presentazione AJAX

© 2006 Quinary SpA

Il “core” Ajax

Page 34: Antica presentazione AJAX

© 2006 Quinary SpA

• Il Document Object Model è una interfaccia platform-independent e language-independent per consentire ai programmi di accedere e modificare contenuti, struttura, stili di documenti XML

• DOM fornisce un insieme di oggetti standard per rappresentare documenti HTML ed XML, ed un modello con cui questi oggetti possono essere acceduti e combinati tra loro

• Per Javascript DOM binding si intende l’effettiva implementazione dell’interfaccia DOM nell’engine Javascript implementato nei browsers

• Si tratta di una standardizzazione del DHTML

Page 35: Antica presentazione AJAX

© 2006 Quinary SpA

• DOM Level 1 (Core): definisce le funzionalità di base per la navigazione e l’alterazione della struttura e del contenuto di documenti XML ed HTML

• DOM Level 2: definisce l’object model per gli stylesheets e funzionalità per manipolare le informazioni di stile legate ad un documento. Definisce inoltre un event model e fornisce supporto per namespaces XML

• DOM Level 3 (draft): definisce le interfacce per load-save, validazione, formattazione del contenuto, estensione dell’event model con la definizione di event groups.

• I browsers di ultima generazione sono compatibili con il DOM Level 2

Page 36: Antica presentazione AJAX

© 2006 Quinary SpA

• Definisce un generico sistema di eventi che consente la registrazione di event handlers, descrive il flusso di eventi secondo una struttura gerarchica, fornisce informazioni contestuali rispetto a ciascun evento

• Definisce un sottoinsieme comune tra i vari event systems indipendenti introdotti nei browsers della generazione DOM Level 0, al fine di garantire la massima compatibilità degli scripts

Page 37: Antica presentazione AJAX

© 2006 Quinary SpA

• UI Events: eventi relativi alla user interface. Sono generati in seguito all’interazione per mezzo di un dispositivo esterno (tastiera, mouse…)

• UI Logical Events: sono eventi di alto livello, indipendenti dal dispositivo, ad esempio cambio del focus, modifica di una selezione ecc.

• Mutation Events: causati da una qualsiasi azione che cambia la struttura del documento

• Capturing: processo per mezzo del quale un evento viene gestito da uno degli ancestors prima che venga gestito dal target effettivo

• Bubbling: processo per mezzo del quale un evento viene propagato agli ancestors dopo essere stato gestito dal target

• Cancelable: indica la possibilità di cancellare le azioni di default in seguito all’handling dell’evento stesso

Page 38: Antica presentazione AJAX

© 2006 Quinary SpA

• Netscape ed Explorer avevano una gestione opposta del meccanismo di cattura degli eventi (IE intercettava nella fase di “bubble”, Netscape in “capture”)

• Il flusso DOM definisce un meccanismo generico di propagazione degli eventi attraverso la gerarchia dei containers della GUI

• Un evento può essere intercettato da qualunque componente coinvolto sia nella fase di “capture”, sia nella fase di “bubble”

Page 39: Antica presentazione AJAX

© 2006 Quinary SpA

I principali problemi delle applicazioni Ajax

Page 40: Antica presentazione AJAX

© 2006 Quinary SpA

• Circa il 10% degli utenti della rete ha il browser con Javascript disabilitato

http://www.w3schools.com/browsers/browsers_stats.asp

Page 41: Antica presentazione AJAX

© 2006 Quinary SpA

Unload accidentale poco controllabile

• Un click sbagliato sul bottone di chiusura del browser, di reload della pagina, dei bottoni di navigazione provoca l’unload della pagina e la perdita del contesto

• L’evento di unload non è cancellabile.• Su alcuni browser l’evento può essere intercettato ed è possibile chiedere

conferma per il salvataggio dei dati (ma non per l’annullamento della chiusura della pagina)

• Opera non consente di intercettare l’evento di unload sulla chiusura della finestra o sui tasti Back/Forward.

• IE e Mozilla supportano l’evento onbeforeunload e la relativa visualizzazione di un dialog box OK/Cancel per confermare la chiusura della pagina. Questo comportamento tuttavia non è definito in alcuno standard

Page 42: Antica presentazione AJAX

© 2006 Quinary SpA

Bottoni Back/Forward

• I bottoni Back/Forward possono perdere significato in una applicazione Ajax, dove si hanno stati di una singola GUI in luogo di diversi documenti

• Alcuni frameworks e librerie consentono di gestire un mapping con funzionalità simili ad Undo/Redo, es. DOJO, BackBase, RSH (Really Simple History)

• Non esiste tuttavia soluzione generale al problema, la gestione dei tasti B/F deve essere progettata di volta in volta

• Non è un problema esclusivamente Ajax, e non sempre è necessariamente un problema critico. Anche nei siti “normali” capita abbastanza spesso di avere comportamenti non prevedibili facendo Back…

Page 43: Antica presentazione AJAX

© 2006 Quinary SpA

Bookmarking

• La funzionalità di bookmarking della URL può dare risultati non predicibili, a meno di non essere in grado di associare URL diverse a stati diversi e, successivamente, ricostruire lo stato completo a partire dalla URL

• Anche in questo caso non è un problema esclusivamente Ajax• DOJO, RSH (Real Simple History) ed altre librerie forniscono API per

associare informazioni di stato ad URL diverse usando la hash-part della URL

• Per il salvataggio dello stato si possono usare anche meccanismi di local storage (descritti in seguito)

• In ogni caso la gestione del bookmarking è onerosa e delicata sia a livello di progettazione sia a livello di sviluppo

Page 44: Antica presentazione AJAX

© 2006 Quinary SpA

Alcuni scenari di utilizzo di Ajax

Page 45: Antica presentazione AJAX

© 2006 Quinary SpA

• Ajax consente l’integrazione ed aggregazione di servizi direttamente a livello del client, demandando parte del meccanismo di integrazione al browser.

• Può essere utile per alleggerire in parte l’erogazione di servizi da parte del server.

• Ciascun servizio aggregato lato client mantiene le proprie logiche di aggiornamento senza impattare il resto della pagina

• Possibili applicazioni: client side portlets e personalizzazione, aggregatori RSS, dashboards, integrazione di contenuti locali con servizi esterni (mappe, traduzioni, motori di ricerca)

Page 46: Antica presentazione AJAX

© 2006 Quinary SpA

• Integrazione client side tra Google Maps ed un servizio di geocodifica degli indirizzi italiani: esempio.

Browser

Server

GeocodificaMappe

Server

Browser

GeocodificaMappe

Web application “classica” Versione Ajax

Page 47: Antica presentazione AJAX

© 2006 Quinary SpA

Nuove forme di erogazione di pubblicità

• E’ un caso particolare dell’integrazione di servizi client side, dove uno dei servizi è un AD server.

• L’erogazione di pubblicità può essere virtualmente innescata da una qualsiasi azione che l’utente effettua sulla GUI

• Links e contenuti pubblicitari possono essere visualizzati in seguito a:• mouse over su qualsiasi nodo del DOM• selezione o click su una parte di contenuto• contenuti parziali inseriti in forms• movimento del mouse all’interno di una mappa• ecc …

Page 48: Antica presentazione AJAX

© 2006 Quinary SpA

GUI per data entry

• Applicazioni che richiedono data entry complesso ed estremamente strutturato (es. ERP) possono beneficiare di GUI Ajax

• I dati inseriti possono essere validati (server-side!) con il livello di granularità più adatto alle varie situazioni senza fare submit completo delle forms

• Le UI possono essere rese “keyboard-driven”• Esistono frameworks (es. BackBase) che includono widgets (tabelle,

liste, tree views, ecc.) con funzionalità sofisticate e ne facilitano il binding con i dati server side

Page 49: Antica presentazione AJAX

© 2006 Quinary SpA

Feedbacks sulla user experience

• E’ possibile raccogliere ed inviare al server ogni tipo di informazione su come gli utenti utilizzano l’applicazione

• Si possono raccogliere statistiche su quali elementi della pagina gli utenti si soffermano maggiormente (es. tempi di permanenza del mouse su particolari regioni del contenuto, clicks, selezioni di parole o frasi, ecc)

• Si possono raccogliere informazioni su particolari configurazioni dei browsers (script, banner, popup blocking…) ed intraprendere azioni ad hoc

• Si possono misurare accuratamente i tempi di permanenza su ciascuna pagina e di download dei contenuti

Page 50: Antica presentazione AJAX

© 2006 Quinary SpA

Coffee Break

Page 51: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Patterns

Page 52: Antica presentazione AJAX

© 2006 Quinary SpA

• Lo sviluppo Ajax ripropone una serie di problemi ben noti a livello di architettura, sviluppo, gestione delle risorse in un contesto tecnologico sostanzialmente nuovo

• L’obiettivo è quello di fornire linee guida per la soluzione di problemi ricorrenti in un determinato contesto tecnologico

• Il sito http://ajaxpatterns.org raccoglie una collezione molto estesa di patterns Ajax

• Qui viene analizzata solo una piccola selezione di patterns particolarmente significativi.

Page 53: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Patterns – On-demand Javascript

• DOM-Basedvar head = document.getElementsByTagName("head")[0]; script = document.createElement('script'); script.id = 'uploadScript'; script.type = 'text/javascript'; script.src = "upload.js"; head.appendChild(script)

• XMLHttpRequest-Based

script = xmlHttpRequestDownload('script.js'); eval(script)

Page 54: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Patterns – Tasks scheduling

// one time action function expireTimer() { alert(“Timeout expired!”); } expiryTimer = setTimeout(expireTimer, 5000);

// repeated actions function repeatedAction() { alert(“Interval expired!”); } expiryInterval = setInterval(repeatedAction, 5000);

• Esempio: salvare periodicamente versioni drafts dei contenuti in modo da limitare i danni in caso di unload accidentale (es. autosave drafts GMail e Writely)

Page 55: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Patterns – Browser side XSLT

• Ci sono frameworks open-source e cross browser per fare questo lavoro

• Google AjaXSLT (http://goog-ajaxslt.sourceforge.net/)• Sarissa (http://sarissa.sourceforge.net/)

// Sarissa var xsltProc = new XSLTProcessor(); xsltProc.importStylesheet(xsltDoc); var htmlDoc = xsltProc.transformToDocument(xml); var htmlString = Sarissa.serialize(htmlDoc); document.getElementById(“aNode”).innerHTML = htmlString;

Page 56: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Patterns – Ottimizzazione performance

• Client-side caching• Guesstimate: invece che accedere a dati in tempo reale fare stime significative

(es. GMail storage counter)• Submission buffering: mantenere i dati temporanei in un buffer ed inviarli al

server ad intervalli di tempo stabiliti (es. Google Suggest)• Multistage download: suddividere i contenuti da downloadare in più parti

indipendenti in modo da poter visualizzare immediatamente i primi dati che arrivano (es. Google Maps).

• Predictive Fetch: anticipare possibili azioni dell’utente ed interagire col server in anticipo per recuperare i dati necessari (es. Google Maps).

Page 57: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Patterns – Cross domain proxy

Browser

Application Server

External Service

/remote/service1/?id=1 /getData.jsp?id=1

/getData.jsp?id=1

Page 58: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Patterns: Richer Plugin

• Applet Java• Flash (esempio: Flickr Organizer)• Accesso a files locali, storage locale• Multimedia e grafica• Accesso a risorse hardware (stampante, joystick)• Interazioni con OS

Page 59: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Patterns: Local Storage

• Cookies: sono la tecnica teoricamente più standard ma è una soluzione altamente inefficiente e limitata (massimo 4K di dati per cookie)

• IE5 supporta una API per fare storage locale dello stato. La soluzione è proprietaria e ha limiti di dimensione (64K)

• AMASS (Ajax Massive Storage System): è un sistema implementato in Flash. Sotto i 100K non necessita autorizzazione di security. Funziona serializzando oggetti Javascript (ma non oggetti nativi)

• Embedded SQL DB: alla ApacheCon 2005 è stato presentato un prototipo che utilizza Derby (erede di Cloudscape, ora parte del progetto Apache) come DB embedded in una applet Java salvare dati localmente in una applicazione Ajax

Page 60: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Toolkits e Frameworks

Page 61: Antica presentazione AJAX

© 2006 Quinary SpA

XMLHttpRequest IFrame Applet …

Remoting Toolkit – Client Side DWR, JSON-RPC, dojo.bind, BackBase…

GUI Toolkit Dojo, BackBase, Scriptaculous, SmartClient…

Java

scrip

t D

OM

bin

ding

Remoting Toolkit – Server Side

Java PHP ASP Ruby …

Trasporto HTTP(S)

Page 62: Antica presentazione AJAX

© 2006 Quinary SpA

• API di alto livello e cross-browser per la gestione dei componenti standard della GUI HTML e dei relativi stili ed effetti visuali

• Includono emulazioni dei controlli tipici delle applicazioni desktop (tabbed panes, sliders, spinners, finestre MDI, etc.)

• Offrono implementazioni del Drag&Drop• Forniscono librerie di widgets con comportamenti complessi (image

slideshows, rich text editors, etc.)• Possono consentire lo sviluppo di widgets customizzati estendendo le

librerie di widgets standard• Possono definire una diversa interfaccia sull’event system

Page 63: Antica presentazione AJAX

© 2006 Quinary SpA

• Libreria di effetti visuali e widgets (liste ordinabili, sliders) basata su Prototype

• Fornisce una implementazione di Drag&Drop• Semplice anche per generare effetti ed animazioni complesse• E’ attivamente supportata e sviluppata• http://script.aculo.us/

Prototype• Libreria Javascript general-purpose che fornisce anche una astrazione Ajax

cross browser• E’ building block usato da diverse librerie GUI• http://prototype.conio.net/

Page 64: Antica presentazione AJAX

© 2006 Quinary SpA

<head> <script src="/javascripts/prototype.js" type="text/javascript“/> <script src="/javascripts/scriptaculous.js" type="text/javascript“/>

<script type="text/javascript" language="javascript"> // <![CDATA[ new Effect.Appear('element_id'); // ]]> </script> </head>

<html> . . .

<div onclick="new Effect.SwitchOff(this)"> Click here if you've seen enough. </div>

</html>

• Esempi di effetti

Page 65: Antica presentazione AJAX

© 2006 Quinary SpA

• Potente sistema di packages, consente di downloadare lato client on demand solo le librerie necessarie

• Widgets predefiniti customizzabili ed estendibili (es. RichTextEditor, Image Slideshow)

• Event system generico, potente e “non intrusivo” nell’HTML• Widget prototyping consente di definire componenti GUI

riutilizzabili a partire dagli widgets standard• Compressione del codice per minimizzare il tempo di download• Open Source• http://dojotoolkit.org/

Page 66: Antica presentazione AJAX

© 2006 Quinary SpA

<head> <script src=“dojo.js" type="text/javascript“/> <script language="JavaScript" type="text/javascript"> dojo.require("dojo.widget.Editor"); </script>

</head>

<html>

<!-- Creazione editor DOJO --> <div class=“dojo-Editor”> <h1>Section title</h1> <ul> <li>item1</i> <li>item2</i> <ul> </div>

</html>

• Esempi

Page 67: Antica presentazione AJAX

© 2006 Quinary SpA

• BackBase definisce un livello di astrazione sopra l’XHTML.• Le GUI sono definite in modo dichiarativo in BXML (BackBase XML)• Lato client il BackBase Presentation Content interpreta il BXML e genera la

GUI in XHTML• Include una libreria di controlli estesa e di alta qualità grafica• Fornisce componenti server-side (remotizzazione)• Molto potente ma anche esigente in termini di risorse ed in termini di

compatibilità browsers• E’ un prodotto commerciale con licenza basata su numero di CPU server• Esiste una edizione community gratuita• Esempi• http://www.backbase.com/

Page 68: Antica presentazione AJAX

© 2006 Quinary SpA

XMLHttpRequest IFrame Applet …

Remoting Toolkit – Client Side DWR, JSON-RPC, dojo bind, BackBase…

GUI Toolkit Dojo, BackBase, Scriptaculous, SmartClient…

Java

scrip

t D

OM

bin

ding

Remoting Toolkit – Server Side

Java PHP ASP Ruby …

Trasporto HTTP(S)

Page 69: Antica presentazione AJAX

© 2006 Quinary SpA

Remoting Toolkits

• Forniscono API di alto livello e cross-browser per invocare chiamate remote via Javascript

• Nascondono l’implementazione di basso livello (XMLHttpRequest, IFrame ecc…)

• Possono fornire servizi di marshalling/unmarshalling tra dati e strutture sia lato browser sia lato server, con conseguente gestione del mapping tra data types client e server

• Possono fornire servizi di proxying e remote method invocation• Implementano meccanismi di ottimizzazione (caching, queueing, batch

processing)

Page 70: Antica presentazione AJAX

© 2006 Quinary SpA

DWR (Direct Web Remoting)

• Consente di creare in modo trasparente proxy Javascript di oggetti server side (Java)

• Comprende sia una libreria client che una libreria server• Richiede che la parte server sia Java. La componente server è una Servet• Il mapping tra oggetti client ed oggetti server è definito in modo dichiarativo

in un descrittore XML (dwr.xml)• Ogni chiamata ad un metodo sul proxy invoca una corrispondente chiamata

remota.• Implementa un meccanismo di chiamata multipla in batch per ottimizzare

l’utilizzo delle risorse• Consente di gestire lo scoping degli oggetti lato server (pagina, sessione)• Include un utile strumento per il debug• http://getahead.ltd.uk/dwr/

Page 71: Antica presentazione AJAX

© 2006 Quinary SpA

• JSON (Javascript Object Notation) è un formato per lo scambio di dati, alternativo all’XML e molto più leggero da processare da parte dei comuni linguaggi di programmazione

• Non richiede parsing Javascript ad hoc (JSON è un sottoinsieme dell’ECMA 262)

[{ “name”: “Dion Almaer”, “age” : 12, “pets”: [“sandy”, “fluffy”] }, { “name”: “Ben Galbraith”, “age” : 11, }]

Page 72: Antica presentazione AJAX

© 2006 Quinary SpA

• JSON-RPC definisce una specifica di interazione equivalente ad XML-RPC• Utilizza JSON come trasporto

• Esistono implementazioni nei principali linguaggi. (per Java esiste JSON-RPC-Java)

POST /JSON-RPC HTTP/1.1 User-Agent: Mozilla/4.0 Content-Type: text/plain Content-length: 59 { “method”: “examples.getStateName”, “params”: [ 41 ] }

Page 73: Antica presentazione AJAX

© 2006 Quinary SpA

• Marshalling/unmarshalling di:• Tipi primitivi (int, long, short, byte, boolean, char, float, double)• Numbers (Float, Integer, etc...), Strings, Char and Byte arrays• Java Beans (in generale ogni Object con getters e setters)• Arrays di tipi primitivi, Strings, Numbers, Collections and Java Beans• Exceptions (ma non viene conservato il tipo di eccezione)• Collezioni concrete ed astratte:

• List, ArrayList, LinkedList, Vector• Map, HashMap, TreeMap, LinkedHashMap• Set, HashSet, TreeSet, LinkedHashSet• Dictionary, Hashtable

• Combinazioni arbitrarie di questi tipi

Page 74: Antica presentazione AJAX

© 2006 Quinary SpA

• E’ un sottoinsieme del framework DOJO• E’ una generica API asincrona per effettuare chiamate remote

che incapsula diversi layers di trasporto (IFrames, XMLHttpRequest,..)

• L’API accetta un singolo oggetto Javascript che descrive la configurazione della chiamata (URL, headers, funzioni di callback, condizioni di errore)

• Funzionalità per intercettare il click del bottone Back/Forward ed invocare azioni ad-hoc

• http://dojotoolkit.org/

Page 75: Antica presentazione AJAX

© 2006 Quinary SpA

dojo.io.bind, un esempio

var sampleFormNode = document.getElementById("formToSubmit");

dojo.io.bind({ formNode: sampleFormNode url: "http://foo.bar.com/processForm.cgi", load: function(type, evaldObj){ // hide the form when we hear back that it submitted // successfully sampleFormNode.style.display = "none"; }, backButton: function(){ // ...and then when the user hits // "back", re-show the form sampleFormNode.style.display = ""; }, forwardButton: function(){ // and if they hit "forward" before making //another request, this happens: sampleFormNode.style.display = "none";}, } );

• Esempio di submit di una form (sampleFormNode) e meccanismo di gestione dei bottoni Back/Forward

Page 76: Antica presentazione AJAX

© 2006 Quinary SpA

Ajax Security

Page 77: Antica presentazione AJAX

© 2006 Quinary SpA

• Il codice Javascript è eseguito all’interno di una sandbox che impedisce l’apertura di connessioni verso hosts diversi da quello di origine (analoga alla policy della sandbox delle JVM nei browsers)

• IFrames possono essere istruiti programmaticamente in Javascript per caricare dati da hosts diversi, ma la sandbox impedisce che contenuti di IFrames di hosts diversi possano essere acceduti/alterati via Javascript

Private network Browser Public

internet

XMLHttpRequest.open(“GET”, “http://192.168.0.1”)

Page 78: Antica presentazione AJAX

© 2006 Quinary SpA

URL Notehttp://www.mysite.com/script1.jshttp://www.mysite.com/script2.js

OK

http://www.mysite.com:8080/script1.jshttp://www.mysite.com/script2.js

KO Il numero di porta non coincide

https://www.mysite.com/script1.jshttp://www.mysite.com/script2.js

KO Protocollo differente

http://www.mysite.com/script1.jshttp://192.168.0.1/script2.js

KO Anche se gli IP coincidono…

http://www1.mysite.com/script1.jshttp://www2.mysite.com/script2.js

dipende…

OK se entrambi gli script troncano il dominio:

document.domain=“mysite.com”;

Page 79: Antica presentazione AJAX

© 2006 Quinary SpA

• Proxy locale del servizio remoto (discusso nei patterns)

oppure:

• Interazione con il security manager del browser• Internet Explorer: chiede conferma durante la prima connessione verso la

risorsa remota. Le successive connessioni sono effettuate senza conferma• Mozilla: è necessario scrivere codice che interagisca con l’oggetto

netscape.security.PrivilegeManager, che tuttavia per default non è esposto al Javascript (occorre impostare a true il valore della variabile di configurazione signed.applets.codebase_principal_support)

Oppure ancora:

• Codice client signed, che tuttavia è un’opzione disponibile solo per i browsers Mozilla

Page 80: Antica presentazione AJAX

© 2006 Quinary SpA

• Non esiste attualmente alcuna API standardizzata per interfacciare il security model del browser

• I principali browsers hanno comportamenti estremamente diversi quando si tratta di accedere a risorse esterne alla sandbox

• La soluzione migliore al momento appare quella del proxying locale

• Nota: usando le funzionalità di proxying di Apache è possibile mappare URL locali su servizi remoti in modo molto semplice

ProxyPass /remote/ http://remoteserver.com/

Page 81: Antica presentazione AJAX

© 2006 Quinary SpA

• Ajax supporta HTTPS (XMLHttpRequest ed IFrames supportano url “https://”)

…ma c’è un problema…

• La sandbox del browser non consente cross-content e cross-scripting tra risorse HTTP ed HTTPS

• Quindi anche se HTTPS è richiesto solo per poche transazioni, molte risorse devono essere scaricate con lo stesso protocollo

• HTTPS richiede encription “on the fly” ed è oneroso in termini di risorse, dovrebbe essere usato solo ove strettamente necessario

• Esempio: pagina di login di GMail.

Page 82: Antica presentazione AJAX

© 2006 Quinary SpA

• Può essere una alternativa all’HTTPS in situazioni quali la autenticazione tramite password

• Esistono librerie Javascript che implementano generatori MD5 (JavaScript MD5)

1. Client: Richiesta al server di una chiave pubblica random2. Client: Concatenazione password+chiave pubblica3. Client: calcolo MD54. Client: submit5. Server: Concatenazione password memorizzata+chiave pubblica6. Server: calcolo MD57. Server: verifica che i digests coincidano

• Questa soluzione ha comunque il problema che la password deve essere memorizzata in chiaro lato server, quindi deve essere passata in chiaro o in HTTPS in fase di registrazione

Page 83: Antica presentazione AJAX

© 2006 Quinary SpA

Strumenti di sviluppo

Page 85: Antica presentazione AJAX

© 2006 Quinary SpA

• Mozilla Firefox è uno strumento insostituibile per lo sviluppo di applicazioni Ajax• Esistono numerose estensioni di Firefox realizzate per il supportare lo sviluppo

ed il troubleshooting• WebDeveloper: validazioni HTML, CSS, Javascript, informazioni su headers e

cookies, ogni tipo di hacking sulla struttura del documento.• DOM Inspector: visualizzazione struttura del DOM e ricerche XPath• Selenium Recorder: consente di registrare azioni sulla GUI e di salvarle in

uno script Selenium per il successivo utilizzo in una suite di tests automatici• ExecuteJs: console per l’esecuzione di codice Javascript nel contesto della

pagina visualizzata• Venkman: Javascript debugger

Page 86: Antica presentazione AJAX

© 2006 Quinary SpA

Evoluzioni della tecnologia Ajax

Page 87: Antica presentazione AJAX

© 2006 Quinary SpA

ECMAScript for XML (E4X)

• Estensione del linguaggio per supportare nativamente l’XML• Notevole semplificazione rispetto all’API DOM• Implementato su Firefox 1.5

var order=<order> <customer> <firstname>John</firstname> <lastname>Doe</lastname> </customer> <item> . . . </item> </order>

var x = 3;

var fullname = order.customer firstname + ‘ ‘ + order.customer.lastname;

Var total = order.item.price * order.item.quantity;

Creazione DOM: Attraversamento DOM tree:

Page 88: Antica presentazione AJAX

© 2006 Quinary SpA

• Opera Platform: è un application framework per lo sviluppo di applicazioni per dispositivi mobili basata sul Opera Browser

• Opera Application Player: versione estesa del browser Opera mobile che supporta Ajax ed abilita le applicazioni Web ad utilizzare funzioni native dei telefoni (es. messaging, calendar, livelli batteria e segnale, fotocamera ecc…).

• Application Framework: fornisce utilities ed elementi GUI predefiniti per facilitare lo sviluppo di applicazioni

Page 89: Antica presentazione AJAX

© 2006 Quinary SpA

Cosa offre Quinary, oggi.

AJAXSCOPEAJAX enrichment program: “ripulisci” il tuo sito con Ajax.

• analisi del vostro sito e identificazione di una sezione o di un servizio migliorabile con Ajax

• valutazione sulle opportunità di miglioramento ottenibili con Ajax• supporto tecnologico (scouting e design architetturale)• deliverable

• proof of concept di applicazione di Ajax alla sezione o al servizio identificato• piano di intervento per la migrazione ad Ajax

• costo: 5.000 €• durata: 2/3 settimane

Page 90: Antica presentazione AJAX

© 2006 Quinary SpA

Contacts

Milan Office - Via Pietrasanta 14(20141) Milano – Italia

Telefono: + 39 (02) 3090 1500

Rome Office – Via Ercolano Salvi 18(00143) Roma – Italia

Telefono: + 39 (06) 4340 11

[email protected]

Informativa Privacy ai sensi del D.Lgs. 196/03. Quinary SpA, quale Titolare del trattamento dei dati personali, la informa che i suoi dati verranno trattati nel pieno rispetto del D.Lgs. 196/03. Il testo completo dell’Informativa ed i riferimenti ai Responsabili sono visionabili alla sezione Privacy del website: www.quinary.com.

Page 91: Antica presentazione AJAX

© 2006 Quinary SpA

Approfondimenti

Page 92: Antica presentazione AJAX

© 2006 Quinary SpA

• Un Object Constructor è una normale funzione Javascript • Istanze sono create per mezzo dell’operatore new.• Proprietà assegnate a this sono pubbliche• Variabili di chiarate con var sono private

function Cat(name){ var priv = “I am a private variable”; this.name = name; this.talk = function(){ alert(this.name + " say meeow!"); } }

cat1 = new Cat("felix"); cat1.talk(); //alerts "felix says meeow!“

cat2 = new Cat("ginger"); cat2.talk() //alerts "ginger says meeow!"

Page 93: Antica presentazione AJAX

© 2006 Quinary SpA

• In genere i metodi si definiscono via prototyping e non tramite inner function• L’inner function viene duplicata su ogni nuova istanza quindi occupa memoria

function Cat(name){ this.name = name; this.talk = function(){ alert(this.name + " say meeow!"); } }

Cat.prototype.changeName = function(name){ this.name = name; }

firstCat = new Cat(“Felix"); firstCat.changeName("Bill"); firstCat.talk() //alerts "Bill says meeow!"

Page 94: Antica presentazione AJAX

© 2006 Quinary SpA

• E’ possibile usare il prototyping per estendere ed arricchire gli oggetti predefiniti (solo quelli istanziabili via new).

• Esempio: alcuni browsers non supportano shift() ed unshift() per gli arrays….

if(!Array.prototype.shift){ Array.prototype.shift = function(){ firstElement = this[0]; this.reverse(); this.length = Math.max(this.length-1,0); this.reverse(); return firstElement; } }

if(!Array.prototype.unshift){ ... }

Page 95: Antica presentazione AJAX

© 2006 Quinary SpA

• Javascript supporta ereditarietà per mezzo del prototyping diversamente dall’usuale ereditarietà basata sul concetto di classe

function Base(){ this.override = function(){alert(“Base::override”);} this.baseFunction = function(){“Base::baseFunction”} }

function Derive(){ this.override = function(){alert(“Derive::override”)}; }

Derive.prototype = new Base();

d.override(); // Alerts “Base::baseFunction” d.baseFunction(); // Alerts “Derive::override”

Page 96: Antica presentazione AJAX

© 2006 Quinary SpA

• In Javascript ciascun oggetto è rappresentabile come un array associativo• Gli operatori typeof ed instanceof consentono di determinare a runtime il tipo di un

oggetto

function Cat(name){ this.name = name; this.talk = function(){ alert(this.name + " say meeow!"); } }

theCat = new Cat(“miao"); alert(theCat[‘name’]); // miao alert(typeof theCat[‘talk’]); // function alert(theCat instanceof Cat); // true