Consiglio Nazionale delle Ricerche - PUMA
Transcript
Consiglio Nazionale delle Ricerche - PUMA
C Consiglio Nazionale delle Ricerche Web Forms Oltre l’HTML M. Tesconi, A. Marchetti, F. Ronzano, S. Minutoli IIT TR-09/2005 Technical report Aprile 2005 Iit Istituto di Informatica e Telematica WEB FORMS OLTRE L’HTML Maurizio Tesconi, Andrea Marchetti, Francesco Ronzano, Salvatore Minutoli Istituto di Informatica e Telematica, Area della Ricerca CNR via G. Moruzzi 1, 56124 PISA, Italy {Maurizio.Tesconi,Andrea.Marchetti,Salvatore.Minutoli}@iit.cnr.it – [email protected] INDICE Introduzione .......................................................................................................................................3 Verso le form HTML .........................................................................................................................4 Le form HTML...................................................................................................................................4 Lo scripting lato server per la gestione delle web form ...................................................................11 I linguaggi di scripting lato client e il loro impiego nella gestione delle web form.........................15 XForms e la standardizzazione e diffusione dell’XML ...................................................................21 Esempio di uso di XForms ...........................................................................................................27 Web Forms 2.0: la proposta di standard del Web Application Technology Working Group..........30 Le web form: soluzioni proprietarie.................................................................................................42 Microsoft ......................................................................................................................................42 Le pagine Web Form e la tecnologia ASP.NET ......................................................................42 Info Path ...................................................................................................................................44 Adobe ...........................................................................................................................................44 Adobe Form Designer 6.0 ........................................................................................................44 Macromedia..................................................................................................................................45 Macromedia Flash MX: le Form..............................................................................................45 Apache Cocoon e il framework Cocoon Forms ...............................................................................47 Apache Cocoon ............................................................................................................................47 Cocoon: il control flow ................................................................................................................50 Il framework Cocoon Forms ........................................................................................................53 Cocoon Forms: definizione delle form.....................................................................................54 Cocoon Forms: binding di un documento XML ......................................................................56 Cocoon Forms: flowscript e pipeline per la gestione delle form .............................................56 Esempio di uso di Cocoon Forms ............................................................................................60 Linguaggi XML per la definizione dell’interfaccia utente delle applicazioni .................................67 Mozilla: EXtensible User-interface Language.............................................................................71 Esempio di organizzazione di un file XUL..............................................................................75 Microsoft: EXtensible Application Markup Language................................................................79 Esempio di organizzazione di un file XAML. .........................................................................84 XUL versus XAML: l’evoluzione delle interfacce utente delle applicazioni web ......................86 Conclusioni.......................................................................................................................................89 Bibliografia.......................................................................................................................................91 Introduzione Negli ultimi anni si è avuta una forte diffusione e un sempre più largo uso del web per effettuare operazioni spesso molto differenti tra di loro, dalla ricerca di informazioni all’interno di Internet, al commercio elettronico o anche a servizi bancari e multimediali. Per compiere tali operazioni e quindi per far sì che le potenzialità del web aumentino notevolmente è necessario, non solo poter spedire le informazioni richieste dall’utente attraverso la rete, ma anche poter ricevere i dati di vario tipo immessi dall’utente stesso. A tal fine vengono utilizzate le web form: con tale termine si indicano in generale tutti i differenti tipi di tecnologie adoperate per permettere agli utenti del web di inserire, e trasmettere ad un server, le informazioni necessarie per la richiesta di un servizio. In questo studio si intende analizzare rapidamente l’evoluzione delle tecnologie finora adoperate per trattare le form nel web, per poi esaminare in maggiore dettaglio le soluzioni più recentemente proposte riguardanti l’acquisizione e la gestione dell’input degli utenti su web. Nei capitoli iniziali si individuano i motivi che hanno portato, agli inizi degli anni ’90, all’introduzione delle form nell’HTML[6], linguaggio già allora universalmente utilizzato per pubblicare e scambiare informazioni nel Web e prosegue con una breve trattazione delle caratteristiche fondamentali delle stesse form. Vengono poi affrontati gli sviluppi delle tecnologie di gestione dei moduli elettronici fino agli inizi del nostro decennio: sono quindi considerati sia l’uso dello scripting lato server che l’introduzione dei linguaggi di scripting lato client in riferimento alle form. Nei capitoli successivi si considerano quindi in maggiore dettaglio le soluzioni attualmente adoperate per richiedere e ricevere adeguatamente i dati inviati dagli utenti nell’ambito dei servizi e delle applicazioni web. Questo viene fatto descrivendo e valutando le caratteristiche di tali tecnologie con l’obiettivo di poterle paragonare tra di loro. In alcuni casi verranno forniti dei semplici esempi pratici. In tale contesto, vengono descritte le nuove proposte di tecnologie open standard per la gestione dell’input degli utenti del web, tra cui XForms[10] del World Wide Web Consortium[5] e il progetto Web Forms 2.0[20] del Web Hypertext Application Technology Working Group[19]. Viene quindi presentato il framework Cocoon Forms[25], per la gestione delle form delle applicazioni web sviluppate appoggiandosi alla servlet Cocoon[22], una potente piattaforma di gestione di servizi web basata fortemente sull’XML[11] e le tecnologie ad esso correlate, di cui viene fornita una breve descrizione. Sono quindi considerate le principali tecnologie proprietarie attualmente diffuse per la gestione delle form sul web. Infine vengono analizzati i nuovi linguaggi di definizione dell’interfaccia utente per applicazioni web (User Interface Definition Languages), utilizzati per definire l’interazione con l’utente stesso in quella che, con buone probabilità, sarà la nuova generazione di applicazioni di rete. Verso le form HTML Agli albori del web siti che non utilizzavano dati immessi dall’utente erano la norma e fornivano un flusso di informazioni spesso statiche, che si muovevano prevalentemente in un’unica direzione, da server a client, con poche possibilità di effettiva interazione e una maggiore difficoltà di consultazione e individuazione delle informazioni stesse. Agli inizi degli anni novanta, con l’esplosione del Web e con la diffusione dell’HTML[6] quale linguaggio universalmente utilizzato per pubblicare e scambiare informazioni nel Web stesso, si è manifestata l’esigenza di una maggiore interattività nell’uso di tale nuovo canale di comunicazione. Ciò si poteva ottenere dando la possibilità agli utenti di immettere e inviare informazioni. Per fronteggiare tale necessità, nel 1993 il World Wide Web Comsortium (W3C)[5] introdusse all’interno delle specifiche HTML 2.0[7], le web form. Attraverso questi nuovi elementi del linguaggio era possibile definire delle pagine web con cui reperire dati di vario tipo immessi dall’utente. Le successive versioni delle specifiche HTML hanno fondamentalmente mantenuto, con pochi cambiamenti, le modalità con cui venivano incluse nella pagine web le form fino ad arrivare alla versione 4.01 dell’HTML[8] che risulta essere l’ultima versione non XML–based. Le form HTML Le principali caratteristiche delle form HTML, facendo riferimento alle specifiche HTML 4.01 del World Wide Web Consortium, si possono descrivere come segue. Le form HTML sono dei moduli elettronici che è possibile includere nelle pagine web HTML; per mezzo di una form si può richiedere l’immissione di dati agli utenti del web. Tali informazioni sono raccolte localmente dal browser e, di solito, inviate attraverso la rete ad un server che le gestirà opportunamente. Le form si presentano come un insieme di vari elementi, detti controlli, ognuno dei quali serve per permettere all’utente di immettere determinate informazioni o di effettuare una particolare azione. Ogni controllo è identificato per mezzo di un nome specificato dall’attributo “name”; alla maggior parte dei controlli è possibile assegnare un valore iniziale per mezzo dell’attributo “value”. Per permettere una buona versatilità relativamente alle modalità di richiesta di immissione di informazioni agli utenti del web, nelle specifiche delle form HTML viene definito un cospicuo numero di controlli. Molti di questi controlli e vari loro attributi non erano presenti nelle prime versioni dell’HTML che includevano le form (2.0 e versioni immediatamente successive), sia perché tale estensione dell’HTML era appena stata introdotta in queste versioni e molti dei miglioramenti aggiunti nel seguito non erano ancora stati definiti, sia anche e soprattutto poiché non erano ancora stati introdotti i linguaggi di scripting lato client1 (JScript[41] e JavaScript[35]). Infatti con l’avvento della possibilità di definire degli script lato client, molte delle caratteristiche dei controlli delle form HTML sono state modificate per permettere la gestione della compilazione dei moduli elettronici e delle verifiche di validità dei dati immessi direttamente sul client servendosi di opportuni script; essi consistono in righe di codice interpretate a tempo di esecuzione e opportunamente strutturate per interagire con gli elementi della form, controllandone, localmente sul client, la compilazione. Tutti gli elementi che rappresentano dei pulsanti, così come il meccanismo degli eventi e la loro gestione, sono stati aggiunti nelle specifiche delle form HTML conseguentemente all’introduzione dello scripting lato client e del Document Object Model[14], per poterne sfruttare le potenzialità. I controlli definiti nelle specifiche delle form HTML 4.01 sono i seguenti: • BUTTON: permette l’inserimento nella form di un bottone che se attivato (ad esempio tramite un click del mouse), provoca una determinata azione. Esistono tre differenti tipi di bottoni: quelli “submit” che quando attivati inviano i dati contenuti nella form, i bottoni “reset” utilizzati per resettare i valori di tutti i controlli al loro stato iniziale ed i bottoni “push” adoperati per attivare delle determinate funzioni definite tramite degli script lato client. • INPUT: tale elemento permette di specificare numerose tipologie di controlli per mezzo del valore assegnato all’attributo “type”. Quest’ultimo può assumere i seguenti valori: ¾ text campo per l’immissione di testo su singola linea; 1 I linguaggi di scripting lato client e il loro uso in relazione alle web form sono descritti dettagliatamente nel capitolo “I linguaggi di scripting lato client e il loro impiego nella gestione delle web form”. ¾ password campo per l’immissione di password (uguale al precedente ma i caratteri digitati vengono visualizzati tutti con lo stesso simbolo, di solito un asterisco per preservarne la segretezza); ¾ checkbox casella di selezione (è possibile selezionarla e deselezionarla a piacimento); ¾ radio simili ai checkbox ma di solito riuniti in gruppi di due o più radio button che condividono lo stesso valore dell’attributo “name” e tra i quali è possibile selezionarne uno solo; ¾ submit crea un bottone per l’invio dei dati inseriti nella form; ¾ image determina un bottone sul quale verrà visualizzata un’immagine indicata dal valore dell’attributo “src” dell’elemento <input>; ¾ reset crea un bottone per resettare i valori di tutti i controlli della form al loro stato iniziale; ¾ button crea un bottone utile per attivare delle determinate funzioni definite tramite degli script lato client; ¾ hidden definisce un controllo della form che non sarà renderizzato dallo user agent; ¾ file permette all’utente di selezionare un file il cui contenuto sarà spedito in rete assieme alle altre informazioni raccolte tramite la form. • SELECT: tale controllo permette di creare dei menù per presentare all’utente differenti possibilità tra cui poter scegliere. Le varie scelte possibili (option) possono essere raggruppate logicamente per permettere una migliore renderizzazione del controllo allo user agent (optgroup). • TEXTAREA: tale controllo permette di definire una casella di testo su più linee, per raccogliere dei dati immessi dall’utente. E’ possibile indicarne le dimensioni relativamente al numero di righe e di colonne che devono essere visualizzate. Tutti i controlli presenti all’interno di una form, rappresentati ognuno da un particolare elemento, devono essere inseriti all’interno dell’elemento <form> , che funge da contenitore. Esso contiene gli attributi necessari a determinare le modalità di spedizione dei dati raccolti per mezzo della form. In particolare è possibile definire l’URI tramite il quale identificare il processo al quale inviare i dati collezionati (attributo “action”), il metodo del protocollo HTTP che deve essere usato per inviare i dati della form (attributo “method”), il tipo di codifica con la quale devono essere elaborati i dati raccolti (attributo “enctype”) ed il tipo di set di codifica dei caratteri da adoperare (attributo “accept-charset”). Nel caso in cui vengano inviati per mezzo della form dei file si può indicare (attributo “accept”) una lista di tipi MIME di file di cui è consentito l’upload. E possibile associare una etichetta ad ogni controllo della form per mezzo dell’elemento <label>, nel caso in cui non sia stata già definita direttamente all’interno del controllo stesso. Grazie all’etichetta viene fornito del testo che caratterizza la funzione del controllo nella form. I vari controlli della form possono essere raggruppati logicamente grazie all’elemento <fieldset>; in tal modo l’user agent potrà visualizzare in maniera omogenea (magari includendoli tutti in una determinata casella) i controlli di un particolare gruppo. L’elemento <legend> permette di specificare una intestazione da associare ad un certo gruppo di elementi. Vi è la possibilità di definire l’ordine di selezione progressiva, per mezzo del tasto di tabulazione, dei vari controlli della form, specificando per ogni elemento l’attributo “tabindex”, assegnandogli un numero intero compreso tra 0 e 32767. L’user agent selezionerà i controlli in base al valore crescente di tale numero specificato per ogni controllo. Per agevolare la selezione dei controlli della form è possibile determinare per ogni controllo un tasto di accesso rapido che permette di selezionare il controllo stesso se premuto contemporaneamente al tasto ALT (attributo “accesskey”). Relativamente agli elementi <input> e <textarea> è contemplata la possibilità di aggiungervi l’attributo “readonly” per impedirne la modifica da parte dell’utente, rendendoli di sola lettura. I vari controlli di una form possono essere disabilitati, escludendoli così dagli elementi attivi della form stessa, per mezzo dell’aggiunta dell’attributo “disabled”. Quando deve essere inviata una form vengono analizzati tutti i controlli che la compongono e definiti quelli “successful” ovvero validi per l’invio dei dati immessi al server. I controlli “successful” devono necessariamente essere posizionati all’interno dell’elemento <form> ed avere l’attributo “name” definito. Controlli disabilitati, checkbox, radio button e opzioni di un menù non selezionate costituiscono dei controlli non “successful”, della presenza dei quali non vi sarà traccia tra i dati inviati, raccolti per mezzo della form. I controlli nascosti (“hidden”) seppur non renderizzati dallo user agent risultano essere “successful”. Dopo aver identificato tutti i controlli “successful” di una form da inviare viene costruito e strutturato il form data set, ovvero l’insieme dei dati da inviare. Quest’ultimo consiste in una lista di coppie nome/valore relative ad ogni singolo controllo. Il form data set viene poi codificato secondo il metodo di codifica specificato del valore dell’attributo “enctype” dell’elemento <from>. Sono definiti i seguenti due metodi di codifica: 1. “application/x-www-formurlencoded”: nel form data set tutti gli spazi bianchi sono sostituiti dal carattere “+” ed i caratteri non alfanumerici dalla codifica ASCII esadecimale su due cifre preceduta dal carattere “%”. Ogni coppia nome/valore è separata da quelle adiacenti per mezzo del carattere “&” ed ogni nome è separato dal corrispondente valore dal carattere “=”. Questo metodo di codifica è utilizzato di default. 2. “multipart/form-data”: la precedente codifica è inefficiente per inviare grandi quantità di caratteri non ASCII o dati binari (upload di file). In tale nuovo metodo di codifica vengono create delle sezioni ognuna delle quali contiene i dati relativi ad un controllo “successful”. Ognuna di queste parti è preceduta da un header (intestazione) che ne determina, oltre al campo “content-disposition” che assume il valore “form-data”, il nome del controllo riferito e il tipo MIME dei dati contenuti. Con tale codifica è obbligatorio utilizzare il metodo POST del protocollo HTTP per inviare i dati della form. Dopo essere stati codificati, i dati vengono spediti al processo su server che ne gestisce la ricezione, riferito tramite l’URI specificato dall’attributo “action” dell’elemento <from>; l’attributo “method” di questo stesso elemento determina il metodo di invio dei dati della form; GET o POST sono i metodi del protocollo HTTP che possono essere adoperati. Il metodo GET è di solito usato, così come indicato anche nelle specifiche del protocollo HTTP, quando l’invio dei dati della form non comporta modifiche ai dati presenti sul server, ovvero nel caso in cui effettuare più volte di seguito la stessa operazione di spedizione delle informazioni raccolte tramite una form, equivale ad averla effettuata una sola volta; in tale situazione la form viene detta idempotente. Il metodo GET può ad esempio essere utilizzato se, per mezzo di una form, si vuole effettuare un’interrogazione remota ad un database; tale operazione infatti non comporta alcuna modifica alla base di dati e non genera alcun problema se viene ripetuta più volte di seguito. Il metodo POST al contrario viene adoperato quando i dati inseriti nella form causano delle modifiche sul sistema a cui vengono inviati i dati stessi; ad esempio viene usato il metodo POST se l’invio della form provoca la modifica di un database, la conferma di un acquisto on-line, l’iscrizione ad un determinato servizio di rete, etc. Le precedenti sono tutte operazioni che se ripetute più volte possono ottenere di volta in volta risultati diversi, o in alcuni casi ottenere una segnalazione di errore; in tal caso la form viene detta non idempotente. Nella seguente illustrazione viene mostrato come un browser web (nel caso particolare Microsoft Internet Explorer 6) renderizza una form contenente i principali controlli che possono essere adoperati nelle form HTML. Lo scripting lato server per la gestione delle web form (metodi di passaggio dei dati del protocollo HTTP) Agli inizi degli anni ’90, periodo nel quale il web era in forte crescita ed espansione e l’HTML, da poco standardizzato, rappresentava già il linguaggio base per lo scambio di informazioni in rete, gran parte delle pagine web disponibili erano statiche, ovvero contenevano informazioni memorizzate su server su determinati file di cui era possibile richiedere la trasmissione per consultarli da postazioni remote. L’aggiornamento delle informazioni contenute nelle pagine web avveniva normalmente rieditando il file sul quale era memorizzato il documento HTML stesso; ciò richiedeva molto tempo e impegno agli sviluppatori di contenuti ed applicazioni web. Oltretutto con le pagine web statiche non è possibile includere informazioni che variano con rapidità o che sono selezionate da una particolare richiesta dell’utente; si pensi al caso in cui tramite web si vogliano richiedere notizie sul numero di posti rimasti liberi su un treno, sulle quotazioni di alcuni titoli di borsa o più semplicemente sul numero di utenti che hanno visitato un determinato sito. Tali informazioni sono soggette a variazioni molto frequenti e sarebbe impossibile gestirle e divulgarle con delle pagine web statiche. Lo stesso problema si presenta se si vuole dare la possibilità all’utente web di effettuare delle ricerche su degli archivi (si pensi ad un motore di ricerca) o, più in generale, di richiedere delle informazioni in relazione a particolari condizioni di ricerca e selezione dei dati. Una eventuale risposta a richieste di questo genere varia a seconda dei parametri di ricerca specificati e sarebbe impossibile da organizzare col meccanismo delle pagine web statiche. Per rispondere a tali nuove esigenze del web, nella prima metà degli anni ’90, è stato introdotto l’uso delle pagine web dinamiche, che non risiedono fisicamente su un server, memorizzate su file, ma vengono generate dinamicamente ad ogni richiesta da parte di un client; in questa maniera tali pagine possono contenere informazioni aggiornate poiché reperite al momento della richiesta da parte del client, andando a consultare eventualmente database o altre fonti di dati opportunamente aggiornate per determinare il contenuto informativo del documento HTML che verrà spedito. E’ possibile generare le pagine web dinamiche sul server per mezzo di opportuni programmi detti script che possono essere definiti utilizzano un qualsiasi linguaggio di programmazione, come ad esempio Perl, il C, il C++ o anche Python, tutti linguaggi di programmazione general purpose. Ogni volta che un client richiede una pagina web dinamica, il server che riceve la richiesta ricerca e manda in esecuzione lo script preposto a generarla; la pagina generata, che consiste nell’output dell’esecuzione dello script, è raccolta in input dal server web stesso il quale la invia in risposta al client. Tramite uno script è quindi, ad esempio, possibile collegarsi con un database per reperire delle informazioni da includere nella pagina web generata, o anche accedere sul server a particolari risorse sempre col fine di reperire informazioni per definire in maniera dinamica i contenuti del documento HTML costruito. Con il passare del tempo le applicazioni rese disponibili via web sono divenute via via sempre più sofisticate rendendo necessaria la realizzazione di script sempre più complessi. I linguaggi di programmazione come C, C++ (compilati), Perl e Python (interpretati), seppur di alto livello, essendo di tipo general purpose, si sono rivelati spesso non adeguati allo sviluppo di questi script. Nel 1994 è stato ideato un nuovo linguaggio di scripting server-side che consente lo sviluppo sia di siti generati dinamicamente, sia di applicazioni che incorporano connessioni a database e data processing: il PHP[69] - Hypertext PreProcessor. Per definire la generazione dinamica di documenti per il web, il PHP permette di includere il proprio codice tra gli elementi del markup HTML consentendo di definire con più immediatezza e rapidità le operazioni da compiere e il layout per le pagine web generate. Tale linguaggio, a differenza di quelli di tipo general purpose precedentemente menzionati, è stato concepito appositamente per supportare lo sviluppo di siti ed applicazioni web dinamiche, infatti la sua struttura e le sue funzioni rispondono perfettamente alle esigenze ed alle necessità degli sviluppatori di questo settore. Il PHP è stato sviluppato quale software open source, è gestito da un cospicuo numero di sviluppatori che lo aggiornano costantemente, si interfaccia con i più diffusi database management system, opera totalmente con elaborazioni sul server ed è disponibile per varie piattaforme. Per questi motivi attualmente il PHP è uno dei linguaggi più usati per lo sviluppo di contenuti web dinamici ed applicazioni web elaborate. Anche la Microsoft ha sviluppato la tecnologia Active Server Pages (ASP)[44] per la creazione di pagine web dinamiche; questa soluzione è ovviamente proprietaria e disponibile solamente per piattaforme Microsoft. Le Active Server Pages, attualmente incluse nella piattaforma .NET della Microsoft, permettono di creare applicazioni web caratterizzate dalla gestione dinamica dei contenuti delle pagine, ottenuta utilizzando uno stile di programmazione dichiarativo affiancato dall’uso di linguaggi di scripting quali VBscript, JScript (simile a JavaScript), Python e altri. Numerose sono anche le classi di oggetti disponibili per script ASP. Tale soluzione resta però connessa all’ambiente Microsoft, alla piattaforma Windows server, quindi proprietaria. Il PHP è spesso preferito per la gestione di contenuti web dinamici sia poiché è open source, ma anche perché risulta molto potente ed efficiente nelle elaborazioni. La generazione di pagine web dinamiche può essere anche guidata da parametri particolari definiti dall’utente al momento della richiesta di determinate informazioni; ad esempio, si può voler dare la possibilità di effettuare particolari ricerche su un database agli utenti che accedono ad un certo sito web, permettendo loro di specificare le informazioni da ricercare e le modalità con cui la ricerca stessa deve aver luogo o con cui i risultati devono essere notificati. Tali informazioni di solito vengono reperite per mezzo delle web form, le quali permettono di ricevere i dati immessi da un utente e di inviarli, opportunamente strutturati, al server. Le stesse form HTML permettono di raccogliere dei dati immessi dall’utente tramite il usando un formato prestabilito all’interno di messaggi HTTP, ad un server che li utilizza per elaborazioni proprie, coinvolgendo magari ulteriori applicazioni. Le pagine dinamiche, come è stato detto, vengono generate dinamicamente, in risposta alla richiesta del client da programmi detti server script che vanno in esecuzione sul server stesso. Nel caso in cui l’elaborazione delle pagine dinamiche dipende dai dati immessi dall’utente web tramite una form, vi è la necessità di passare in input allo script tali informazioni per permetterne l’accesso durante l’esecuzione dello script stesso. Il server web che riceve i dati opportunamente codificati dal client deve quindi interfacciarsi con lo script per comunicarglieli. Il Common Gateway Interface – CGI[70] è uno standard che regola come vengono invocati da parte del server web gli script e definisce le modalità di passaggio allo script dei parametri, eventualmente immessi dall’utente tramite form. L’interfaccia CGI determina una serie di variabili predefinite, dette variabili d’ambiente, settate con valori opportuni dal server per raccogliere tutti i dati inviati dal client, le quali vengono così passate come parametri di esecuzione allo script. Se le informazioni contenute nella form HTML, opportunamente codificate, sono inviate al server utilizzando il metodo GET del protocollo HTTP[18], queste saranno passate allo script per mezzo della variabile d’ambiente QUERY_STRING, altrimenti nel caso di uso dei metodi POST o PUT, i dati verranno inviati allo script su standard input. Lo script durante le proprie elaborazioni accederà opportunamente alle variabili d’ambiente ed eventualmente leggerà i dati ricevuti sullo standard input e ne utilizzerà il contenuto per generare dinamicamente la pagina HTML; essa verrà immessa sullo standard output prima di terminare l’esecuzione dello script e intercettata dal server che la invierà in risposta al client, gestendo eventualmente l’aggiunta dell’header HTTP prima di spedirla. Gli script lato server sono attualmente molto usati soprattutto nelle situazioni in cui vi è la necessità di consultare, per rispondere alle richieste del client, informazioni reperibili localmente sul server. Le form HTML sono tuttora il mezzo più usato sul web per raccogliere i parametri da passare agli script su server; Google, uno tra i più noti motori di ricerca, fa uso di server script elaborati adoperando Python. Utilizzando degli script lato server aumentano notevolmente le potenzialità del web, ma tale metodo di gestione e generazione delle pagine web in relazione ai dati forniti in input dall’utente presenta anche alcuni evidenti svantaggi: • è spesso necessario sviluppare complicati programmi lato server in grado di interpretare e gestire opportunamente i dati inviati dall’utente (client); • ogni volta che l’utente invia la form dopo un cambiamento, i dati vengono inviati al server web, ridiretti verso un’applicazione specifica tramite interfaccia CGI ed elaborati; infine un’eventuale pagina HTML contente i risultati delle elaborazione è restituita al client. Ciò aumenta il traffico sulla rete e carica la CPU del server, rallentandola. Si pensi al caso in cui i dati immessi con una form da client sono errati ed è necessario rispedire la form al client generando traffico aggiuntivo e caricando il server con elaborazioni anche basilari per il controllo della validità dei dati stessi. Per concludere questa breve trattazione dello scripting su server (supportato dalle web form nell’interfacciarsi con i client), verrà ora analizzato come l’HTML gestisce e invia i dati di una form in relazione all’uso del metodo GET o POST dell’HTTP nelle operazioni di spedizione. Quando una form viene inviata, il browser ne determina tutti i controlli “successful”, ovvero quelli relativi a dati validi per essere spediti e forma per ognuno di questi controlli una coppia nome/valore che lo descrive. Le varie coppie nome/valore, nel caso in cui si usa il metodo di codifica “application/x-www-urlencoded”, vengono unite a formare un’unica stinga così strutturata: tutti i caratteri non alfanumerici vengono sostituiti dalla loro codifica ASCII su due cifre esadecimali preceduta dal carattere “?”; gli spazi vengono sostituiti dal carattere “+”; ogni nome è connesso al proprio valore per mezzo del carattere “=”; le coppie nome/valore sono separate dal carattere “&”. Se si usa il metodo GET per spedire la form tale stringa, che può essere lunga al massimo 256 caratteri, viene concatenata al valore dell’URI nell’intestazione del pacchetto HTTP, separata dall’URI stesso per mezzo del carattere “?”. Ad esempio si può avere il seguente URI esteso comprendente i dati di una form con due campi di input per l’immissione di nome e cognome: “http://www.miodom.it/pagina.html?nome=chiara&cognome=rossi”. Sul server la stringa che segue il “?” all’interno dell’URI viene passata allo script per mezzo della variabile d’ambiente QUERY_STRING dell’interfaccia CGI. Nel caso in cui si sceglie il metodo POST la stringa contenente le coppie nome/valore viene inserita nel corpo del messaggio HTTP, immediatamente dopo l’header. I linguaggi di scripting lato client e il loro impiego nella gestione delle web form Nel 1995 Netscape, organizzazione che rappresenta uno dei principali promoter mondiali per la produzione e la diffusione di software open source, ha introdotto nel proprio browser Netscape Navigator, arrivato allora alla versione 2.0, un nuovo linguaggio di scripting che permetteva ai web designer di interagire con i vari elementi di cui si componevano le pagine web: immagini, form, link, etc. Tale nuovo linguaggio era però stato incluso in primo luogo per fornire possibilità di adoperare su web le applet Java; queste sono dei programmi scritti utilizzando Java, i quali possono essere inclusi nelle pagine HTML pressappoco con la stessa facilità con la quale vengono incluse delle immagini e permettono di interagire con l’utente; ve ne sono varie che implementano particolari effetti grafici. Nel ’95 infatti la Netscape collaborava strettamente con la Sun Microsystem, l’ideatrice di Java, e da tale rapporto di cooperazione derivò il tentativo di implementare nel browser Netscape il supporto alle applet Java. Il 4 dicembre del ’95 Nescape e Sun annunciarono l’introduzione di questo nuovo linguaggio di scripting lato client che in poco tempo divenne largamente adoperato dagli sviluppatori web prevalentemente per manipolare immagini e documenti web. Il nome inizialmente attribuito al linguaggio è stato LiveScript ad indicare la vivacità, la natura dinamica che veniva aggiunta alle pagine web che lo adoperavano. Il successo di LiveScript fu notevole, molto probabilmente in relazione alla grande semplicità con la quale era possibile aggiungere le nuove caratteristiche di dinamicità ai contenuti del web; il codice di LiveScript, facile da elaborare, veniva inviato al client allegato alla pagina web alla quale era connesso ed interpretato dal client stesso permettendo di gestire la visualizzazione dei contenuti della pagina stessa. Dopo alcuni mesi dall’annuncio di LiveScript, Netscape, in omaggio al linguaggio Java della Sun Microsystem, decise di ribattezzare LiveScript col nome di JavaScript, che tuttora conserva. La Microsoft rispose all’introduzione di JavaScript aggiungendo prima il supporto per VBScript su Internet Explorer e immediatamente dopo, precisamente il 16 giugno del ’96, annunciando una prima versione di un proprio linguaggio di scripting, chiamato JScript, simile per molti aspetti a JavaScript. L’introduzione da parte della Microsoft e del linguaggio JScript e le conseguenti prevedibili incompatibilità tra gli script JavaScript e quelli JScript, spinsero Netscape e Sun a standardizzare il proprio linguaggio di scripting con il supporto della European Computer Manufacturers Association (ECMA)[71], organizzazione dedicata alla standardizzazione di sistemi di Information and Comunication Technology – ITC. Tale lavoro di standardizzazione, iniziato nel novembre ’96, fu adottato dalla ECMA nel giugno del ’97 (documento di specifiche ECMA_262) e nell’aprile dell’anno successivo anche dalla ISO (International Standard Organization). Il linguaggio di scripting così definito viene riconosciuto come ECMAScript[72] e raccoglie in sé alcune delle funzionalità base definendo quindi un modello ad oggetti (object model) per trattare i documenti HTML. Nello stesso periodo sia la Microsoft che Netscape introdussero sul mercato le versioni 4.0 dei propri browser, ognuna delle quali presentava un modello ad oggetti proprietario per permettere agli script, rispettivamente JScript e JavaScript, di agganciarsi e gestire i documenti HTML. Era nato ciò che da allora viene riferito come “HTML dinamico”; esso consiste nella possibilità di adoperare congiuntamente per gestire i contenuti web, l’HTML, JavaScript (o JScript) e i fogli di stile Cascading Style Sheet (CSS[9])definiti dal World Wide Web Consortium per determinare con più immediatezza le proprietà e lo stile delle varie parti di un documento HTML. Con l’HTML dinamico si aveva la possibilità di elaborare pagine web molto più ricche di grafica ed interattività, oltre che più flessibili nella gestione. Gli sviluppatori di applicazioni web però si trovarono in evidente difficoltà nel produrre documenti HTML che includessero script compatibili sia con Netscape Navigator che con Internet Explorer e si adottarono diverse soluzioni, spesso provvisorie, per risolvere tale problema di incompatibilità di fondo; ad esempio venivano fornite differenti versioni di un documento HTML o di parti di questo a seconda del browser utilizzato dal client. Anche per ciò che riguarda l’implementazione dei fogli di stile CSS, il comportamento del browser web Netscape Comunicator differiva da quello di Internet Explorer e nessuno dei due era aderente del tutto con le specifiche del World Wide Web Consortium. Proprio in questo periodo Netscape, Microsoft e molte altre parti interessate lavorarono assieme al World Wide Web Consortium per definire e standardizzare una versione di base comune e condivisa del Document Object Model (DOM), ovvero di un’interfaccia indipendente dal particolare linguaggio e dalla specifica piattaforma, utilizzata per permettere a programmi e script di accedere dinamicamente ed aggiornare il contenuto, la struttura e lo stile di documenti (ad esempio pagine web HTML). Il DOM, il lavoro per la definizione del quale era iniziato nell’ottobre del 1997, fu standardizzato dal World Wide Web Consortium nell’ottobre del 1998. Per mezzo del DOM viene quindi definito un object model che, seguendo i principi della programmazione orientata agli oggetti, permette di gestire i documenti HTML (o, più in generale, XML) per mezzo di gerarchie di oggetti che ne rappresentano le varie parti e ne determinano la struttura e le relazioni reciproche; viene conseguentemente definita l’interfaccia da adoperare per accedere e manipolare tali oggetti in maniera efficace. Il DOM è stato sviluppato dal World Wide Web Consortium per passi successivi detti livelli (level); ogni livello espande le funzionalità ed introduce nuove caratteristiche rispetto a quello precedente. Il “level 0” sostanzialmente formalizza quanto era già implementato sui browser Netscape e Explorer relativamente all’interfaccia per mezzo della quale gli script accedevano ai documenti HTML, al momento della formazione del gruppo di lavoro per la definizione del DOM. Nel “level 1” sono definite le funzionalità per la navigazione e la manipolazione dei documenti HTML e, più in generale, XML; esso è stato standardizzato nell’ottobre 1998. Nel “level 2” viene aggiunto al DOM il supporto di un object model per i fogli di stile, fornendo quindi la possibilità di accedere e manipolare le informazioni riguardanti lo stile di un documento. Viene oltretutto definito un modello di eventi (event model) per mezzo del quale è possibile associare a differenti azioni o fasi elaborative di un documento la generazione di particolari eventi che verranno opportunamente propagati e notificati ai vari elementi che formano la struttura ad albero del documento, ed eventualmente gestiti per mezzo dell’invocazione di script appositamente definiti per tale fine, detti appunto event handler (gestori di eventi). Attualmente è in fase di ultimazione l’elaborazione del DOM “level 3” che, per quanto riguarda alcune sue parti, è già stato standardizzato. Esso aggiunge nuovi eventi e permette il supporto di molte caratteristiche dell’XML quali ad esempio la validazione di documenti in relazione ad una Document Type Definition (DTD[15]) o ad un XMLSchema[16]; questi due termini si riferiscono a delle particolari modalità di definizione della struttura e dell’organizzazione di un documento XML. In relazione alle indicazioni incluse in questi documenti e a regole universalmente valide riguardanti la struttura dei documenti XML, ogni singola istanza di documento può essere validata in relazione sia al rispetto delle regole generali valide per ogni documento XML, che di quelle specifiche per una classe di documenti XML, definite per mezzo di una DTD o di uno Schema. Nel DOM “level 3” vengono oltretutto definite nuove possibilità di formattazione dei documenti e determinate le modalità per memorizzare e reperire dalla memoria le informazioni contenute in un documento. Tramite script è quindi possibile aggiungere dei semplici frammenti di codice alle pagine HTML, interpretati lato client durante la visualizzazione della pagina stessa, così da gestire delle elaborazioni dinamiche; gli script possono accedere e modificare il contenuto di un documento HTML; di solito sono attivati al verificarsi di particolari eventi. L’uso degli script ha trovato subito applicazione, apportando notevoli vantaggi, nella gestione delle web form. Includendo appositi script nelle pagine web contenenti delle form è possibile effettuare una prima validazione lato client dei dati immessi dall’utente prima che vengano inviati al server, evitando di svolgere tutte le operazioni di verifica della correttezza dell’input dell’utente sul server; in tale maniera viene alleggerito sia il carico elaborativo della CPU del server, sia il traffico circolante in rete. Per mezzo di script si possono validare i dati immessi dall’utente e gestire la visualizzazione di informazioni di errore in caso di insuccesso, fornendo dei suggerimenti per la correzione. E’ anche possibile determinare la compilazione dinamica delle form variando la struttura di alcuni controlli in relazione ai dati fino a quel momento inseriti nel modulo elettronico. Possibili situazioni in cui si può effettuare una validazione dei dati lato client per mezzo di script, prima di inviarli in rete, sono i seguenti: • verificare che la password digitata da un utente abbia una lunghezza minima definita (numero di caratteri); • verificare che un campo di input destinato a contenere un indirizzo e-mail effettivamente contenga una stringa di caratteri del tipo [email protected], ove col simbolo X si rappresenta una qualsiasi stringa (più in generale si può verificare che dei dati immessi in input rispettino le regole di formattazione di una qualsiasi espressione regolare); • controllare se almeno un’opzione di una lista è stata selezionata dall’utente; • controllare se sono uguali una password digitata in una casella di input e la sua ridigitazione per conferma in una seconda casella di input; • verificare se l’utente ha compilato i campi della form obbligatori. Tali script possono essere attivati da determinati eventi o in particolari condizioni; ad esempio è possibile controllare il contenuto della form immediatamente prima di spedirla e bloccare tutto in caso di insuccesso, oppure si possono controllare i dati immessi man mano che l’utente compila i campi, permettendo un feedback più immediato. Per rendersi conto delle possibilità degli script Javascript si analizzino i seguenti due semplici esempi: 1. Si vuole verificare se un campo di immissione di testo è stato riempito con la digitazione di almeno un carattere; se ciò non accade si mostra un messaggio all’utente su una finestra di poup. Documento HTML: … <form name=”form1” action=”…” enctype=”…” method=”…”> … <input type=”text” name=”in1” onblur=”script1();”> … </form> … Script: ... function script1(){ if (document.form1.in1.value.length == 0) { alert("Immettere i dati nel campo di testo!!!\n"); return false; } return true; } ... Per mezzo di questo script si accede all’elemento input di nome “in1” della form e se ne verifica la lunghezza (numero di caratteri) per mezzo della funzione “length()” che, se applicata su un oggetto stringa, ritorna il numero di caratteri della stringa stessa; se è nulla ovvero l’utente non ha immesso alcun dato nella casella di testo si visualizza un messaggio su una finestra di pop up. Tale script viene eseguito conseguentemente all’evento “onblur” (onblur=”script1();”) ovvero va in esecuzione tutte le volte che viene deselezionata la casella di testo della form. 1. Si vuole disabilitare il checkbox “checkB” se l’utente deseleziona il checkbox “checkA” Documento HTML: … <form name=”form2” action=”…” enctype=”…” method=”…”> … <input type=”checkbox” name=”checkA” onclick=”script2();”> <input type=”checkbox” name=”checkB”> … </form> … Script: ... function script2(){ if (document.form2.checkA.checked == false) document.form2.checkB.disabled = true; if (document.form2.checkA.checked == true) document.form2.checkB.disabled = false; return; } ... Ogni volta che si clicca col mouse sul checkbox “checkA”, ovvero viene generato l’evento “onclick” dal controllo “checkA” della form, si verifica se tale casella è selezionata; se non lo è si disabilita il checkbox “checkB” ponendo a “true” la proprietà disabled, altrimenti lo si abilita ponendola a “false”. Con l’introduzione di script lato client è quindi possibile risolvere, con elaborazioni locali sul client, i problemi relativi alla validazione dei dati immessi ed al controllo della compilazione di una form alleggerendo le elaborazioni del server ed il carico di traffico della rete; oltretutto l’utente può avere un feedback immediato durante la compilazione della form poiché i controlli sui dati immessi sono svolti localmente. Ovviamente è possibile adoperare gli script, per ciò che riguarda la compilazione delle form, solamente per quelle verifiche che non richiedono controlli che coinvolgono dati che solo il server possiede (in tali situazioni si possono adoperare script su server). In ogni caso le potenzialità degli script sono notevoli ed ampiamente sfruttate per la gestione delle form. Di frequente accade però che per gestire situazioni particolari gli script divengono difficili da elaborare e mantenere funzionanti nel tempo, in relazione ad eventuali modifiche di cui sono oggetto le form e le pagine web che le contengono. Spesso vi sono alcune frequenti verifiche basilari sui controlli di una form (tipo di dato immesso, conformità con un’espressione regolare da parte di una stringa, etc.) che, se effettuate tramite script, risultano essere onerose e ripetitive per lo sviluppatore e appesantiscono le pagine web. Per tali motivi attualmente si stanno sviluppando nuove modalità di gestione lato client dei dati immessi tramite una form, adoperando, ad esempio, controlli sulla validità e sulla struttura delle form definibili mediante sintassi dichiarativa; tali problematiche e le soluzioni verso le quali il web si sta orientando saranno trattate nel seguito. XForms e la standardizzazione e diffusione dell’XML Con il passare del tempo e con la nascita e lo sviluppo di nuove tecnologie web le form HTML, che hanno rappresentato durante gli anni novanta il motore dello sviluppo del commercio elettronico e, più in generale, un mezzo per incrementare notevolmente le potenzialità del web, hanno messo in evidenza vari aspetti che potevano essere migliorati. Nel 1998 è stato standardizzato dal W3C, dopo quasi due anni di attività di formulazione, l’Extensible Markup Language (XML)[11], un potente linguaggio di definizione della struttura logica di documenti elettronici detti documenti XML. Questi ultimi sono caratterizzati dalla possibilità di separare e gestire indipendentemente la struttura logica, il contenuto e le modalità di visualizzazione (la presentazione). Tali documenti presentano un’elevata portabilità permettendo lo scambio e la visualizzazione dei dati contenuti su piattaforme differenti dotate di appositi programmi detti processori XML; essi si occupano dell’elaborazione dei documenti XML stessi. A partire da allora l’XML e numerose tecnologie correlate sono state messe a punto definendo nuovi linguaggi di markup con differenti finalità. Esse si sono sempre più diffuse in numerosi ambiti applicativi. Nel 2000 è stato standardizzato anche l’Extensible Hypertext Markup Language, XHTML 1.0[17], riformulazione del linguaggio HTML, giunto allora alla versione 4, con una sintassi conforme alle specifiche XML 1.0. Nello stesso tempo, seguendo alcuni accorgimenti, si conservò la possibilità di visualizzazione dei documenti su user agent compatibili con HTML 4. Col passare del tempo, a causa della crescente diffusione di servizi e applicazioni web che richiedevano l’inserimento, da parte degli utenti del web stesso, di una maggiore quantità di dati e con una struttura sempre più complessa, le form HTML, come già accennato, hanno evidenziato alcuni limiti; tra questi vi sono un forte legame tra contenuto e presentazione, la necessità di utilizzare spesso script anche complessi per la loro gestione oltre che una scarsa integrazione con l’XML, tecnologia chiave del World Wide Web Consortium (W3C), mezzo potente e flessibile, attualmente affermatosi come la “lingua franca” del web. Per far fronte a tali necessità, a partire da aprile 2000, il World Wide Web Consortium ha iniziato a lavorare ad un progetto di definizione di quella che sarebbe stata la nuova generazione di form sul web: XForms[10]. Attualmente il W3C ha messo a punto e standardizzato la tecnologia XForms definendo nuove modalità di gestione dei moduli elettronici al fine di permettere una maggiore interazione con gli utenti del web, più flessibilità e potenza nella gestione dei dati immessi dagli utenti stessi, oltre che una forte integrazione con XML. XForms è stato sviluppato definendo un apposito linguaggio di markup adatto ad essere inserito all’interno di altri documenti XML che utilizzano un qualsiasi tipo di markup (come ad esempio documenti HTML o SVG). XForms è platform-indipendent e XML-based. Con XForms è possibile separare l’organizzazione logica dei dati (cosa fa la form, che informazioni vuole ricavare e come) dalla presentazione o modalità di visualizzazione. La stessa struttura logica della form può essere infatti visualizzata opportunamente su differenti sistemi tramite interfacce utente specifiche: browser tradizionale, PDA, mobile phone o browser vocale. Inoltre, utilizzando XForms, è possibile definire con l’aggiunta di markup (elementi ed attributi) proprietà anche complesse che i dati inseriti dall’utente nella compilazione del modulo elettronico devono verificare o particolari relazioni tra i valori dei campi di una form. Si possono gestire anche un cospicuo numero di eventi ed elaborare form complesse senza fare ricorso a script specifici e spesso molto articolati per ottenere lo stesso risultato. Lo scambio dei dati con l’utente avviene attraverso documenti XML la cui struttura è definita appositamente dall’autore della form per contenere i dati stessi. La form può essere precompilata con il contenuto di un documento XML esterno; a compilazione terminata può essere inviata al server quale documento XML riempito con i dati immessi dall’utente secondo regole di corrispondenza definite, con sintassi XForms, dall’autore della form stessa. Per supportare XForms sulla piattaforma dell’utente deve essere disponibile un processore XForms, spesso aggiunto quale plug-in agli attuali browser, che si occupa di interpretare la struttura delle form e visualizzare opportunamente i controlli necessari per reperire i dati immessi dall’utente, validandoli ed inviandoli in risposta al server tramite un documento XML appositamente strutturato per contenerli. Tutti gli elementi del markup di XForms sono definiti in un namespace al seguente URI: http://www.w3.org/2002/xforms. Viene ora analizzato in maggior dettaglio come è strutturato un documento XForms. L’elemento base di un documento XForms è l’elemento <model> che rappresenta la radice della definizione del modello XForms e tipicamente costituisce una zona del documento XML contenente la form che non viene renderizzata. All’interno dell’elemento <model> si trova l’elemento <instance> usato come contenitore dell’instance data ovvero di un’istanza di documento XML che può, in alternativa, essere individuata attraverso un riferimento a file esterno. Tale documento XML rappresenta la struttura all’interno della quale inserire i dati immessi dall’utente durante la compilazione della form affinché i dati stessi siano in seguito spediti in formato XML. Spesso l’instance data viene anche utilizzata al momento della visualizzazione iniziale della form per reperire i dati di default da mostrare all’utente quali valori iniziali di determinati controlli. All’interno dell’elemento <model> possono esservi uno o più elementi <bind> che specificano dei vincoli sui dati dell’instance data. L’elemento <bind> può specificare tramite i propri attributi sia il nodo/i nodi dell’instance data a cui fa riferimento utilizzando delle espressioni XPath (attributo “nodeset”), che le proprietà che i dati destinati ad essere immagazzinati in tale nodo/in tali nodi devono verificare. Ad esempio l’attributo “type” determina, relativamente alle informazioni contenute nel nodo in questione, un particolare tipo di dato tra quelli definiti nelle specifiche XMLSchema; l’attributo “required” indica se è necessario per validare la form che il nodo selezionato non sia lasciato vuoto; l’attributo “constraint” specifica un vincolo da verificarsi relativamente ad uno a più nodi, definito utilizzando una espressione XPath che ritorna un valore booleano; l’attributo “readonly” indica che il contenuto di un nodo dell’instance data è di sola lettura ovvero che il controllo associato a quel nodo non può essere usato per modificare i dati in esso contenuti; l’attributo “calculate” permette di definire un’ espressione XPath per mezzo della quale effettuare delle elaborazioni che possono coinvolgere altre parti dell’instance data ed il cui risultato, interpretato come una stringa, determinerà il valore del nodo in questione. Infine, internamente all’elemento <model>, deve essere specificato tramite l’elemento <submission> l’URL al quale il documento XML contenente i dati raccolti tramite i controlli della form deve essere inviato. E’ possibile oltretutto indicare per mezzo dell’attributo “schema” dell’elemento <model> un riferimento ad una DTD o analogamente ad un XMLSchema dove viene meglio definita la struttura dell’instance data. Dopo aver determinato il modello XForms si possono inserire all’interno del documento XML che includerà la form (editato utilizzando un particolare linguaggio di markup come potrebbe essere l’HTML) i controlli XForms nella posizione desiderata; questi rappresentano gli effettivi elementi di interazione con l’utente per la raccolta dei dati. I processori XForms, dopo aver analizzato ed interpretato opportunamente il modello XForms, si occupano di esaminare gli elementi di marcatura utilizzati per definire e posizionare i vari controlli visualizzandoli adeguatamente all’utente finale al fine di permettergli di inserire le informazioni richieste. I controlli che possono essere utilizzati all’interno di un documento XForms sono i seguenti : ¾ <input> definisce un generico ingresso; ¾ <secret> definisce un ingresso criptato; ¾ <textarea> definisce un area di testo; ¾ <output> definisce una generica uscita; ¾ <upload> definisce un file locale per fare l’upload; ¾ <range> definisce un intervallo; ¾ <trigger> definisce un pulsante; ¾ <submit> definisce il pulsante per fare l’invio dei dati; ¾ <select> definisce una scelta multipla; ¾ <select1> definisce una scelta singola; Per determinare le modalità per immettere i dati raccolti tramite i controlli della form nel documento XML da inviare al server (il cui modello è definito mediante l’instance data) è previsto l’attributo “ref”. Questo l’attributo può essere definito per tutti i controlli e viene specificato, per mezzo di una espressione XPath, l’elemento o l’attributo dell’instance data che conterrà i dati immessi dall’utente utilizzando il controllo stesso. Lo stesso risultato può essere ottenuto indicando, quale valore dell’attributo “bind” di un determinato controllo, l’ID di un elemento <bind> facente parte del modello della form (quindi incluso all’interno dell’elemento <model>); i dati reperiti tramite tale controllo saranno immessi nell’elemento dell’instance data a cui fa riferimento l’elemento <bind> selezionato. In generale, tale operazione di collegamento tra i dati reperiti attraverso i controlli e le locazioni all’interno dell’instance data destinate a contenerli è detta binding. La frequenza degli aggiornamenti dell’instance data durante la compilazione della form è regolata dall’attributo “incremental”, aggiunto, se necessario, ai singoli controlli; tale attributo può essere settato con i valori false (default) o true. Se risulta essere false l’aggiornamento dell’instance data avviene ogni volta che un utente deseleziona un controllo dopo averne modificato il contenuto; se invece “incremental” è posto a true gli aggiornamenti dell’instance data avvengono con una frequenza maggiore determinata dal particolare processore XForms in uso. Ogni elemento del markup XForms che definisce un controllo può contenere ulteriori elementi utili a specificare un’etichetta per il controllo (label), un messaggio di aiuto per l’interazione dell’utente con lo specifico controllo (help), o anche un avviso da mostrare nel caso in cui si verifichino situazioni di errore (alert). E’ possibile, adoperando elementi <group>, raggruppare assieme dei controlli di una form in maniera tale da poter gestire collettivamente le proprietà condivise da tutti i controlli di un gruppo; in tale modo si ha anche la possibilità di raggruppare visivamente i controlli che richiedono informazioni strettamente correlate così da agevolare l’utente nella compilazione della form. Tramite l’elemento <switch> si ha la possibilità di specificare differenti sezioni della form delle quali solamente una per volta sarà mostrata per la compilazione all’utente finale; tali sezioni sono incluse ciascuna in un elemento <case> figlio dell’elemento <switch>. Tramite opportuni controlli l’utente potrà scegliere quale sezione visualizzare. Con XForms vi è la possibilità di gestire con relativa semplicità delle strutture di controlli che si ripetono una o più volte (ad esempio, una lista di articoli da ordinare con il relativo prezzo e l’indicazione della quantità); tale operazione è gestibile nelle form HTML solo attraverso l’uso di complicati script lato client o per mezzo di una eventuale ridefinizione della struttura della form sul server. Tramite l’elemento <repeat> è possibile specificare sia i controlli che saranno ripetuti, che la parte dell’instance data destinata a contenere le informazioni raccolte, la quale verrà replicata tante volte quante sono le ripetizioni del gruppo di controlli utilizzate dall’utente. E’ anche possibile indicare le modalità di visualizzazione delle strutture di ripetizione (se visualizzare tutte le righe della struttura di ripetizione oppure utilizzare una barra di scorrimento per selezionare la/le riga/righe da mostrare). Per quanto concerne l’uso degli script nella definizione di una form, XForms, così come è possibile notare analizzandone le caratteristiche finora descritte, tende ad identificare le situazioni in cui lo scripting è comunemente adoperato ed introdurre una sintassi dichiarativa che permetta di effettuare le stesse operazioni. Gli script, infatti, in alcune situazioni risultano difficili da realizzare e spesso complessi da mantenere col passare del tempo e con le modifiche apportate alle pagine web che li contengono. In XForms vengono definite con sintassi dichiarativa delle azioni (Actions) che possono essere compiute, in relazione al verificarsi di particolari condizioni; tra gli elementi utilizzati per determinare le azioni, a titolo esplicativo vengono menzionati i seguenti: ¾ <message> : utilizzato per mostrare all’utente un messaggio (corrisponde alla funzione “alert()” tipica degli script); ¾ <setvalue> : adoperato per immettere un determinato valore in una locazione dell’instance data individuata da un’espressione XPath; ¾ <setfocus> : seleziona un determinato controllo della form; ¾ <reset> : resetta la form riportandola nel proprio stato iniziale; ¾ <toggle> , <index>, <delete> : adoperati per gestire l’aggiunta, l’ordinamento e la cancellazione delle righe di una struttura di ripetizione di controlli. Di solito tali azioni vengono effettuate in relazione al verificarsi di particolari eventi riguardanti la form e quindi sono utili ad implementare con sintassi dichiarativa degli event handler (gestori di eventi). Difatti, in ogni elemento che definisce un’azione, per mezzo dell’attributo “event”, viene indicato l’evento che attiva tale azione ed eventualmente l’ID dell’elemento della form dal quale il particolare tipo di evento deve essere generato. Numerosi sono gli eventi definiti nelle specifiche XForms e quindi gestibili dai processori XForms; tali eventi sono relativi, ad esempio, alla selezione e deselezione (focus) di un determinato controllo (DOMFocusIn e DOMFocusOut), alla segnalazione che la form è stata correttamente caricata ed è pronta ad essere compilata (xforms-ready), al cambiamento di valore di un controllo della form (xforms-value-changed), alla validità o invalidità di un determinato controllo (xforms-valid e xforms-invalid). E’ possibile raccogliere assieme, all’interno dell’elemento <action>, un numero arbitrario di elementi che definiscono delle azioni da effettuare in relazione al verificarsi di un particolare evento, indicato una sola volta per mezzo dell’attributo “event” dell’elemento <action> stesso. Per ciò che riguarda l’invio dei dati raccolti per mezzo delle form è possibile specificare, tramite l’elemento <submission>, inserito direttamente all’interno del modello della form, sia l’URI a cui inviare i dati (attributo “action”) che il metodo di invio (attributo “method”); tra i metodi comunemente adoperati per ciò che riguarda il protocollo HTTP[18] vi sono PUT, POST, GET e DELETE. Per quanto concerne i possibili formati di serializzazione dei dati da inviare, oltre a quelli tradizionali definiti nelle specifiche delle form HTML 4.01 (application/x-www-form-urlencoded e multipart/form-data), c’è la possibilità di usare la codifica “application/xml”; per questo formato è possibile specificare per mezzo di ulteriori attributi dell’elemento <submission> il tipo di codifica dei caratteri del documento XML (attributo “encoding”), la possibilità di inserire degli spazi bianchi nel documento XML per migliorarne la leggibilità (attributo “indent”), l’omissione della dichiarazione del file XML trattato (attributo “omit-xml-declaration”), la presenza o meno di sezioni esterne da includere nel documento XML prodotto (attributo “standalone”) e le modalità di trattare le sezioni di testo da non interpretare come contenuto XML del documento (CDATA section). Per definire lo stile delle form possono essere usati dei fogli di stile CSS. Esempio di uso di XForms Analizziamo ora come viene definito con sintassi XForms un semplice modulo elettronico assieme ai controlli necessari per acquisire i dati. Cominciamo col determinare il modello XForms supponendo di voler ottenere da un utente le seguenti informazioni: nome e cognome, data di nascita ed area geografica di residenza (Italia o estero). E’ necessario definire la struttura dell’instance data (documento XML) destinata a contenere i dati reperiti attraverso la form da inviare al server; oltre a ciò è necessario anche specificare, utilizzando elementi <bind>, i vincoli per la validità dei dati ottenuti per mezzo della form. In particolare devono essere necessariamente compilati tutti i campi (required) ed il tipo di dato da immettere quale data di nascita deve essere effettivamente una data (ottengo ciò ponendo il valore dell’attributo “type” dell’elemento <bind> pari a xs:date che è uno dei tipi di dato definiti nelle specifiche XMLSchema). <!-- Modello XForms --> <xfm:model id=”dati-utente” xmlns:xfm=http://www.w3.org/2002/xforms” xmlns:xs=”http://www.w3.org/2001/XMLSchema”> <xfm:submission id=”submit1” action=”URL_destinazione_dati_raccolti”/> <xfm:instance id=”inst1” xmlns=””> <utente> <nome-cognome></nome-cognome> <data-nascita></data-nascita> <residenza></residenza> </utente> </xfm:instance> <xfm:bind nodeset=”/utente/nome-cognome” required=”true()”/> <xfm:bind nodeset=”/utente/data-nascita” required=”true()”/> <xfm:bind nodeset=”/utente/residenza” required=”true()” type=”xs:date”/> </xfm:model> E’ ora possibile specificare i controlli necessari per l’immissione dei dati dell’utente (tali controlli possono essere inclusi nella posizione che si ritiene più adatta all’interno di un documento editato adoperando un qualsiasi linguaggio di markup; ad esempio HTML, XHTML, SVG, etc.): o Nome e cognome (utilizzo un generico controllo ‘input’): <xfm:input ref=”/utente/nome-cognome”> <xfm:label>Inserisci il tuo nome ed il tuo cognome</xfm:label> </xfm:input> o Data di nascita: <xfm:input ref=”/utente/data-nascita”> <xfm:label>Inserisci la tua data di nascita</xfm:label> <xfm:hint>Inserire una data</xfm:hint> </xfm:input> L’elemento <hint> è di solito visualizzato al passare del mouse sul controllo. Poiché il tipo di dato da immettere è una data, è probabile che sul browser web tale controllo venga rappresentato mostrando una casella di scelta che apre un calendario interattivo da cui poter selezionare una data. o Stato di residenza (utilizzo il controllo ‘select1’ che permette di effettuare una scelta di una tra più possibilità): <xfm:select1 ref=”/utente/residenza”> <xfm:label>Inserisci l’area geografica di residenza</xfm:label> <xfm:item> <xfm:label>Italia</xfm:label> <xfm:value> Italia </xfm:value> </xfm:item> <xfm:item> <xfm:label>Estero</xfm:label> <xfm:value>Estero</xfm:value> </xfm:item> </xfm:select1> o Bottone di invio della form (fa riferimento per mezzo dell’attributo “submission” all’ID dell’elemento <submission> del modello della form, il quale determina le modalità di spedizione della form): <xfm:submit name="submit1" submission="submit1"> <xfm:label>Submit</xfm:label> </xfm:submit> Si noti come le varie sezioni appena descritte che concorrono alla definizione della form, specifichino solamente la struttura logica della form stessa; le modalità di visualizzazione del modulo elettronico (posizionamento e stile dei controlli) sono definite in relazione al documento XML nel quale viene inserita la form, al particolare linguaggio di markup usato, ad eventuali fogli di stile CSS associati, oltre che dal processore XForms presente sulla piattaforma dell’utente che si occupa di gestire la compilazione della form renderizzando opportunamente i controlli che la compongono. Risultano quindi evidenti le possibilità di definire separatamente, adoperando XForms, l’organizzazione logica e le modalità di visualizzazione delle form ottenendo conseguentemente una notevole indipendenza dalla piattaforma utente. La seguente immagine mostra come avviene la renderizzazione della semplice form appena definita; le parti che di cui si compone la form sono state opportunamente inserite all’interno di un documento HTML, in particolare i controlli all’interno del body e il modello della form (elemento <model>) all’interno dell’head (è stato adoperato per la renderizzazione il browser XSmiles[65] che supporta nativamente la tecnologia XForms): Il documento XML prodotto per raccogliere i dati della form ed inviato al server web avrà la seguente struttura (nel caso in cui si specifica tramite l’attributo “enctype” quale metodo di codifica dei dati della form “application/xml”): <?xml version=”1.0”?> <utente> <nome-cognome>Giulio Rossi</nome-cognome> <data-nascita>12-12-1999</data-nascita> <residenza>Roma</residenza> </utente> In conclusione, è possibile affermare che con XForms il W3C ha definito una nuova tecnologia web per gestire in maniera efficiente e ricca di potenzialità elaborative e di interattività le form sul web, garantendo anche la possibilità di determinare le caratteristiche di un modulo elettronico in maniera indipendente dalla piattaforma utente. Resta però la necessità di adoperare un programma apposito presente lato client, il cosiddetto processore XForms, per poter utilizzare le form; tale aspetto risulta essere un freno per la diffusione di questa tecnologia. Attualmente le form XForms non sono infatti supportate nativamente dai web browser più diffusi. Nell’agosto del 2004 la fondazione Mozilla ha annunciato l’avvio di un nuovo progetto di implementazione della tecnologia XForms - versione 1.0, nell’omonimo web browser, in collaborazione con Novell e IBM; attualmente si è nel pieno di tale lavoro di implementazione e alcune delle funzionalità di XForms sono già in fase di testing. Tale progetto potrebbe rappresentare una spinta decisiva verso una maggiore diffusione della tecnologia XForms. Web Forms 2.0: la proposta di standard del Web Application Technology Working Group. Recentemente si è costituito un organismo non ufficiale, il Web Hypertext Application Technology Working Group – WHATWG[19], frutto della collaborazione tra produttori di web browser ed altre parti interessate, col fine di sviluppare nuove tecnologie direttamente connesse ad applicazioni web, ovvero applicazioni remote cui si può accedere tramite il World Wide Web utilizzando un browser. A partire dai primi mesi del 2004, il WHATWG si è impegnato nell’elaborare un “working draft”, documento bozza di specifiche, relativo al progetto Web Forms 2.0. Con tale documento, rilasciato nella prima versione stabile il 26/06/2004, il WHATWG si propone di raccogliere tutte le esigenze espresse dagli autori web, relative ai problemi e alle difficoltà incontrate nell’uso delle form HTML; tali esigenze sono state individuate utilizzando mailing list e discussioni aperte sul web riguardanti l’argomento. Obiettivo di tale gruppo di lavoro è estendere le form HTML, così come sono definite nelle specifiche HTML 4.01 del World Wide Web Consortium, al fine di includere nuove caratteristiche per far fronte alle nuove esigenze manifestate in tale ambito, mantenendo una possibile compatibilità con i browser che supportano solo l’HTML. Come si evince dal working draft, le nuove form, oltre ad essere retrocompatibili con le vecchie form HTML, presentano maggiori possibilità di validazione lato client del loro contenuto per mezzo di sintassi dichiarativa (estendendo, ad esempio, con nuovi attributi gli elementi coinvolti nella loro definizione), nuovi campi di input per i quali è possibile definire rigidamente il tipo dei dati che devono essere immessi dall’utente, un modello per includere strutture di ripetizione col fine di determinare, dichiarativamente, la gestione di sezioni che si ripetono più volte. In aggiunta, anche l’interfaccia DOM[14] (Document Object Module)2 viene opportunamente estesa per supportare le nuove funzionalità introdotte, definendo nuovi eventi per la validazione e l’interdipendenza del contenuto dei controlli. E’ contemplata anche la possibilità di inviare i dati di una form immagazzinandoli in un documento XML e di prepopolare i campi delle form con contenuti di documenti esterni di vario tipo (ad esempio documenti XML), agganciandoli e analizzandoli tramite script. In Web Forms 2.0 non è previsto l’uso di tecnologie web recenti, quali XPath[12], XMLSchema[16], poichè queste non sono ancora ampiamente supportate dai browser. Nel seguito vengono analizzate in maggior dettaglio le aggiunte e le modifiche che, in relazione a quanto indicato nel testo del working draft Web Forms 2.0, devono essere apportate alle web form definite nelle specifiche HTML 4.01, per estenderne le potenzialità e renderne più completo ed efficiente l’impiego nell’ambito dello sviluppo di applicazioni web di vario tipo. In ogni form gli elementi fondamentali sono i controlli. Nel documento Web Forms 2.0 vengono definiti nuovi tipi di dato primitivi per determinare, più o meno rigidamente, le informazioni che devono essere richieste all’utente per mezzo dei vari controlli. In particolare, sono stati introdotti, per ciò che riguarda l’elemento < input>, utile a richiedere all’utente l’immissione di informazioni di vario genere, dei nuovi valori per l’attributo type. E’ possibile, grazie a queste estensioni delle form HTML, definire campi di input destinati a contenere i seguenti tipi di dato: date-time datetimelocal 2 data nel formato “anno, mese, giorno, ora, minuto, secondo, frazione di secondo”, riferita al meridiano di Greenwich (il fuso orario - timezone - è impostato ad UTC - Universal Time); è uguale al tipo di dato date-time, ma senza alcuna indicazione relativa al fuso orario; Per una descrizione del Document Object Module (DOM) si veda il capitolo “I linguaggi di scripting lato client e il loro impiego nella gestione delle web form” date month week time number range email URI data nel formato “giorno, mese, anno”; data nel formato “anno, mese”; data nel formato “anno, numero di settimana”; indicazione di un determinato istante di tempo in una giornata, nel formato “ore, minuti, secondi, frazioni di secondo”; valore numerico sia intero che decimale; è possibile usare anche la notazione esponenziale; un tipo di dato derivato da number per il quale viene specificato l’intervallo di variabilità e il passo con cui il valore numerico viene incrementato, per mezzo rispettivamente degli attributi “min“, “max” e “step”; Indirizzo e-mail (nel formato indicato nella sezione 3.4.1 della RCF 2822 che specifica gli standard per lo scambio di messaggi di posta elettronica fra calcolatori); Uniform Resource Identifier (così come è definito nell’RFC 2396 che ne specifica la struttura). Tali nuovi tipi di input possono essere settati inizialmente ad un valore di default specificato per mezzo dell’attributo “value”. E’ demandata ad ogni particolare user agent la scelta del miglior tipo di renderizzazione da adottare per permettere all’utente di inserire, in maniera semplice e intuitiva, i dati specifici richiesti; ad esempio, è possibile che, per agevolare l’immissione di date, lo user agent utilizzi, invece della tradizionale casella di testo, un calendario interattivo. Oltre all’introduzione dei tipi di dato appena descritti, in Web Forms 2.0 sono state estese le caratteristiche di numerosi controlli già esistenti nelle form HTML, col fine di tenere in considerazione le necessità di interfacciamento e manipolazione dei controlli da parte dei linguaggi di scripting, relativamente alla gestione delle form stesse. Viene contemplata la possibiltà che l’elemento <form> venga incluso nell’head per dichiarare la presenza di una determinata form in un documento HTML: in tal caso l’elemento deve necessariamente essere vuoto; i vari controlli della form possono essere sparsi ovunque all’interno del body ed ognuno deve riferire la form a cui appartiene nel caso ci siano più form presenti in uno stesso documento HTML. Oltre ad alcuni attributi delle form HTML che sono stati definiti in maniera più dettagliata (“readonly”, “name”, “maxlength” e “disabled”), anche in relazione ai nuovi tipi di elemento introdotti, sono stati definiti in Web Forms 2.0 nuovi attributi; tra questi vi sono: pattern title determina un’espressione regolare in base alla quale validare il contenuto di un controllo; è applicabile ai controlli textarea ed input di tipo text, password, e-mail e URI; è possibile specificarlo assieme all’attributo “pattern”; fornisce una breve descrizione della struttura della pattern da visualizzare, eventualmente, per aiutare l’utente a immettere i required form autocomplete autofocus inputmode dati nel formato richiesto;. indica che il controllo deve necessariamente essere riempito con i dati dell’utente prima di inviare la form. E’ applicabile a tutti i controlli escluso image, button, fieldset, select e output; può essere anche adoperato con i controlli aventi l’attributo “readonly” settato; tale attributo specifica, relativamente ad un controllo, la form a cui appartiene, indicando l’ID dell’elemento <form> a cui si riferisce e sovrascrivendo ogni dipendenza di tale elemento da altri elementi <form>; è quindi possibile posizionare i controlli della form ovunque nel body di un documento HTML, dopo aver dichiarato eventualmente, nell’head, la form stessa;. è possibile specificare i valori on e off per tale attributo; se attivato, lo user agent memorizzerà i dati inseriti nel controllo a cui si riferisce l’attributo e, alla successiva richiesta della stessa pagina, il controllo sarà già compilato con i dati inseriti in precedenza. E’ importante tenere in considerazione la sicurezza delle informazioni immesse dall’utente e la privacy nell’utilizzare tale attributo. I controlli che supportano l’autocomplete sono i tipi text, password, date number, email ed URI dell’elemento input, gli elementi select e textarea; indica il controllo della form che deve essere visualizzato per primo quando viene caricata la pagina web contenente la form. Se più controlli presentano tale attributo, viene selezionato l’ultimo indicato nel documento HTML contenente la form. E’ possibile aggiungere tale attributo a tutti i controlli esclusi quelli nascosti (hidden) e gli elementi output; è un attributo che fornisce allo user agent informazioni, sotto forma di una lista di nomi separati da spazi, riguardanti l’input che deve essere reperito attraverso uno specifico controllo (set di caratteri da utilizzare, uso della lettera iniziale maiuscola, simboli che possono essere inclusi nell’input, etc.). In aggiunta ai nuovi attributi appena descritti, le specifiche Web Forms 2.0 introducono anche nuovi elementi e quindi definiscono nuovi controlli. Tra questi vi sono: datalist output tale elemento serve per fornire una lista di valori che lo user agent può mostrare all’utente quando viene immesso il contenuto di un determinato controllo, permettendo di scegliere rapidamente uno tra i valori predefiniti presenti nella lista stessa oppure di continuare l’inserimento di un valore arbitrario. Questa possibilità è valida per i controlli input di tipo text, e-mail, URI, date e number. L’attributo list deve essere incluso in tali elementi per associarvi una datalist e indica l’ID dell’elemento datalist all’interno del quale sono specificate le varie possibilità di scelta per mezzo di elementi option; tale elemento permette di visualizzare dei campi di output all’interno di una form. E possibile definire un valore di default e specificare, per mezzo dell’attributo for, una lista di ID di altri elementi/controlli della form i quali, con il loro valore, influenzano il contenuto dell’elemento output stesso. Ciò può fornire allo user agent indicazioni utili per una corretta gestione della form. Tra gli elementi delle form HTML, ai quali sono state aggiunte nuove caratteristiche, vi sono: textarea file upload form submit button è stato aggiunto l’attributo wrap col fine di specificare la formattazione del testo inserito relativamente, ad esempio, ai capolinea da considerare; è stato aggiunto l’attibuto accept che permette di specificare una lista di tipi di file da accettare e gli attributi min e max che indicano il numero minimo e massimo di file di cui è possibile effettuare l’upload. l’attributo action che indica l’URI a cui inviare la form non è più obbligatorio e, se non specificato, è utilizzato l’URI del documento corrente per l’invio della form. Per mezzo dell’attributo replace, è possibile anche effettuare degli updates incrementali della form, ovvero è possibile far sì che, una volta inviata una form parzialmente compilata, i dati spediti in risposta dal server siano utilizzati dal browser per riempire particolari campi della form stessa che sarà reindirizzata in maniera tale da poterli aggiornare in relazione all’evoluzione della compilazione. Per permettere di inviare una form a più processi, utilizzando differenti metodi di codifica del contenuto o di effettuare, in base ai dati inseriti, degli update della struttura e del contenuto dei controlli della form visualizzata; è possibile specificare i seguenti attributi (relativi alle modalità di spedizione dei dati collezionati) all’interno dell’elemento <input type=”submit”>: action, method, enctype, replace e target. Tali attributi, se presenti, sovrascrivono i valori specificati dagli stessi attributi dell’elemento form, definendo le modalità di codifica dei dati, il metodo di spedizione degli stessi, l’indirizzo al quale devono essere spedite le informazioni raccolte, etc. In Web Forms 2.0 è prevista, oltre a quanto è stato descritto, anche la possibilità di gestire con facilità, adoperando una sintassi dichiarativa senza fare più ricorso a complicati script lato client, le strutture di ripetizione. Nelle form, infatti, ci si trova spesso a dover gestire informazioni che si ripetono più volte per ciò che concerne la loro struttura. Si pensi, ad esempio, ad una lista di articoli da ordinare della quale non si sa a priori la lunghezza e per la quale ogni articolo presenta l’indicazione di più campi informativi, come il nome, il costo unitario, la quantità, etc. Tali situazioni in Web Forms 2.0 si possono gestire anche adoperando solo strutture dichiarative, senza dover necessariamente fare ricorso allo scripting. Viene introdotto il concetto di template, ovvero di modello da replicare più volte per gestire le esigenze di ripetizione della stessa struttura di controlli all’interno di una form. Per tale motivo viene di solito scelto un particolare elemento, tra i vari che fanno parte della sintassi dell’HTML o dell’XHTML, contenente la struttura di controlli da ripetere. Tale elemento viene caratterizzato per mezzo dell’aggiunta dell’attributo template=“repeat” e di un particolare ID (si potrebbe scegliere la riga di una tabella, ad esempio, quale elemento da ripetere più volte). Ogni volta che si aumenta il numero di ripetizioni, si inserisce nella form una struttura di controlli analoga a quella precedente. E’ prevista la possibilità di differenziare ogni ripetizione di un template all’interno di una form per poterla riferire in seguito, grazie all’assegnazione di un ID univoco. Ogni volta che la struttura di ripetizione dei controlli si espande, al nuovo gruppo di controlli viene assegnato un identificatore univoco che è possibile includere nell’ID di ogni singolo controllo del gruppo stesso. In tale maniera si riesce ad assegnare comunque e indipendentemente dal numero di volte che viene ripetuta una certa struttura di controllo, un ID unico ad ogni controllo, rispettando quindi il vincolo di unicità degli ID all’interno di un documento HTML e permettendo di poter facilmente riferire le varie parti della struttura di ripetizione. La gestione di tali strutture è trattata completamente dal browser senza ricorsi a script lato client o pesanti spedizioni della form stessa al server per far sì che la si estenda opportunamente. Per rendere più agevole l’aggiunta, l’eliminazione o l’organizzazione delle varie righe di una struttura di ripetizione, in Web Forms 2.0 sono stati previsti quattro nuovi tipi di controllo; questi possono essere inseriti all’interno di una form per mezzo degli elementi <button> o <input> dei quali viene specificato, usando l’attributo “type”, il comportamento. L’attributo type può assumere quattro valori: - add : aggiungere una riga alla struttura di ripetizione; - remove : rimuovere una riga dalla struttura di ripetizione; - move-up: spostare di una posizione più sù la riga selezionata; - move-down: spostare di una posizione più giù la riga selezionata. Tali controlli sono visualizzati come dei bottoni; tramite l’attributo “value” è possibile specificare il testo da associre ad ogni bottone. Questi possono essere inclusi, solamente per ciò che riguardi remove, move-up e move-down, nella struttura di controlli che si ripete, ovvero nel template oppure è possibile che siano inseriti all’interno del body del documento HTML nella posizione che si ritiene opportuna. E’ infine possibile gestire ripetizioni annidate e specificare il minimo e il massimo numero di ripetizioni del template che possono essere effettuate nella form (attributi “repeat-min” e “repeat-max” dell’elemento che definisce il template). Con Web-Forms 2.0 vengono anche estesi gli eventi che possono essere scatenati durante l’elaborazione di una form. In particolare l’evento “change” viene attivato non appena un controllo è deselezionato ed ha cambiato valore e, nel caso di controlli implementati per mezzo di elementi grafici interattivi dal browser (menù di pop-up con calendario per scegliere una data). Tale evento è scatenato ogni volta che viene modificato il contenuto di un controllo anche se questo non perde il focus3. Contrariamente all’evento “change”, generato dal cambiamento del valore di un controllo e dalla sua deselezione, per trattare dei casi in cui vi è la necessità di un feed-back più veloce, viene introdotto l’evento “input” scatenato ogni volta che viene modificato il valore di un controllo anche se questo non è stato ancora deselezioanto. Tale evento è catturato, come l’evento “change”, solo dal controllo che viene modificato. Molto spesso accade che i controlli delle form sono interdipendenti e di conseguenza in Web Forms 2.0 viene introdotta la possibilità di specificare tramite degli script, per ogni singolo controllo, i valori e gli attributi che dipendono da valori e attributi di altri controlli, invece di indicare per ogni controllo quali cambiamenti devono essere apportati sugli altri quando il controllo stesso viene modificato, come avviene in HTML. Per fare in modo che le modifiche subite da un controllo vengano notificate anche agli altri controlli di una form, il cui valore dipende da quello del controllo che è stato modificato, parallelamente agli eventi “input” e “change” vengono generati anche gli eventi “form input” e “from change”. Al cambiamento del valore di un controllo, parallelamente all’attivazione degli eventi “change” e “input”, gli eventi “form change” e “from input” vengono propagati a tutti gli altri controlli della form e infine al controllo stesso che è stato modificato. Solo i controlli di tipo output non scatenano tali eventi, i quali vengono inviati verso tutti i controlli anche al caricamento iniziale di una form. 3 Equivale a dire che il controllo non viene deselezionato. In tale maniera è possibile definire, per ogni controllo, degli event handler i quali effettuano i cambiamenti opportuni al controllo stesso, in relazione alle modifiche subite da altri controlli correlati e notificate dagli eventi “form change” e “form input”; tali gestori di eventi modificano opportunamente le caratteristiche del controllo a cui sono connessi se l’evento che intercettano è stato scatenato da un controllo ad esso correlato. Al momento della verifica della validità dei dati di una form i vari controlli successful4 vengono analizzati; in caso di mancata validazione l’evento “invalid” viene generato e inviato a tutti i controlli. Tale nuovo evento, gestito da un opportuno event handler (”oninvalid”) relativamente ad ogni controllo, può modificare i valori di altri controlli facendoli divenire validi o inavalidi. Dopo la generazione dell’evento “invalid” verrà verificata la validità solo dei controlli non ancora validati mentre, se un controllo già validato viene fatto divenire non più valido a causa delle azioni dell’event handler, i dati contenuti verranno spediti lo stesso, anche se scorretti. E’ quindi necessario porre la dovuta cautela nel gestire tale tipo di situazioni. Le specifiche Web Forms 2.0 modificano leggermente le azioni da compiere anche relativamente all’invio dei dati contenuti in una form. Al momento dell’invio delle informazioni raccolte tramite una form la prima operazione eseguita è il controllo di validità dei dati inseriti; se tale controllo, correlato alla gestione degli eventi “invalid”, va a buon fine vengono identificati, con particolare attenzione alle strutture di ripetizione, tutti i controlli, sia successful che non, facenti parte della form. Viene dunque costruito un form data set comprendente tutti i dati dei controlli successful. Il form data set è formato da gruppi consecutivi di tre dati per ogni controllo: nome, indice e valore del controllo. Tutti i controlli, ad eccezione del select e del file upload, presentano un solo valore; se due controlli hanno lo stesso nome vengono contrassegnati con diversi numeri di indice. I controlli file upload e select possono avere più di un valore o anche nessun valore; con valori multipli si ripetono il nome e l’indice del controllo tante volte quanti sono i valori immessi assegnando ogni volta uno dei valori. A tal punto la form viene codificata secondo quanto indicato dall’attributo “enctype” e dall’attributo “method”. I tipi di codifiche possibili, definiti dai valori di “enctype”, sono analizzati nel seguito. La codifica “application/x-www-form-urlencoded”, simile a quella definita nelle specifiche HTML, interpreta la form secondo il charset specificato per mezzo dell’attributo “accept-charset” dell’elemento <form>. Nel form data set viene inserito forzatamente l’attributo di nome “charset”, contenente quale valore il set di caratteri 4 Un controllo è detto successful quando è in uno stato tale da poter produrre delle informazioni da inviare come dati della form. utilizzato per codificare la form. Viene quindi creata una lista di coppie nome/valore; ogni nome è connesso al proprio valore dal carattere “=” e ogni coppia è separata dalla successiva dal carattere “?”. I caratteri di spaziatura sono rimpiazzati dal simbolo “+” e i caratteri non alfanumerici dal simbolo “%”, seguito dalla codifica ASCII, su due cifre esadecimali, del byte che rappresenta tale carattere. Come già accennato, nelle specifiche Web Forms è possibile inviare, utilizzando la codifica “application/x-www-form-xml”, i dati raccolti tramite una form, per mezzo di un documento HTML appositamente strutturato. Tale documento include tutti i dati immessi nella form e ha, quale root element, l’elemeneto <submission>. Per ogni struttura di ripetizione viene inserito un elemento <repeat> con l’attributo “template” uguale all’ID del template e con l’attributo “index” ad indicare il numero di indice del blocco di ripetizione. Per ogni controllo valido e successful viene inserito un elemento <field>, figlio dell’elemento <submission>, con il nome del controllo quale valore dell’attributo “name” e l’indice del controllo quale valore dell’attributo “index”; tale elemento contiene il valore del controllo che riferisce. Per ciò che riguarda l’upload dei file viene inserito un elemento <field> il quale presenta, oltre agli attributi “name” e “index”, anche gli attributi “filename” (avente come valore il nome del file) e “type” (avente come valore il tipo MIME del file). Il contenuto dell’elemento field è in tal caso il file stesso in codifica base64, libero da caratteri di spaziatura. Degli spazi bianchi possono essere aggiunti per rendere più leggibile il file XML inviato, ma verranno ignorati tutti durante la ricezione del file stesso. Un terzo metodo di codifica dei dati è il “text/plain” simile al metodo “application/x-www-urlencoded” ad eccezione del fatto che le coppie nome/valore non sono separate dal carattere “?”, ma dal carattere di nuova riga (newline). Infine, un quarto ed ultimo metodo di codifica dei dati di una form è il “multipart/form-data” che è adatto per inviare grandi quantità di caratteri non ASCII o dati binari (form che includono uno o più file). Tale metodo di codifica è definito nelle specifiche HTML 4.01 e non viene modificato nel Web Form 2.0 working draft. Nel caso di uso del protocollo HTTP per inviare i dati reperiti tramite una form, i tipi di metodi5 che sono consentiti sono: GET, PUT, POST e DELETE; di default è usato il metodo GET. A seconda delle situazioni e quindi del tipo di protocollo per il trasferimento di dati utilizzato (mailto, file, data, ftp, etc.) è conveniente utilizzare l’uno o l’altro di tali metodi. Un’altra caratteristica interessante che viene aggiunta nelle specifiche Web Forms 2.0 alle form HTML, consiste nel poter caricare i dati con cui riempire i campi 5 Tali metodi vengono specificati tramite l’attributo “method” dell’elemento form o dell’elemento che rappresenta il bottone per l’invio della form stessa. di una form da una sorgente esterna. Ciò è utile sia per prepopolare i campi di una form con valori di default prelevati da un file, che per definire, caricandole da una sorgente esterna, le opzioni di menù di vario tipo (elementi <select> e <datalist>). E’ possibile quindi caricare in una selection list delle opzioni da un documento XML esterno strutturato nella seguente maniera: il root element deve essere un elemento <select> con una lista di opzioni specificate al suo interno. Tali opzioni vengono aggiunte a quelle già esistenti nella selection list o le rimpiazzano, in relazione alla presenza dell’attributo type=“incremental” nell’elemento <select> del file XML da cui si vogliono caricare le opzioni. Quanto detto vale anche per l’elemento <datalist>. Entrambi gli elementi <select> e <datalist> devono indicare per mezzo del valore dell’attributo “data” l’URI del file XML da cui caricare le opzioni che devono essere mostrate; a tale file deve essere associato il MIME type “application/xml” essendo un documento XML a tutti gli effetti. Vi è la possibilità di prepopolare i campi di una form con dati ricavati da un documento XML esterno. Per fare ciò si deve indicare come valore dell’attributo “data” dell’elemento form, l’URI di un documento XML opportunamente strutturato. Il root element di tale documento deve essere un elemento <formdata>. Se esso non presenta l’attributo type=“incremental” la form deve essre resettata al suo stato iniziale prima di essere prepopolata con i dati ricavati dal file XML in questione. Quali figli dell’elemento <formdata> vi sono gli elementi <repeat> strutturati per riempire, con valori iniziali definiti, delle strutture di ripetizione, oppure gli elementi <field> che permettono di inizializzare con opportuni valori i vari controlli della form originale, identificati per mezzo del nome e dell’indice. Per supportare, anche a livello di script, tali modifiche ed aggiunte, definite per le form HTML nel working draft Web Forms 2.0, è necessario estendere opportunamente l’interfaccia DOM. Ciò è ottenuto per mezzo di opportune aggiunte di metodi e di nuovi campi definiti per gestire le form. Ad esempio, a tutti gli oggetti che definiscono i controllli di una form, è stato aggiunto l’attributo “successful” che indica se il controllo in questione può produrre informazioni da poter inviare come dati delle form; solo i controllli successful infatti contribuiscono a determinare i dati della form che verranno spediti. Ai vari oggetti è stato aggiunto anche l’attributo “valid” ad indicare con un determinato valore numerico se il controllo è o non è valido e, se non lo è, la causa della mancata validità. Sono definiti nuovi metodi ed oggetti per interfacciarsi facilmente ed interagire per mezzo di script con le strutture di ripetizione. Per concludere tale carrellata delle principali caratteristiche di Web Forms 2.0, resta da mettere in evidenza come il WHATWG abbia intenzione di impegnarsi a definire anche un linguaggio avanzato per lo styling dei controlli delle form. In attesa di sviluppare tale linguaggio per una gestione più agevole dello stile delle form Web Forms 2.0, è possibile utilizzare le pseudoclassi6 definite appositamente per determinare l’aspetto e l’organizzazione dei vari controlli delle form, nel working draft del World Wide Web Consortium, Cscading Style Sheet 3 User Interface. I controlli Web Forms 2.0 riferiti da ogni pseudoclasse sono indicati nel testo del working draft Web Forms 2.0. Il progetto “Web Forms 2.0” è sostenuto prevalentemente dai produttori dei browser Mozilla e Opera. Tale sforzo è animato dal tentativo di proporre un open standard per le form web che: 1) sia compatibile col passato ed in particolare con le form HTML, tuttora le più diffuse sul web ed implementate nei browser (al fine di poter sfruttare l’esperienza degli autori web maturata in tale campo); 2) possa essere supportato dalla maggioranza dei browser senza l’aggiunta di plug-in (come invece accade per lo standard XForms per il quale è necessaria la presenza sulla piattaforma dell’utente del processore XForms) e possa velocemente diffondersi come uno standard di fatto per le applicazioni web; 3) includa e documenti, standardizzandoli, i molteplici metodi usati attualmente dagli autori web per fronteggiare le problematiche relative all’utilizzo efficace delle form HTML. Facciamo a questo punto alcune considerazioni sugli obiettivi del progetto di Web Forms in relazione ad XFroms. Web Forms 2.0 viene definito come un progetto sostanzialmente indipendente da XForms e mira ad essere largamente supportato dai browser maggiormente utilizzati, al contrario di XForms stesso che è ritenuto attualmente ancora poco implementato nel web. Sostanzialmente si può affermare che Web Forms 2.0 ha tenuto conto di alcune critiche ricevute da XForms, tra cui il mancato supporto diretto dei browser e il maggior grado di complessità delle XForms stesse rispetto alle 6 Una pseudoclasse riferisce un gruppo di elementi caratterizzati dalla condivisione di alcune caratteristiche, determinandone in maniera unitaria le caratteristiche dello stile. vecchie form HTML. Per tali motivi Web Forms 2.0 si è sviluppato tenendo in maggiore considerazione una certa continuità con le form HTML; l’impegno del WHATWG, quindi, è solo quello di sostenere adeguatamente il superamento delle vecchie form. Nelle specifiche Web Form 2.0 è definito anche un metodo per trasformare sistemi server basati su XForms in server che inviano form HTML e Web Forms 2.0. Viene utilizzato un particolare processore detto XForms processor che è in esecuzione sul server e svolge la conversione da XForms a form HTML e Web Forms le quali vengono poi spedite attraverso la rete al client. Ovviamente, alcune caratteristiche distintive di XForms non sono più implementate in Web Forms 2.0: tra queste spicca la separazione della struttura logica della form dalla presentazione o interfaccia utente della stessa; si perde così la forte indipendenza dalla piattaforma che caratterizza invece XForms. Attualmente il gruppo di lavoro del WHATWG che si occupa del progetto Web Forms 2.0 è impegnato nel perfezionare, rilasciando nuove release, il working draft al fine di poter arrivare ad una versione stabile delle specifiche che possa essere standardizzata; sono state elaborate anche alcune demo riguardanti l’uso delle nuove form e delle loro principali caratteristiche, gestite tramite script Perl sul server; tali esempi sono utili a dare un’idea chiara, seppur basilare, delle potenzialità di tale progetto. E’, in conclusione, rilevante evidenziare come, con la definizione delle Web Forms, il WHATWG si sia impegnato in un importante processo di adeguamento delle form HTML alle nuove esigenze di interattività manifestate da utenti e programmatori web, tenendo in considerazione la continuità col passato e le problematiche relative alla compatibilità con le diffuse form HTML. Tale progetto è aperto, pubblico e può risultare un mezzo importante per contrastare la diffusione futura sul web di tecnologie di comunicazione proprietarie, verso le quali differenti industrie informatiche, tra cui la Microsoft, stanno prevedendo di dirigere la propria utenza. Le web form: soluzioni proprietarie Con la grande crescita degli interessi economici che gravitano intorno alla definizione di una soluzione tanto potente quanto ampiamente diffusa di sistemi per la collezione e l'elaborazione tramite web di dati, spesso strettamente connessi a processi di business, molte aziende collocate nel settore informatico hanno proposto soluzioni proprietarie. Nel seguito vengono brevemente illustrate le tre più importanti proposte di software e metodologie per la gestione dei moduli elettronici sul web sviluppate dalla Microsoft, dalla Adobe e dalla Macromedia. Microsoft Le pagine Web Form e la tecnologia ASP.NET La Microsoft[36] permette di gestire le richieste di dati in input da parte degli utenti remoti delle applicazioni web sviluppate appoggiandosi alla tecnologia ASP.NET[44], per mezzo delle pagine Web Form. ASP.NET è il framework di programmazione della Microsoft, eseguito su server web “Microsoft Server”, utilizzato per creare e gestire in modo dinamico le pagine web, adoperando, per la loro definizione, sintassi HTML mischiata a sintassi ASP; quest’ultima viene utilizzata per poter determinare dinamicamente, tramite elaborazioni eseguite sul server, parti della pagina web, al momento della richiesta da parte del client. ASP.NET si basa sul framework .NET sviluppato sempre dalla Microsoft; quest'ultimo consiste in un insieme di tecnologie tra di loro strettamente integrate per permettere e supportare adeguatamente la realizzazione di servizi di connettività tra persone, sistemi informativi e dispositivi. Il framework .NET[42] supporta vari linguaggi di programmazione tra cui Microsoft Visual Basic, Visual C# e JScript .NET; di conseguenza gli sviluppatori di applicazioni web ASP.NET possono scegliere di utilizzare per le proprie applicazioni, uno qualsiasi tra i differenti linguaggi di programmazione consentiti. Per mezzo delle pagine Web Form è possibile definire quindi l'interfaccia utente e le caratteristiche di interattività delle applicazioni web ASP.NET. Tali pagine web permettono di effettuare lato server la gestione delle form HTML di solito utilizzate per definire l'interfaccia con i client. Esse sono una combinazione di sintassi HTML e controlli per le form messi a disposizione dal framework ASP.NET. ASP.NET infatti definisce una serie di oggetti detti form controls che possono essere inseriti nelle pagine ASP per mezzo di sintassi dichiarativa assieme ai tradizionali tag HTML; ognuno di questi oggetti determina un particolare campo di immissione dati che sarà presente all'interno della pagina web inviata al client. Al momento della richiesta da parte di un utente di una pagina Web Form, sul server verrà processata la pagina ASP e saranno istanziati gli opportuni oggetti necessari a gestire l'input richiesto all'utente. Ognuno di questi oggetti (form controls) genererà automaticamente la propria rappresentazione in HTML e di conseguenza al browser verrà inviato una pagina web contenente solamente sintassi HTML. Per gestire la maggior parte delle operazioni che l'utente può effettuare su una form vengono utilizzate delle elaborazioni lato server e di conseguenza l'intera form viene spedita al server il quale effettua le opportune modifiche e la invia nuovamente al client, magari per permettere di ultimarne la compilazione. Tutti i form controls ASP sono associabili a degli script che vengono eseguiti lato server e di conseguenza non inclusi tra i dati inviati al client assieme alla form HTML; essi possono essere definiti utilizzando un qualsiasi linguaggio di programmazione supportato dal framework .NET. Per i form controls è possibile definire, analogamente alla gestione degli eventi delle form HTML, dei gestori di eventi i quali non sono niente altro che script server, che si occupano di trattare opportuni eventi lato server. Quindi nel caso in cui il client effettua delle azioni sulla form che scatenano uno degli eventi gestiti lato server e definiti dal progettista della pagina Web Form, l'intera form viene spedita al server il quale esegue l' event handler opportuno e ritorna la form adeguatamente modificata al client per proseguire nella compilazione. I form controls che possono essere inclusi nelle pagine ASP sono molto più vari e ricchi di quelli che sono messi a disposizione dalle form HTML e capaci di essere inclusi nelle pagine web destinate all'utente finale in maniera compatibile con il browser web dell'utente stesso. Spesso per gestire opportunamente la corrispondenza dei form controls con i controlli delle form HTML vengono affiancati a questi ultimi anche degli script da eseguire lato client. Con tale metodologia di programmazione lo sviluppatore web ha la possibilità di programmare la gestione della form e più in generale delle pagine web come se tutte le operazioni si svolgessero localmente sul server; sarà poi il framework ASP .NET a permettere di sfruttare le funzionalità implementate, da siti remoti adoperando un web browser. Info Path Un' altra novità introdotta abbastanza recentemente dalla Microsoft per la raccolta e la gestione di dati in rete tramite form, è l'applicazione Info Path[43] (inclusa in Office 2003 Professional) che offre soluzioni orientate soprattutto a reti interne all'azienda per agevolare, ad esempio, la gestione del personale, degli inventari e di attività analoghe. Info Path è integrato nel pacchetto Office e offre la possibilità di scambiare informazioni attraverso documenti XML e raccolte grazie a moduli elettronici; la definizione delle form e la loro connessione ai documenti XML strutturati per contenere i dati reperiti dall'utente risultano essere molto semplici e guidati da interfacce utente WYSIWYG7. Info Path permette oltretutto l'impiego deIl'XMLSchema per una gestione ottimale dei documenti XML stessi. Con Info Path la Microsoft ha immesso sul mercato un valido tool per la gestione di contenuti di varia tipologia, basata sullo standard XML, in previsione anche della vastissima diffusione dell'uso di questo formato per la definizione di documenti elettronici e del grosso giro di interessi economici correlato. E' importante infine notare come, con l'introduzione di Info Path, la Microsoft ha sostanzialmente ignorato lo standard XForms, sviluppato dal WorId Wide Web Consortium proprio per la gestione delle form elettroniche, che permette l'immissione dei dati e la loro memorizzazione in documenti XML appositamente organizzati. Adobe Adobe Form Designer 6.0 Form Designer[57] è un tool sviluppato dalla Adobe[56], azienda leader mondiale nel campo della gestione e dello scambio dei documenti elettronici, con l’intento di creare dei moduli elettronici per la raccolta di dati da utenti remoti in maniera semplice e ricca di possibilità, così da accelerare e semplificare l’acquisizione e la circolazione di informazioni in rete. Un'interfaccia molto completa permette di sviluppare le form definendone il layout e le funzionalità in maniera intuitiva ed immediata e di connettere con facilità le applicazioni web che sono 7 Sta per What You See Is What What You Get; in tale contesto indica la possibilità di definire dei moduli elettronici intervenendo drettamente sulla renderizzazione del modulo stesso così come apparirà all’utente finale e strutturandola opportunamente; viene dunque sfruttata la possibilità di vedere visualizzati istantaneamente i risultati delle modifiche effettuate. deputate a trattare i dati raccolti. E' implementato il supporto dell'XML per la gestione e lo scambio dei documenti elettronici, ad esempio con programmi separati, che si occupano di trattare opportunamente le informazioni raccolte. Form Designer supporta JavaScript e permette di modellare dinamicamente il contenuto delle form. Gli utenti ovviamente non hanno bisogno di possedere Form Designer per compilare le form in rete; a seconda del tipo di utilizzo previsto da chi ha creato il modulo, l'utente potrà compilarlo o unicamente con il proprio web browser o adoperando Adobe Acrobat Reader, software scaricabile liberamente da Internet. I dati reperiti tramite le form possono essere scambiati nel noto formato Portable Document Format (.pdf). Macromedia Macromedia Flash MX: le Form Flash MX[60] è un tool di Macromedia[59] per lo sviluppo di contenuti dinamici e interattivi per applicazioni web, caratterizzati da effetti grafici di grande impatto ed estremamente vari. I possibili impieghi di Flash MX sono molteplici: possono essere create animazioni, grafica avanzata, elementi interattivi di differenti tipologie, etc. E’ possibile distribuire tali contenuti in rete per arricchire le interfacce utente delle applicazioni web, visualizzandoli e gestendoli opportunamente lato client per mezzo di Flash Player, il software di renderizzazione di file prodotti adoperando Flah MX, distribuito gratuitamente su Internet, disponibile per le più diffuse piattaforme e ampiamente diffuso. I contenuti web realizzati con Flash MX possono essere inseriti facilmente all’interno delle pagine HTML e visualizzati appoggiandosi al Flash Player che in tal caso funge da plug-in del web browser adoperato. E’ ovviamente anche possibile visualizzare i file Flash MX separatamente rispetto all’accesso ad altri documenti elettronici, utilizzando unicamente il Player. Flash MX include anche un proprio linguaggio di scripting, ActionScript, per vari aspetti molto simile a JavaSscript, utilizzato per supportare lo sviluppo di contenuti interattivi. Adoperando Flash MX, si possono definire in maniera semplice e immediata dei moduli elettronici utilizzabili all’interno delle applicazioni web per la raccolta di informazioni dagli utenti. Le funzionalità delle form create adoperando Flash sono simili a quelle delle form HTML, ma gli sviluppatori che utilizzano tale tool della Macromedia possono sfruttare le notevoli potenzialità grafiche e di gestione del layout disponibili, ben più ricche di quelle messe a disposizione dall’HTML. I controlli che possono essere inseriti nelle form Flash sono i seguent: button, radio button, file field, hidden field, text field, checkbox, menù/list, image field e jump menù. E’ possibile posizionare i vari controlli all’interno della form in maniera molto immediata grazie al supporto di un’interfaccia grafica WYSIWYG. Ad ogni controllo, durante la creazione di una form, viene associato un nome. Per mezzo di un ActionScript, la cui esecuzione viene di solito associata ad un determinato evento quale la pressione di un bottone della form, vengono infine definite le modalità di spedizione dei dati collezionati attraverso il modulo elettronico. In tale maniera viene determinato l’URL a cui inviare le informazioni raccolte tramite i controlli della form e il metodo del protocollo HTTP da adoperare (GET o POST). Le codifiche possibili per i dati spediti sono quelle definite nelle specifiche delle form HTML. All’interno dello script è inoltre possibile assegnare dei nomi particolari a ogni dato acquisito tramite il modulo elettronico per poi determinare così le coppie nome/valore da inviare in rete. La form così creata verrà renderizzata all’utente dell’applicazione web che la include, per mezzo del Flash Player; quest’ultimo si occuperà dell’invio dei dati acquisiti al server. Quindi la gestione del modulo elettronico, spedito all’utene tramite un file Flash, e l’invio dei dati, vengono svolti interamente sul client appoggiandosi al Flah Player. E’ importante, per concludere, notare che le form Flash offrono anche varie possibilità di validazione dei dati immessi dall’utente. Apache Cocoon e il framework Cocoon Forms Cocoon Forms[25] è un framework per la gestione dell’acquisizione di dati da un utente di un’applicazione web tramite form; è stato ideato per fornire agli sviluppatori di applicazioni web che si appoggiano sulla servlet Cocoon[22] la possibilità di definire e controllare le modalità con cui gli utenti inviano dati in input all’applicazione stessa. Cocoon è un framework per il supporto dello sviluppo di applicazioni web moderno e innovativo, poiché basato fortemente sulla gestione dei dati per mezzo di documenti elettronici nel formato XML, riconosciuto come la “lingua franca” del web, attualmente in rapida diffusione. Per comprendere appieno le potenzialità del framework Cocoon Forms è necessario possedere una buona conoscenza delle caratteristiche principali di Cocoon e delle modalità di controllo dell’evoluzione delle operazioni effettuate da un’applicazione web per mezzo del meccanismo del control flow[24]. Apache Cocoon Cocoon è una servlet che implementa un complesso framework per supportare la definizione di applicazioni web; è stato sviluppato nell’ambito della fondazione per la produzione di software open-source Apache. Il concetto che sta alla base del framework Cocoon è lo sviluppo di applicazioni web basate sull’integrazione di singole componenti ognuna delle quali esegue un compito specifico. In tale maniera risulta essere facile effettuare elaborazioni tanto complesse quanto estremamente diversificate, gestendole modularmente attraverso una serie di semplici operazioni. Cocoon si basa fortemente sull’XML, quindi tutti i dati che processa e tutti i file di definizione delle proprie funzionalità e delle azioni che deve compiere sono dei documenti XML. Cocoon è stato sviluppato attorno alla nozione di pipeline[23] (letteralmente conduttura). Ogni applicazione web sviluppata utilizzando Cocoon è sostanzialmente composta da un certo numero di pipelines ognuna delle quali è riferita ad un URL e corrisponde ad un determinato pattern. All’interno di ogni pipeline viene definita una catena di elaborazioni da effettuare ogni volta che la pipeline stessa viene invocata (ad esempio da un client effettuando una richiesta indirizzata al particolare URL corrispondente). All’interno di ogni pipeline è indicata una sequenza di componenti che all’attivazione della pipeline stessa eseguono elaborazioni particolari in successione. Vi sono tre grandi categorie di componenti disponibili in Cocoon ovvero i generator, i transformer ed i serializer. Ogni pipeline è di solito composta dalla sequenza di un generator, uno o più transformer ed un serializer. Il generator è il componente Cocoon che avvia le elaborazioni effettuate da una pipeline; sostanzialmente esso si interfaccia con una determinata risorsa (che può essere ad esempio un file XML, un database, un file di testo o anche un filesystem) e produce un documento XML seguendo un vocabolario ben determinato, contenente i dati reperiti accedendo alla risorsa stessa. Esistono differenti tipi di generator specifici a seconda delle informazioni che si vogliono ottenere e della particolare risorsa con la quale si deve interagire. I dati reperiti attraverso il generator vengono passati in input al componente di Cocoon che segue immediatamente nella pipeline e che nella maggior parte dei casi è un transformer (anche se nulla vieta che sia un serializer; si ricordi che i dati scambiati dai componenti di Cocoon non sono altro che documenti XML). I transformer sostanzialmente effettuano delle particolari elaborazioni sul documento XML che ricevono in input producendo come risultato in output un nuovo documento XML. Tale documento XML a sua volta costituirà l’input del componente Cocoon che segue immediatamente all’interno della pipeline. Esistono molti tipi di transformer a seconda delle elaborazioni che si devono effettuare. Tra questi sono largamente usati i transformer XSLT che riferiscono uno stylesheet XSLT per mezzo del quale vengono specificate le regole per trasformare il documento XML ricevuto in input. Vi sono anche dei transformer che si interfacciano con un database per effettuare delle query specificate opportunamente nel documento XML di input includendo i risultati nell’output, o ancora altri transformer che includono nell’output parti di documenti XML esterni. Infine la terza classe di componenti di Cocoon è composta dai serializer. Come indica il nome stesso, questi serializzano, ovvero trasformano in un flusso di dati binari o in una successione di caratteri, il contenuto del documento XML che ricevono in input al fine di poterlo spedire in rete al client che ne aveva effettuato la richiesta. In relazione alle modalità di serializzazione dell’output esistono molti tipi di serializer tra cui vi sono l’XML, l’HTML ed il text serializer. Sono dunque evidenti le potenzialità che offre Cocoon attraverso l’uso delle pipeline, permettendo, grazie anche all’elevato numero di componenti (generator, transformer e serializer) implementati, di comporre sequenze di elaborazioni per compiere operazioni anche molto complesse. Ogni componente Cocoon è implementato attraverso una o più classi Java. E’ possibile utilizzare uno tra i vari componenti predefiniti o, in relazione a particolari esigenze, implementarne di propri. All’interno di Cocoon sono presenti differenti file XML di configurazione del framework e di definizione delle applicazioni web e della struttura di siti web sviluppati basandosi su tale servlet. Tra tali file ha una notevole importanza la sitemap (file di nome sitemap.xmap). Attraverso una o più sitemap vengono definiti i seguenti aspetti (utilizzando sempre una sintassi dichiarativa XML, semplice ed abbastanza intuitiva): • I componenti di Cocoon tra cui i generator, i transformer ed i serializer specificando per ognuno vari parametri tra cui il nome che lo identifica e la classe Java che lo implementa (oltre a quelli già elencati, Cocoon offre altri componenti per effettuare operazioni di vario tipo e complessità) • Le pipeline implementate in Cocoon. Ognuna di queste corrisponde ad un determinato pattern ed è messa in moto in risposta ad una richiesta indirizzata ad un certo URI locale da parte del client; tale URI è detto virtualURI poiché ad esso non corrisponde uno specifico file sul server da inviare quale risposta al client. Il virtualURI è utilizzato invece per selezionare una specifica pipeline che tramite una sequenza di operazioni definite dalla catena di componenti di cui è composta, effettua le azioni richieste dal client e produce una adeguata risposta per il client stesso. Per chiarire meglio quanto detto fino ad ora si esamini il seguente spezzone di documento XML tratto dalla sitemap di Cocoon: <map:pipeline> ... <map:match pattern=”elenco-libri”> <map:generate type=”xml” src=”libri.xnl”/> <map:transform type=”xslt” src=”ricava_elenco.xsl”/> <map:serializa type=”xml”/> </map:match> ... </map:pipeline> Supponiamo che un utente (client) tramite il proprio browser web si colleghi in rete al server “mioserver” sul quale è in esecuzione Cocoon, che ascolta le richieste dei client sulla porta numero 8888 (porta di default). L’utente effettua una richiesta al seguente URL per ottenere l’elenco dei libri disponibili dal sito web di una biblioteca: http://www.mioserver.it:8888/elenco-libri Tale richiesta è indirizzata a Cocoon il quale estrapola dall’URL la parte relativa al percorso locale (“elenco-libri”) e controlla se vi è qualche pipeline che gestisce tale virtualURI. Nella sitemap viene individuata tra le pipeline presenti (identificate e delimitate dall’elemento <map:match>) quella corrispondente al virtualURI specificato nella richiesta del client. Ogni pipeline è associata ad un virtualURI (o ad un cero gruppo di URI virtuali) per mezzo di quanto specificato dal valore dell’attributo “pattern” dell’elemento <map:match>. In tal caso si avviano le elaborazioni della pipeline definita dall’elemento <map:match pattern=”elenco-libri”>…..</map:match>. Un generator di tipo XML legge il file XML individuato dal percorso espresso quale valore dell’attributo “src” dell’elemento <map:generate>. Tale file XML viene passato in ingresso ad un trasformer che lo elabora ed effettua una trasformazione XSLT secondo le regole definite dal foglio di stile ricava_elenco.xsl (valore dell’attributo “src” dell’elemento <map:transform>). Tramite questo foglio di stile vengono estratti dal documento XML (libri.xml) ricevuto dal generator in input e contenente informazioni dettagliate circa tutti i libri disponibili, solamente i titoli dei libri. Questo ultimo documento XML prodotto dalle azioni del transformer XSLT verrà passato in input al serializer che formatterà le informazioni secondo il formato HTML in maniera da poterle spedire in risposta la client; sul client le informazioni stesse potranno essere agevolmente visualizzate tramite un browser web. Tale esempio, anche se molto elementare, è utile ad intuire le grandi potenzialità offerte da Cocoon nel supportare lo sviluppo di applicazioni web. Si pensi alla possibilità di formare un complesso set di di pipeline che si interfacciano con svariate risorse persenti sul server e non solo su richiesta del client. Grazie alla flessibilità ed alla forte strutturazione logica che caratterizzano i documenti XML che contengono le informazioni, tali pipeline oltretutto potrebbero permettere di interagire con differenti piattaforme e di utilizzare per l’output il formato più adatto per l’utente finale. Cocoon: il control flow Le elaborazioni che caratterizzano la maggior parte delle applicazioni web sono contraddistinte dal ripetersi di richieste da parte del client alle quali corrispondono particolari azioni effettuate dal server e dati spediti in risposta. Molte volte durante le interazioni tra client e server è necessario che il server mantenga e possa dunque controllare lo stato di avanzamento globale dell’applicazione, determinando così le successive pagine da visualizzare ed i loro contenuti. Per poter trattare tali situazioni in maniera semplice, Cocoon implementa il concetto di control flow. In Cocoon è possibile definire per mezzo di funzioni Javascript dei flowscript[24], ovvero delle righe di codice Javascript, grazie alle quali si può controllare l’evoluzione di una connessione del client col server. All’interno di tale connessione sarà possibile, in tale maniera, la gestione di elaborazioni complesse che interessano la visualizzazione di più pagine o dati tra loro correlati e il cui avanzamento deve essere controllato in base alle informazioni particolari che l’utente invia. Ciò si ottiene definendo un virtualURI che identifica nella sitemap una pipeline per mezzo della quale si invoca un flowscript (attraverso un virtualURI viene invocata quindi una particolare funzione Javascript utile a gestire l’avanzamento delle operazioni da effettuare nell’ambito della specifica connessione con il server). Ogni volta che è necessario spedire una pagina o altri dati in risposta al client e magari attendere l’arrivo di ulteriori informazioni inviate dal client stesso, l’esecuzione del codice della funzione Javascript si blocca invocando una particolare funzione, al punto raggiunto e lo stato di avanzamento delle elaborazioni dello script viene salvato in un oggetto detto ‘continuazione’. Al momento opportuno, quando si è nuovamente nelle condizioni di riprendere l’esecuzione delle azioni definite all’interno dello script, magari poiché il client ha inviato i dati attesi, sarà possibile proseguire nelle elaborazioni esattamente dal punto in cui erano state sospese recuperando dal particolare oggetto-continuazione i valori di variabili locali, della pila e del contatore di programma precedentemente memorizzati al momento della sospensione del flowscript. Ogni oggetto-continuazione che si usa in Cocoon è salvato all’interno di una tabella hash globale ed identificato tramite un numero il quale viene di solito inviato all’utente assieme ad altri dati alla sospensione del flowscript; nel momento in cui l’utente risponde, all’interno dell’URL virtuale che indirizza viene incluso tale numero identificatore dell’oggetto-continuazione che verrà così recuperato per poter proseguire nelle elaborazioni del flowscript precedentemente interrotte. Grazie a ciò è possibile definire in maniera relativamente semplice, utilizzando procedimenti simili a quelli caratteristici della programmazione procedurale, l’evolversi di complicate interazioni tra client e server appoggiandosi anche agli oggetti definiti nel Flowscript Object Model (FOM)[24] appositamente pensati per un loro utilizzo all’interno dei flowscript. Inoltre è possibile usare anche le numerose tipologie di oggetti disponibili e reperibili nelle API di Cocoon. Tra gli oggetti di sistema definiti nel FOM vi è l’oggetto ‘cocoon’ che rappresenta la sitemap correntemente utilizzata e permette di accedere alle seguenti proprietà: request, response, session, context, log e parameters, ognuna delle quali mette a disposizione ulteriori proprietà e funzioni. Nel seguito vengono analizzati alcuni esempi di funzioni di uso comune messe a disposizione dal FOM: cocoon.sendPageAndWait(“URI”) viene spedita al client la pagina indicata attraverso l’URI parametro della funzione ed il flowscript viene sospeso finchè non si ha una risposta dal client stesso; cocoon.sendPage(“URI”) viene spedita al client la pagina indicata attraverso l’URI (argomento della funzione) e le elaborazioni del flowsript proseguono senza attese; cocoon,redirectTo(“URI”) viene inviata al client una redirezione all’URI specificato quale argomento; cocoon.session.setAttribute( stringa_nome , oggetto_valore) cocoon.session.getAttribute( stringa_nome) cocoon.session.removeAttribute( stringa_nome) tali funzioni servono rispettivamente a settare un attributo di sessione con un determinato nome ed un particolare valore, a richiedere il valore di un attributo di sessione identificato per mezzo del proprio nome e a rimuovere un determinato attributo di sessione. Questi esempi rappresentano solo, a titolo dimostrativo, alcune delle grandi possibilità che si hanno di gestire complesse applicazioni web tramite il meccanismo del control flow, utilizzando oggetti e funzioni del FOM all’interno dei flowscript. Il concetto di flowscript è di fondamentale importanza nel framework Cocoon Forms per gestire le web form utilizzando Cocoon. Per comprendere meglio come viene invocato un flowscript in Cocoon si consideri il seguente esempio. Come prima operazione è necessario definire e memorizzare in un file il flowscript (funzione Javascript); si supponga di salvare il codice seguente nel file ‘control_flow.js’: function flow_script_fun(){ ... var a = cocoon.session.getAttribute(“nome_attr_1”); var b = cocoon.session.getAttribute(“nome_attr_2”); ... if(a = b) cocoon.sendPageAndWait(“pageURI”); ... return; }; Ora è necessario dichiarare il file contenente il flowscript all’interno della sitemap così che Cocoon possa leggerlo ed invocare la funzione definita al suo interno; ciò si ottiene inserendo le seguenti righe nel file ‘sitemap.xmap’: <map:flow language=”javascript”> <map:script src=”control_flow.js”/> </map:flow> Infine si dovrà definire una pipeline che, in seguito ad uno specifico URL selezionato dall’utente, attiverà il control flow richiamerà la funzione che definisce il flowsript (flow_script_fun); per ottenere tale risultato bisogna modificare con la seguente aggiunta il file ‘sitemap.xmap’: <map:match pattern=”virtualURI_control_flow”> <map:call function=” flow_script_fun”/> </map:match> In tale maniera, quando il client invierà una richiesta al seguente URL, verrà attivato il flowscript: http://www.mioserver.it:8888/virtualURI_control_flow Il framework Cocoon Forms Cocoon Forms è un framework per la gestione della raccolta dei dati dell’utente di un’applicazione web tramite form; si basa, nell’interfacciarsi con i client, sull’uso di form HTML ampiamente supportate da tutti i browser web, eseguendo prevalentemente su server le elaborazioni e le operazioni di validazione relative ai dati ottenuti. E’ possibile associare alle form documenti XML (operazione detta binding) sia al fine di inizializzare le form con contenuti di default estratti dai documenti XML stessi, che per memorizzare i dati ottenuti dall’utente utilizzandoli magari in successive elaborazioni. Numerose sono le possibilità offerte per definire controlli sulla validazione dei dati con sintassi dichiarativa (ovvero tramite elementi di markup) anche se è comunque permesso poter specificare degli script per trattare casi specifici e complessi. Oltre a ciò viene anche definito un cospicuo numero di eventi di cui poter specificare le modalità di gestione. Tale soluzione presenta dunque numerose potenzialità per la gestione delle form su web; essa è però specifica per il server web Cocoon ed è strettamente connessa ad altre tecnologie sviluppate nell’ambito del progetto Cocoon, tra cui il flusso di controllo (control flow) per la gestione dell’avanzamento delle elaborazioni per l’esecuzione di una applicazione web o anche le trasformazioni XSLT e le sequenze di azioni definite in Cocoon per mezzo delle pipeline. Cocoon Forms: definizione delle form Per creare e definire parte degli aspetti relativi alla gestione di una form in Cocoon Forms devono essere sostanzialmente editati due documenti XML: • il form model • il form template Il form model è un file che descrive la struttura logica delle form e non contiene alcuna informazione di presentazione (ovvero riguardante le modalità di visualizzazione). Tale documento è detto anche form definition file poiché serve a determinare l’organizzazione del contenuto informativo della form; esso sostanzialmente dichiara un certo numero di widget ovvero di oggetti che conterranno ciascuno dei dati della form o definiranno delle particolari azioni sulla form stessa; tali widget sostanzialmente corrispondono ognuno ad un determinato controllo di quella che sarà la form così come verrà visualizzata all’utente. Per ogni widget specificato nel form definition file è possibile indicare sia i criteri di validazione che le modalità di gestione degli eventi che può attivare. Per ogni widget può essere oltretutto definita anche una stringa per identificarne il contenuto (label), del testo di aiuto per supportarne la compilazione visualizzato nel momento in cui sarà mostrato all’utente il controllo della form associato a tale widget (help) ed un messaggio per l’utente da visualizzare nel caso in cui non vada a buon fine la validazione dei dati trattati dal widget stesso (failmessage). Nel seguito vengono elencati i vari tipi di widget disponibili in Cocoon Forms destinati ciascuno a contenere una particolare tipologia di dati da richiedere all’utente: Nome del widget Field widget Multivalue field widget Boolean field widget Repeater widget Output widget Submit widget Action widget Repeater action widget Row action widget Upload widget Caratteristiche Usato per l’immissione di testo o liste di selezione a scelta singola Gestisce le liste di selezione a scelta multipla Gestisce un singolo valore booleano Utile per definire strutture di ripetizione in cui vengono ripetuti uno o più volte uno o più altri widget Simile al field widget ma non editabile (readonly) Definisce particolari regole da verificare o azioni da compiere in conseguenza dell’invio da parte dell’utente dei dati della form Serve a scatenare una specifica azione lato server riguardante la form Serve ad aggiungere o eliminare righe da un repeater widget Utilizzato all’interno di un repeater widget, serve per effettuare una delle seguenti operazioni relativamente alla riga del repeater a cui appartiene: aggiunta della riga, eliminazione della riga, spostamento in alto o in basso della riga. Utile per inviare al server un determinato file per mezzo della form Il form template serve per definire le modalità di presentazione della form. Esso consiste in un documento XML elaborato utilizzando un qualsiasi linguaggio di markup (in particolare si consideri il caso dell’uso di HTML) all’interno del quale sono inseriti elementi di marcatura specifici di Cocoon Forms utili ad includere la form. Tali elementi definiscono i controlli che deve contenere la form associati ciascuno ad uno specifico widget definito nel form definition file e le stringhe (label) che specificano le modalità di inserimento dei dati per ogni controllo, anche queste ricavabili dal form definition file. In tale maniera risulta possibile organizzare a piacimento la disposizione dei controlli nella pagina web utilizzando i noti elementi di markup HTML. In particolare la form viene inserita nel documento HTML (il form template file) destinato a contenerla per mezzo dell’elemento <form-template>. All’interno di tale elemento vengono posti nell’ordine e con la formattazione desiderata due tipi di nuovi elementi: <widget> identifica la posizione ove inserire il controllo della form associato ad un determinato widget; <widget-label> permette di inserire la stringa di descrizione del contenuto che deve essere immesso dall’utente in un determinato controllo associato ad un particolare widget. Tutti gli elementi del form definition file sono definiti in un namespace al seguente URI: http://apache.org/cocoon/forms/1.0#definition Tutti gli elementi del form template file sono definiti in un namespace al seguente URI: http://apache.org/cocoon/forms/1.0#template Cocoon Forms: binding di un documento XML Si è detto che è possibile con Cocoon Forms prepopolare con valori di default ricavati da un documento XML i vari campi di una form così come si possono salvare i dati ottenuti dall’utente tramite la form in un documento XML. Per ottenere tutto ciò è necessario definire, tramite un ulteriore documento XML, detto form binding file, le regole di corrispondenza fra i widget che compongono la form definiti nel form definition file e le varie parti del documento XML di destinazione, ciascuna destinata a contenere i dati ricavati dall’utente tramite un determinato widget. Tali regole di corrispondenza sono definite sostanzialmente associando ad ogni widget, identificato tramite il proprio id, una espressione XPath che identifica un nodo del documento XML di destinazione prescelto per salvare i dati reperiti tramite il controllo associato al widget stesso (<value id=”id_del_widget” path=”espressione_XPath”>). Tutti gli elementi del form binding file sono definiti in un namespace al seguente URI: http://apache.org/cocoon/forms/1.0#binding Cocoon Forms: flowscript e pipeline per la gestione delle form Per utilizzare il framework Cocoon Forms è necessario controllare l’evoluzione delle operazioni relative ad una form tramite un flowscript. In particolare un flowscript per la gestione di una form deve includere le funzioni definite nel file Javascript “Forms.js”, tramite le quali il flowscript può interagire con il framework Cocoon Forms. Tale file è reperibile tra le risorse disponibili di default in Cocoon. Per comprendere come è strutturato un flowscript per la gestione delle form si veda il seguente esempio: /* carico la classe form per gestire le form in Cocoon */ cocoon.load("resource://org/apache/cocoon/forms/flow/javascrip t/Form.js"); function show_form(){ var form = new Form(“URL_form_definition_file”); var document = loadDocument(“URL_XML_file”); form.createBinding(“URL_form_binding_file”); form.load(document); form.showForm(“URL_pipeline_form”); form.save(document); saveDocument(document,“URL_salvataggio_XML_file”); cocoon.sendPage(“URL_pipeline_pagina_finale”); return; } Come prima operazione all’interno del flowscript definito per mezzo della funzione Javascript show_form() viene creato un nuovo Java Form Object riferito per mezzo della variable di nome “form”, passando al costruttore quale parametro l’URL al quale reperire il form definition file, ovvero il file XML che descrive la struttura della form dichiarando i widget di cui si compone e le loro caratteristiche. Tale oggetto è detto form instance ed è creato sulla base di quanto è specificato nel form definition file correlato. Successivamente viene istanziata una nuova variabile di nome “document” alla quale è assegnato il valore di ritorno della funzione ‘loadDocument(“URL_XML_file”)’. Tale funzione ha quale unico parametro un URL che individua un documento XML il quale viene letto e caricato all’interno di un oggetto Java che ne mappa il contenuto, rappresentandolo attraverso il DOM-tree. Tale oggetto è infine restituito come valore di ritorno assegnandolo alla variabile “document”. In seguito si effettua il binding invocando sul Form Object (di nome “form”) il metodo ‘createBinding(“URL_form_binding_file”)’. Quale argomento viene specificato l’URL ove reperire il documento XML (form binding file) contenente le regole di binding tra i widget della form ed un documento XML esterno (in tal caso quello caricato precedentemente nella variabile “document”). Viene poi prepopolata la form con i dati eventualmente presenti nel documento XML caricato nella variabile di nome “document”, rispettando le regole di binding (metodo ‘load(document)’ del Form Object di nome “form”). Il metodo ‘showForm(“URL_pipeline_form”)’ del Form Object invoca la pipeline di Cocoon che si occupa di inviare al client la form esprimendone la struttura in un linguaggio comprensibile al client stesso (di solito tale linguaggio è l’HTML affiancato dall’uso di alcuni script). Tale funzione continuerà ad inviare nuovamente la form al client, notificando eventuali errori di compilazione, ogni volta che il client invia a Cocoon i dati richiesti tramite la form, finchè gli stessi dati non superano i controlli di validazione definiti, verificati tutti lato server. Una volta che l’utente ha compilato correttamente la form il metodo ‘save(document)’ del Form Object salva i dati reperiti tramite la form nell’oggetto “document” che mappa un documento XML appositamente strutturato per contenerli, rispettando le regole di binding. Viene quindi salvato invocando la funzione ‘saveDocument(document,“URL_salvataggio_XML_file”)’ l’oggetto “document” (primo argomento) nel file XML individuato dall’URL specificato (secondo argomento). Infine tramite la funzione ‘cocoon.sendPage(“URL_pipeline_pagina_finale”)’, metodo dell’oggetto “cocoon” facente parte del Flowscript Object Model, è inviata una pagina di notifica al client ad indicare che la compilazione della form è avvenuta con successo, cosa possibile attivando una specifica pipeline che la genera; dopo di ciò il flowsript termina. Si veda in conclusione come è strutturata la pipeline di Cocoon utilizzata per inviare al client la form; i controlli e la struttura della form devono essere definiti usando un linguaggio di markup comprensibile al client stesso. In particolare Cocoon prevede a tale scopo di definire i moduli elettronici adoperando le form HTML ampiamente supportate dai browser web. Ecco una pipeline che effettua la sequenza di operazioni necessarie ad inviare la form al client: <map:match pattern=”URL_pipeline_form”> <map:generate src=”form_template.xml”/> <map:transform type=”forms”/> <map:transform type=”xslt” src=”forms-simplestyling.xsl”/> <map:serialize type=”html”/> </map:match> Supponiamo che nel flowscript che gestisce la form sia stata appena eseguita la seguente riga di codice: form.showForm(“URL_pipeline_form”);. Attraverso la pipelie “URL_pipeline_form” viene effettuata la seguente sequenza di operazioni: a) Viene letto tramite il generator il form template file (form_template.xml); b) Il form template file è dato in ingresso al formTemplateTransformer il quale, attingendo informazioni dal form definition file, espande gli elementi <ft:widget> ed <ft:widget-label> del template sostituendo ai primi informazioni aggiuntive circa il controllo della form che rappresentano e ai secondi la stringa che descrive il controllo reperibile sempre dal form definition file (label); c) Tale documento XML viene poi passato ad un transformer XSLT che rappresenta ogni widget, sulla base delle informazioni disponibili, secondo il markup HTML ed inserisce vari script per controllare ed agevolare l’immissione dei dati lato client (anche se i controlli di validazione della form e la gestione degli eventi riguardanti la form stessa avvengono sempre lato server); d) Il serializer HTML in fine serializza tale documento HTML contenente la form che sarà supportato e quindi rappresentabile su tutti i browser web. La seguente immagine può essere utile a chiarire meglio la sequenza di operazioni appena descritte. Per concludere, dopo che la form è stata compilata dal client, i dati vengono inviati al server che procederà con le operazioni di validazione; se la validazione va a buon fine si riprende l’esecuzione del flowscript, interrotta per permetter all’utente di compilare la form. Esempio di uso di Cocoon Forms Attraverso il seguente semplice esempio di un modulo elettronico gestito adoperando Cocoon Forms è possibile chiarire meglio il funzionamento di tale framework che permette una gestione delle web form in Cocoon caratterizzata da buone potenzialità di interazione con gli utenti del web stesso, grazie anche alla possibilità di richiedere loro l’invio di dati di varia tipologia. Si analizzi una semplice web form che richiede all’utente di immettere il proprio nome ed il proprio cognome salvandoli all’interno di un documento XML sul sever. Il form definition file che definisce la tipologia di tutti i controlli che concorrono a determinare la struttura della form, è il seguente: <!-- file : definition.xml--> <?xml version="1.0"?> <fd:form xmlns:fd="http://apache.org/cocoon/forms/1.0#definition"> <!—Elemento fd:widgets : contiene al suo interno tutti I widget (controlli) che costituiscono la form con le informazioni ad essi correlate --> <fd:widgets> <!-- field widget : nome e cognome --> <fd:field id="nome" required="true"> <fd:label>NOME :</fd:label> <fd:hint>Attenzione - nome(hint)!</fd:hint> <fd:help>Attenzione - nome(help)!</fd:help> <!—Definisco il tipo di dato che dovrà contenere tale widget --> <fd:datatype base="string"/> </fd:field> <fd:field id="cognome" required="true"> <fd:label>COGNOME :</fd:label> <fd:hint>Attenzione - cognome(hint)!</fd:hint> <fd:help>Attenzione - cognome(help)!</fd:help> <fd:datatype base="string"/> </fd:field> </fd:widgets> </fd:form> Il form template file è un file HTML all’interno del quale sono inclusi i vari controlli della form; grazie al markup HTML vengono opportunamente posizionati all’interno della pagina web i controlli stessi. Il form template file è il seguente: <!-- file : template.xml--> <html xmlns:ft="http://apache.org/cocoon/forms/1.0#template"> <head> <title> Registrazione : nome e cognome salvati in un documento XML </title> </head> <body> <p>Registrazione dell'utente - dati salvati in un documento XML </p> <!-- L'attributo action indica il nome della pipeine da invocare per spedire i dati della form. In tale caso con tale nome e' passato l'identificatore dell'oggetto continuazione al fine di riprendere la esecuzione del flowscript con i dati ottenuti dal riempimento della form motivo per il quale il flowscript era stato interrotto--> <ft:form-template action="#{$continuation/id}.continue" method="post"> <p> <!-- nome --> <ft:widget-label id="nome"/> <ft:widget id="nome"/> <p> <!-- cognome --> <ft:widget-label id="cognome"/> <ft:widget id="cognome"/> <input type="submit"/> </ft:form-template> </body> </html> Il form binding file determina come i dati acquisiti tramite i vari controlli della form devono essere immagazzinati in un documento XML appositamente strutturato per contenerli. La struttura di tale documento XML è la seguente: <!-- file : datif.xml--> <?xml version="1.0" encoding="UTF-8"?> <utente> <nome>Inserisci nome</nome> <cognome>Inserisci cognome</cognome> </utente> Il form binding file ha la seguente organizzazione: <!-- file : binding.xml--> <?xml version="1.0"?> <!-- File in cui definisco le regole di binding secondo sintassi CForms utilizzato nel flowscript nella funzione createBinding(); --> <fb:context xmlns:fb="http://apache.org/cocoon/forms/1.0#binding" path="/"> <fb:value id="nome" path="//nome"/> <fb:value id="cognome" path="//cognome"/> </fb:context> Per gestire la compilazione della form è necessario il seguente flowscript Cocoon che non è altro che un file javascript (tale flowscript utilizza il modello di gestione della form descritto in precedenza) : <!-- file : flowscript.js--> /* carico la classe form per gestire le form in Cocoon */ cocoon.load("resource://org/apache/cocoon/forms/flow/javascrip t/Form.js"); function regxml(){ /* Creo la variabile form sulla base di quanto specificato nel form model */ var form = new Form("definition.xml"); /* Salvo il documento XML di cui specifico l'uri come parametro della funzione loadDocument in un oggetto in maniera tale da poterne visitare il DOM tree*/ var doc = loadDocument("datif.xml"); /*Associo alla form un documento XML nel quale sono definite le regole di binding secondo la sintassi CForms (nome documento bind.xml)*/ form.createBinding("Bbind.xml"); /* Carico il contenuto del documento nella form */ form.load(doc); /* Funzione showForm : l'argomento e' la pipeline che si occupa di caricare la form inviandola al client */ /* tale funzione continua a mostrare la form all'utente finche' non e' valido tutto il suo contenuto */ form.showForm("registrazionexml"); /* Salvo il contenuto della form nell'oggetto doc */ form.save(doc); /* Salvo il contenuto dell'oggetto doc nel documento XML datif.xml La funzione makeTargetURI prende come argomento la stringa della path del documento XML con cui si e' prepopolata la form e ritorna lo stesso nome di file con l'aggiunta della stringa "-result" per non sovrascrivere l'originale esempio : name.xml ---> name-result.xml*/ saveDocument(doc,makeTargetURI("datif.xml")); /* Invio una pagina al client invocando la pipeline passata come argomento alla funzione sendPage */ cocoon.sendPage("fineregxml”); } Infine per poter gestire correttamente tale form bisogna aggiungere alla sitemap di Cocoon le seguenti sezioni: • Inclusione del flowscript (file “flowscript.js”): <map:flow language="javascript"> <map:script src="flowscript.js"/> </map:flow> • Inclusione delle pipeline adatte a gestire opportunamente la form: <!-- pipeline che invoca il flowscript flowscript.js --> <map:match pattern="regxml"> <map:call function="regxml"/> </map:match> <!-- pipeline da invocare per richiedere una registrazione (invocata nel flowscript flowscript.js) --> <map:match pattern="registrazionexml"> <!-- genero il documento xml contenente il form template --> <map:generate src="template.xml"/> <!-- uso il trasformatore seguente : Template Trensformer : sostituisce nel temlpate ad ogni oggetto di tipo ft:widget o ft:widget-label la corrispondente rappresentazione XML --> <map:transform type="forms"/> <!-- invoco il trasformatore XSLT che permette di effettuere l'output dei controlli della form in HTML (il foglio di stile che definisce tale trasformazione è riconfigurabile a piacere) --> <map:transform src="forms-samples-styling.xsl"/> <!—serializzo il contenuto come documento HTML per poi inviarlo al client --> <map:serialize type=”html”/> </map:match> <!-- pipeline da invocare se la registrazione e' andata a buon fine (invocata nel flowscript flowscript.js) --> <map:match pattern="fineregxml"> <!-- Uso il generatore XML per leggere il documento “notifica_avvenuta_registrazione” sul server ed inviarlo al client tramite il serializzatore --> <map:generate type="xml" src="notifica_avvenuta_registrazione.xml"/> <map:serialize type=”html”/> </map:match> <!—Pipeline per la gestione degli oggetti continuazione --> <map:match pattern="*.continue"> <map:call continuation="{1}"/> </map:match> Supponiamo che tale modulo elettronico sia presente sul server web di nome “www.nomeserver.it” sul quale è in esecuzione la servlet Cocoon che ascolta le richieste dei client sulla porta numero 8888 (di default). Se un utente remoto effettua per mezzo del proprio browser web una richiesta all’URI virtuale “http://www.nomeserver.it:8888/regxml”, Cocoon invoca la pipeline che gestisce tale virtual-URI, individuata dal particolare elemento <match> della sitemap, avente l’attributo “pattern” uguale a “regxml”. Tale pipeline a sua volta avvia l’esecuzione della funzione “regxml()” (flowscript Cocoon) definita nel file “flowscript.js”. Tale flowscript gestisce l’inizializzazione della form prepopolandone i controlli con i dati prelevati dal documento XML “datif.xml”, connesso alla struttura della form per mezzo delle regole di binding determinate dal form binding file “binding.xml”. La form viene quindi inviata all’utente in seguito all’invocazione della funzione “form.showForm("registrazionexml")”, facente parte del flowscript, di cui viene sospesa l’esecuzione. Tale funzione adopera la pipeline “registrazionexml” per leggere il template (form template file) “template.xml” e modificare opportunamente i controlli della form interni al template stesso per mezzo di un’opportuna trasformazione XSLT definita dal foglio di stile “forms-samples-styling.xsl”; grazie a tale trasformazione i controlli della form vengono espressi con sintassi dichiarativa HTML affiancata da alcuni script javascript ed in seguito il documento HTML viene serializzato ed inviato al client che ne aveva fatto richiesta. Dopo che l’utente ha terminato di compilare la form per mezzo del proprio browser web i dati immessi vengono ricevuti sul server, validati e, in caso di successo della validazione, memorizzati nel file “datif-result.xml”; tale procedimento è gestito per mezzo delle funzioni form.save(doc) e saveDocument(doc,makeTargetURI("datif.xml")), invocate all’interno del flowscript di cui viene ripresa l’esecuzione, precedentemente sospesa pochè la form era stata inviata all’utente per la compilazione. Il flowscript termina invocando la pipeline “fineregxml” tramite la quale viene inviato all’utente il documento HTML “notifica_avvenuta_registrazione.xml” quale conferma del successo della registrazione dei dati inviati tramite il modulo elettronico. In conclusione, è importante notare come il framework Cocoon Forms rappresenti uno strumento di gestione delle form per applicazioni web sviluppate appoggiandosi alla servlet Cocoon, molto potente e versatile; esso infatti permette di definire, per mezzo del form definition file, la struttura e l’organizzazione di un modulo elettronico, in maniera indipendente dal particolare linguaggio di markup XML usato per specificare al client le caratteristiche della form stessa (il più delle volte l’HTML). Grazie ad un foglio di stile che determina una particolare trasformazione XSLT è infatti possibile, immediatamente prima dell’invio della form al client, modificare il markup connesso alla form in maniera tale da renderlo comprensibile al client stesso. Definendo differenti fogli di stile si possono inviare i dati riguardanti la visualizzazione della form adoperando diversi linguaggi di markup XML, a seconda delle caratteristiche della piattaforma del client dal quale proviene la richiesta. Si ha quindi, gestendo il dialogo con i client per mezzo delle form HTML, il vantaggio della compatibilità con la quasi totalità dei browser. Vi è anche la possibilità sia di caricare che di memorizzare i dati della form in un documento XML per mezzo di regole di connessione dei controlli della form con i vari elementi del documento XML, definite nel form binding file. Adoperare Cocoon Forms per gestire un modulo elettronico risulta però essere anche abbastanza laborioso e complesso; difatti per ogni form devono essere editati per lo meno quattro file: il form definition file, il form template file, il form binding file ed il file javascript contenente il flowscript che gestisce le fasi di compilazione della form. Inoltre è necessario aggiungere alla sitemap le pipeline da impiegare nelle varie elaborazioni che interessano la form stessa. I controlli sui dati immessi dall’utente e l’aggiornamento dinamico del valore dei controlli in base alla compilazione di determinati campi della form avvengono tutti lato server quindi per portare a completamento la compilazione di un modulo elettronico si ha la necessità di inviarlo più volte al server il quale ne controlla la validità e, in caso di errori, lo spedisce nuovamente al client richiedendone, eventualmente, per mezzo di messaggi appositi, la correzione. Tali operazioni appesantiscono il carico di elaborazioni del server ed il traffico circolante sulla rete. Linguaggi XML per la definizione dell’interfaccia utente delle applicazioni Ogni volta che si sviluppa un’applicazione, sia essa desktop o destinata al web, che esplica parte delle proprie funzionalità interagendo con un utente umano, una delle principali problematiche con cui ci si deve confrontare è la realizzazione di un’ottimale interazione con l’utilizzatore per permettergli di sfruttare a pieno ed in maniera il più possibile semplice ed intuitiva le caratteristiche e le potenzialità dell’applicazione stessa. L’interfaccia di una siffatta applicazione per computer è quella componente chiave che si occupa di gestire l’interazione utente-elaboratore sfruttando, in ultima analisi, le caratteristiche dei dispositivi di input ed output dell’elaboratore stesso (in particolare monitor, mouse e tastiera, ma sempre più spesso anche di altoparlanti, joystick, etc.). Da varie decine di anni, parallelamente allo studio dell’interazione uomocomputer, sono stati sviluppati e si sono diffusi numerosi linguaggi di definizione delle interfacce utente sia in ambiente accademico che commerciale: tali linguaggi vengono comunemente denominati User Interface Definition Language - UIDL. Negli ultimi anni in particolare si è avuta una forte proliferazione di proposte e progetti di nuovi UIDL. Tale problematica è divenuta sempre più rilevante anche e soprattutto in relazione alla presenza di numerose piattaforme sulle quali poter eseguire una determinata applicazione ed alla correlata necessità di permettere una elevata portabilità del software sfruttando la possibilità di definire l’interfaccia utente in maniera generale e valida in ogni ambiente di esecuzione. In aggiunta a tale esigenza, un’interfaccia utente deve poter gestire in maniera ottimale l’interazione con l’utente fornendo i mezzi per agevolare il più possibile l’uso delle funzioni dell’applicazione connessa con modalità semplici ed intuitive. Infine il programmatore deve avere la possibilità di riuscire a definire in modo chiaro e coinciso le caratteristiche dell’interfaccia stessa: modalità di connessione con l’applicazione, layout, design, etc. A partire dalla fine degli anni ’90, con la standardizzazione dell’Extensible Markup Language (XML) da parte del World Wide Web Consortium, si è sviluppata una nuova famiglia di UIDL XML-based. Forti dell’astrazione agevolata dall’uso di documenti XML per determinare le caratteristiche dell’interfaccia, tali linguaggi mirano ad essere platform-indipendent, appoggiandosi il più delle volte a dei supporti software (plug-in o ambienti di esecuzione più complessi) per la renderizzazione finale su un particolare sistema. In gran parte degli UIDL XML-based oltretutto viene applicato, agevolato proprio dall’uso dell’XML, il principio di separazione delle modalità di visualizzazione dalla struttura logica delle varie parti che compongono l’interfaccia, permettendo così di poter controllare meglio e modificare con facilità le modalità di visualizzazione stesse, personalizzabili magari dall’utente finale in relazione al proprio sistema di elaborazione. Tale metodologia inoltre rende possibile ai programmatori, in fase di sviluppo, di concentrarsi sulle funzionalità dell’applicazione e sulla logica dell’interfaccia, delegando opportunamente la gestione della grafica e del layout agli esperti di design. La possibilità di usare linguaggi XML-based al posto di linguaggi procedurali per definire l’interfaccia utente di una applicazione, semplifica molto i compiti degli sviluppatori; infatti la sintassi dichiarativa si presta bene a tale scopo per la maggiore sinteticità rispetto a quella procedurale, per la migliore manutenibilità e chiarezza e per l’organizzazione gerarchica dei documenti XML facilmente correlabile alle gerarchie degli elementi e dei controlli che compongono l’interfaccia utente. Tali UIDL sono spesso integrati in piattaforme più elaborate per lo sviluppo di applicazioni le quali quindi si appoggiano ad una sintassi procedurale per definire le funzionalità, la logica dell’applicazione stessa e ad una sintassi dichiarativa per sviluppare l’interfaccia utente. Questo sembra essere il nuovo paradigma di programmazione del futuro che condensa in sé le caratteristiche della programmazione desktop e web. Infatti gran parte dei linguaggi di programmazione di applicazioni desktop attualmente utilizzano esclusivamente il codice procedurale (funzioni, oggetti, classi, librerie), mentre, nell’ambito della programmazione web, è adoperata molto diffusamente la sintassi dichiarativa (HTML, XML ed altri linguaggi XML-based) affiancata spesso da linguaggi di scripting poco potenti, limitati nelle possibilità. Il modello di sviluppo di software verso cui ci si dirige prende il meglio da entrambi i paradigmi di programmazione sfruttando la potenza del codice procedurale nel descrivere la logica dei programmi e la versatilità della sintassi dichiarativa nel definire la user interface. Da quanto affermato è possibile notare come tale nuova metodologia di programmazione riduca molto le distanze tra le applicazioni desktop e quelle web, dando la possibilità di definire applicazioni di rete che interagiscono con l’utente utilizzando interfacce create per mezzo dei nuovi UIDL XML-based, adeguatamente supportati da appositi ambienti di esecuzione presenti sulla piattaforma dell’utente stesso (lato client). Attualmente la maggior parte delle applicazioni web, per gestire l’interazione client-server, si basa su linguaggi dichiarativi quali HTML, XHTML ed altri per lo più standardizzati dal W3C con la finalità di permettere lo scambio di dati con l’utente attraverso la rete e supportati più o meno largamente dai browser. Tali linguaggi determinano le modalità di visualizzazione e raccolta delle informazioni immesse dall’utente di un’applicazione web, con poche possibilità di elaborazioni lato client (limitate a quelle che sono le potenzialità di Javascript). D’altro canto oggi ci si sta sempre più orientando verso i nuovi linguaggi di programmazione descritti in precedenza per la definizione di applicazioni di rete. Ognuna di queste applicazioni web è caratterizzata da un pacchetto autoinstallante, scaricabile in rete, magari da un server e comprendente i vari file di definizione dell’interfaccia utente (UIDL) affiancati da codice di tipo procedurale che si occupa di gestire le elaborazioni per quanto possibile lato client e di condurre e comunicare la comunicazione in rete col server. In tale maniera gli scambi di informazioni in rete tra client e server sono differenti rispetto ale tradizionali applicazioni web HTML-based e spesso molto più snelli. Oltretutto grazie all’uso di un apposito UIDL per la definizione dell’interfaccia utente, l’interazione con l’utente stesso risulta essere molto più ricca di potenzialità, flessibile ed adattabile alle differenti esigenze che possono manifestarsi se paragonato alle possibilità offerte dalle form tradizionali usate sul web. Infatti in tale maniera le applicazioni web sono dotate di una vera e propria interfaccia grafica fino ad ora destinata prevalentemente ad applicazioni desktop. Oltretutto questo tipo di applicazioni permettono di effettuare buona parte delle elaborazioni lato client, alleggerendo il carico del server; difatti potendo gestire l’interfaccia grafica sul client è possibile utilizzare del codice scritto adoperando un vero e proprio linguaggio di programmazione procedurale ovviamente molto più potente e performante degli script Javascript, che attualmente spesso vengono affiancati alle pagine HTML. E’ però necessaria sulla piattaforma del client la presenza di un opportuno ambiente che supporti l’esecuzione di tali pacchetti-applicazioni di rete, fornendo librerie e funzionalità comuni a tutte quelle di una determinata tipologia. Poter installare l’ambiente di esecuzione di queste applicazioni in maniera compatibile con differenti piattaforme ne aumenta la portabilità. In tale contesto diviene di fondamentale importanza il problema della gestione della sicurezza e quindi di un accesso controllato alle risorse del sistema di elaborazione del client da parte di queste applicazioni di rete. Trattandosi infatti di veri e propri programmi eseguiti lato client che vengono scaricati dalla rete e che spesso comunicano in rete, è fondamentale garantire la protezione del sistema ad esempio da eventuali accessi indesiderati al file system o ad altre risorse private. In conseguenza di quanto detto, è possibile prevedere in futuro una progressiva migrazione del web dall’uso degli attuali browser, che sono strumenti tuttora basilari per lo scambio di dati sul web stesso e per l’interazione con gli utenti e la raccolta dei dati da questi inviati tramite le form, all’impiego di nuove metodologie di programmazione di rete molto più evolute e complesse. In tale maniera per reperire le informazioni di input dell’utente non si utilizzano più le funzionalità delle form tradizionali, ma sofisticate e potenti interfacce grafiche supportate da ambienti di esecuzione appositi e librerie di classi presenti sul lato client. Quindi in futuro l’interazione utente-PC, relativamente alle applicazioni web e non solo, sarà definita tramite il vocabolario XML dell’UIDL prescelto. E’ possibile quindi che le tradizionali web form fino ad ora descritte e, più in generale, i linguaggi dichiarativi attualmente impiegati per lo scambio di dati strutturati sul web, tra i quali il più diffuso è sicuramente l’HTML, vengano affiancati se non progressivamente soppiantati da interfacce grafiche per applicazioni di rete ben più complesse definite per mezzo dei nuovi UIDL e gestite tramite codice procedurale in linguaggi di programmazione specifici. Attualmente sono varie e diversificate le proposte di nuovi UIDL e di ambienti per lo sviluppo di software applicativo che supportano tali linguaggi; tale campo è in continua evoluzione e suscita forte interesse sia dal punto di vista dello sviluppo di nuove tecnologie, che in relazione alla centralità assunta dal web nella gestione di processi commerciali e più in generale economici spesso anche di grande importanza. Tra i molti UIDL attualmente in via di sviluppo e di perfezionamento due proposte significative sono le seguenti: • L’EXtensible sviluppato User-interface nell’ambito della Language (XUL[28], produzione di si pronuncia software open “zul”), source dell’organizzazione Mozilla[26]; • L’EXtensible Application Markup Language (XAML[39], si pronuncia “zammel”), sviluppato dalla Microsoft per gestire le interfacce grafiche con sintassi dichiarativa nell’ambito della programmazione di applicazioni per il nuovo sistema operativo Windows Longhorn, di cui è prevista l’introduzione sul mercato tra il 2006 ed il 2007. Nel seguito vengono analizzati tali UIDL con i necessari riferimenti alle caratteristiche degli ambienti di sviluppo software che li supportano. Mozilla: EXtensible User-interface Language L’EXtensible User-interface Language è un linguaggio dichiarativo XML-based, basato su standard pubblici (open standard), utilizzato per la definizione dell’interfaccia utente delle applicazioni sia web che desktop, sviluppate agganciandosi al framework Mozilla XPToolkit[30]. Tale framework consiste in una collezione di pacchetti i quali, grazie all’integrazione delle funzionalità offerte, formano una Application Programmer Interface indipendente dalla piattaforma di esecuzione; utilizzando tale API, è possibile supportare lo sviluppo di applicazioni complesse sfruttando un ambiente che fornisce la possibilità di una facile implementazione dell’interfaccia utente dell’applicazione stessa o delle funzionalità di comunicazione di rete (nel caso in cui tale applicazione è distribuita su più computer connessi in rete che interagiscono tra di loro tramite opportuni scambi di pacchetti dati). Nei casi più complessi tali applicazioni si basano su programmi scritti adoperando linguaggi di programmazione, come ad esempio il C/C++, i quali sfruttano la possibilità di essere agganciati e supportati dall’XPToolkit di Mozilla ad esempio per ciò che riguarda l’interazione con l’utente tramite un’interfaccia definita utilizzando XUL o l’uso delle molteplici funzioni di utilità messe a disposizione dalle librerie XPCOM[31] (Cross Platform Component Object Model); tali funzioni sono basilari nello sviluppo di software che si appoggia a tale piattaforma ed espandibili dal programmatore. I componenti fondamentali dell’XPToolkit sono i seguenti: XUL, linguaggio XML-based di definizione dell’interfaccia utente; Gecko[32], motore per il renderig e l’editing di contenuti web. Supporta la gestione di interfacce utente definite utilizzando XUL, ma è anche compatibile con i più recenti e diffusi standard di Internet quali HTML, CSS, DOM, etc. E’ open source e facilmente integrabile su vari piattaforme, in molteplici ambienti di sviluppo. Si occupa della renderizzazione dei contenuti delle applicazioni per mostrarli all’utente fornendo un ambiente per l’esecuzione degli script Javascript associati all’interfaccia utente; Necko[33], libreria che fornisce funzionalità di alto livello per il supporto della comunicazione di rete, estensibile e comprendente il supporto ai protocolli di comunicazione più diffusi. Ogni applicazione web sviluppata utilizzando XUL e l’XPToolkit, si compone fondamentalmente di tre parti: 1. file XUL che definiscono la struttura dell’interfaccia utente nelle varie sezioni della applicazione; 2. file Javascript che determinano il comportamento e le funzionalità dei controlli che compongono l’interfaccia, con la possibilità di agganciare programmi scritti appositamente dallo sviluppatore (C/C++) o le librerie di utilità XPCOM dell’XPToolkit; 3. file CSS (Cascading Styile Sheet), adoperati per definire le modalità di visualizzazione dell’interfaccia utente tramite fogli di stile. L’unione di queste componenti costituisce un pacchetto, un’applicazione che si appoggia all’XPToolkit di Mozilla. I file di ogni pacchetto sono raccolti assieme in un unico archivio (.jar) seguendo una opportuna organizzazione di directory interna. E’ possibile quindi scaricare un pacchetto dal web, magari connettendosi ad un server, ed eseguirlo sul proprio sistema avendo già scaricato l’XPToolkit. Lo stesso browser Mozilla è infatti un pacchetto sviluppato appoggiandosi alla piattaforma Mozilla composto da file XUL, CSS e Javascript. Oltretutto l’XPToolkit è il risultato di un progetto di produzione di software open source e standard based, disponibile per le più diffuse piattaforme assicurando così un’elevata portabilità delle applicazioni sviluppate. La separazione della struttura logica dell’interfaccia utente definita utilizzando XUL, dalle modalità di visualizzazione specificate per mezzo dei fogli di stile (CSS), permette di sviluppare separatamente tali due aspetti di un’applicazione, oltre che di modificare e personalizzare semplicemente l’aspetto dell’interfaccia stessa. E’ anche possibile ridefinire con facilità, in relazione ad esempio a particolari condizioni, alcune caratteristiche dell’applicazione come ad esempio i testi visualizzati in relazione alla lingua. Per ciò che riguarda le applicazioni web i pacchetti possono essere scaricati in rete ed eseguiti localmente con privilegi definiti dall’utente a seconda dei casi relativamente all’accesso e all’uso delle risorse locali (accesso al file system, modifica di file, etc.). Rispetto alle tradizionali applicazioni web definite utilizzando l’HTML e le tecnologie ad esso connesse, appoggiandosi all’XPToolkit si ottiene quindi una notevole crescita delle potenzialità dell’interfaccia utente che viene definita tramite XUL e la possibilità di accedere nelle elaborazioni lato client a risorse locali quali librerie condivise, file system, etc. Vengono ora analizzate più in dettaglio le caratteristiche di XUL. Il vocabolario XML di tale linguaggio è organizzato appositamente per permettere una semplice quanto potente definizione delle interfacce utente delle applicazioni che sono state sviluppate utilizzando la piattaforma Mozilla. L’elemento <window> è la radice di un file XUL e comprende in sé tutti gli altri elementi dell’interfaccia. Come nelle tradizionali form web è possibile inserire a proprio piacimento bottoni, campi di input, etichette, liste a scelta multipla e singola, immagini; tutti questi sono controllli di base per interagire con l’utente. In aggiunta è previsto l’uso di barre (progress meter) che mostrano il progresso di particolari applicazioni e di indicatori di scorrimento (scrollbar). E’ possibile creare facilmente dei menù anche annidati o ancora, menù a comparsa visualizzabili ciccando col mouse su particolari zone dell’interfaccia. E’ contemplata la possibilità di creare anche delle barre di comandi (toolbar) che implementano funzionalità comuni a tutte le pagine che compngono l’interfaccia nel suo complesso. E’ oltretutto prevista, nel caso in cui i controlli sono numerosi relativamente a quanto può essere mostrato in una pagina dell’interfaccia, la possibilità di visualizzarli a gruppi su differenti livelli di sovrapposizione, scegliendo tramite opportuni comandi di volta in volta quali mostrare in primo piano (tabbox). Si può determinare il layout delle pagine raggruppando i controlli (Box Model) e definendo una serie di box per ciascuno dei quali è possibile specificare la disposizione e le dimensioni degli elementi contenuti. Si possono quindi organizzare interfacce che si adattano alla dimensione dell’area dello schermo disponibile per la visualizzazione, arrangiando al meglio la renderizzazione dei vari controlli. E’ possibile definire delle strutture tabulari per avere potenzialità ancora maggiori nella disposizione degli elementi di una pagina. Si possono adoperare, nello strutturare le interfacce, delle finestre in cui mostrare il contenuto HTML di una pagina web, reperito magari attraverso la rete (iframe). E’ prevista anche la possibilità di leggere sorgenti di dati esterne e mapparle su opportuni grafi ad albero (tree) per accedere gerarchicamente a tali informazioni visualizzandole aggiornate all’interno dell’interfaccia utente. Si possono scorrere agevolmente strutture di ripetizione di controlli, ad esempio, quando lo stesso schema si ripete più volte, contenendo ogni volta dati differenti, ed è contemplata l’opportunità di salvare lo stato dell’interfaccia così come settato dall’utente per ripristinarlo al successivo avvio dell’applicazione. Oltre alle caratteristiche appena descritte, proprie della struttura dell’interfaccia utente, e’ possibile associare ai vari elementi dell’interfaccia stessa degli script per la gestione degli eventi da essi generati; gli eventi gestibili sono quelli che si ritrovano anche nelle specifiche delle form HTML oltre ad alcuni aggiuntivi. E’ possibile abilitare o disabilitare in relazione a delle condizioni uno o più controlli. Tramite gli script Javascript si può accedere direttamente agli oggetti della Cross Platform Component Object Model (XPCOM), ovvero al set di oggetti messo a disposizione delle applicazioni sviluppate utilizzando l’XPToolkit di Mozilla e dei metodi e delle proprietà ad essi correlati: le modalità di integrazione degli oggetti XPCOM negli script Javascript sono riferite con la sigla XPConnect. Ad ogni file XUL è possibile associare uno o più fogli di stile (CSS) in maniera simile alle pagine HTML. A XUL si affianca un ulteriore linguaggio XML detto EXtensible Binding Language (XBL[34]) usato per modificare il comportamento degli elementi da inserire in una generica interfaccia o definirne di nuovi, estendendo così a piacere ed in relazione alle esigenza della particolare applicazione le potenzialità di XUL. Infine XUL presenta l’utile meccanismo degli overlay che consiste nella definizione di file tramite i quali è possibile definire nuove caratteristiche per le interfacce o modificare e riutilizzare quelle già presenti senza agire direttamente sulla loro definizione originale, ma indicando i cambiamenti da fare in un file esterno; ciò permette di apportare modifiche e personalizzazioni in maniera non definitiva e di ripristinare facilmente e velocemente la situazione originaria delle interfacce. Con XUL e l’XPToolkit di Mozilla cambia la tradizionale organizzazione delle applicazioni web ed alle comuni pagine HTML contenenti eventualmente la web form per reperire l’input dell’utente, si sostituisce una più completa e performante interfaccia grafica, ricca di numerose nuove possibilità per una maggiore interattività, gestita prevalentemente lato client tramite script ed appoggiandosi a librerie presenti localmente. Per chiarire meglio quanto descritto si faccia riferimento al seguente esempio di definizione della struttura di un’interfaccia grafica tramite un file XUL. Esempio di organizzazione di un file XUL Analizziamo il seguente esempio, opportunamente commentato, di un file XUL. <?xml version="1.0"?> <!-- Eventuale riferimento ad uno o piu' stylesheet utilizzati per definire le modalita' di visualizzazione dell' interfaccia <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> --> <!-- Elemento window: root di ogni file XUL --> <window id="esempio-xul" title="Esempio di strutura dell'interfaccia utente XUL" orient="horizontal" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script> <!—- Definisco alcune funzioni Javascript utilizzate nell’interfaccia - resetta():mostra una finestra di pop up con la scritta : "Bottone conferma premuto!!!"; - option():notifica con un messaggio in una finestra di pop up quali opzioni dei pannelli A e B sono state selezionate - direzione():notifica con un messaggio in una finestra di pop up il pulsante di direzione premuto sulla barra di comando (Avanti/Indietro) --> function resetta(){ alert("Bottone conferma premuto!!!"); } function option(){ var a=document.getElementById("pa"); var b=document.getElementById("pb"); if(a.checked){ if(b.checked) alert("Le opzioni del pannello A e del pannello B sono state selezionate!!!"); else alert("L'opzione del pannello A e' stata selezionata!!!"); } else { if(b.checked) {alert("L'opzione del pannello B e' stata selezionata!!!");} else {alert("Nessuna opzione e' stata selezionata!!!");} }} function direzione(a){ alert("La direzione scelta e' " + a);} </script> <!-- Vbox: raggruppo i controlli da visualizzare verticalmente uno di seguito all'altro --> <vbox> <toolbox> <!-- Menubar: aggiunta di un menù a tendina --> <menubar id="barra-menu-a-tendina"> <menu id="A-menu" label="Menu 1"> <menupopup id="popup-1"> <menuitem label="Scelta 1"/> <menuitem label="Scelta <menuseparator/> <menuitem label="Scelta <menuitem label="Scelta </menupopup> </menu> <menu id="B-menu" label="Menu 2"> <menupopup id="popup-1"> <menuitem label="Azione <menuitem label="Azione </menupopup> </menu> </menubar> 2"/> 3"/> W"/> a"/> b"/> <!-- Toolbar: aggiunta di una barra di comandi --> <toolbar id="barra-statica"> <toolbarbutton id="avanti" label="Avanti" onclick="direzione('avanti');"/> <toolbarbutton id="indietro" label="Indietro" onclick="direzione('indietro');"/> </toolbar> </toolbox> <hbox> <!-- Groupbox: raggruppo in un riquadro gli elementi della interfaccia contenuti --> <groupbox> <caption> <description>dati persopnali</description> </caption> <vbox> <!-- Description: elemento per aggiungere del testo --> <description> Inserire i propri dati personali </description> <!-- Spacer: elemento di spaziatura --> <spacer flex="2"/> <!-- Hbox: raggruppo i controlli da visualizzare orizzontalmente uno di seguito all'altro --> <hbox> <!-- Textbox: immissione di testo --> <label value="Nome e cognome:" control="nome"/> <textbox id="nome" flex="1"/> </hbox> <spacer flex="1"/> <!-- Listbox: lista a scelta multipla con opzioni tutte visibili --> <label value="Stato di residenza:" control="stato"/> <listbox id="stato"> <listitem label="Italia"/> <listitem label="Francia"/> <listitem label="Spagna"/> <listitem label="Germania"/> </listbox> <spacer flex="1"/> <hbox> <!-- Menulist: menu' a tendina --> <label value="Sesso:" control="sesso"/> <menulist id="sesso" flex="1"> <menupopup> <menuitem label="Maschio"/> <menuitem label="Femmina"/> </menupopup> </menulist> </hbox> <groupbox> <!-- Radio: bottone scelta singola --> <radiogroup> <caption> <description>Impiego</description> </caption> <hbox> <radio id="stuente" value="stu" label="Studente"/> <radio id="dipendente" value="dip" label="Dipendente"/> </hbox> </radiogroup> </groupbox> <spacer flex="1"/> <!-- Button: bottone con immagine e testo associati --> <button label="Conferma" image="happy.png" flex="1" onclick="resetta();"/> </vbox> </groupbox> <groupbox> <caption> <description>Opzioni</description> </caption> <!-- Tabbox: pannelli multipli sovrapposti dell'interfaccia utente --> <tabbox> <tabs> <tab label="Pannello A"/> <tab label="Pannello B"/> </tabs> <tabpanels> <tabpanel id="pannello-a"> <checkbox id="pa" label="Attiva l'opzione A"/> </tabpanel> <tabpanel id="pannello-b"> <checkbox id="pb" label="Attiva l'opzione B"/> </tabpanel> </tabpanels> </tabbox> <spacer flex="1"/> <button id="pc" label="Verifica opzioni selezionate" onclick="option();"/> </groupbox> </hbox> </vbox> </window> Ecco come tale file XUL (.xul) viene renderizzato dal Mozilla XPToolkit. Analizzando la sintassi dichiarativa del file XUL è possibile individuare facilmente i vari controlli che compongono l’interfaccia. Sono sfruttate, in tale esempio, alcune basilari possibilità di strutturare l’interfaccia utente, offerte da XUL come l’inserimento di menù a tendina, barre di controllo pannelli sovrapponibili ed il raggruppamento di vari controlli per una definizione più agevole del layout tramite i box (elementi <hbox> e <vbox> del Box Model ed elemento <groupbox>). Sono anche presenti dei semplici script inclusi direttamente all’interno del file XUL (elemento <script>). Tale file potrà essere aperto attraverso il browser Mozzilla o come applicazione stand-alone invocando, dalla linea di comando della shell del sistema operativo ove è installato il Mozilla XPToolkit, il file eseguibile “mozilla” e passando come argomento il nome del file XUL stesso. Microsoft: EXtensible Application Markup Language L’EXtensible Application Markup Language[39] è un linguaggio XML-based per la definizione di interfacce utente avanzate tramite sintassi dichiarativa, sviluppato dalla Microsoft per fornire ai programmatori Windows la possibilità di gestire l’interazione delle applicazioni con l’utente per mezzo di interfacce potenti e definibili in maniera semplice e relativamente sintetica. XAML sarà utilizzato per lo sviluppo di applicazioni sia web che desktop a partire dalla futura versione del sistema operativo Windows, denominata Longhorn[37] che lo supporterà pienamente. E’ possibile prevedere una forte diffusione dell’uso di XAML essendo questo lo strumento principale per la definizione dell’interazione tramite interfaccia grafica tra PC ed utente nella prossima generazione di applicazioni Windows; tale sistema operativo è infatti attualmente largamente impiegato. Le nuove applicazioni Windows si baseranno su di un nuovo paradigma di programmazione che mira a rendere lo sviluppo delle applicazioni stesse più semplice. Infatti verranno utilizzati linguaggi procedurali (C#, Visual Basic, etc.) per definire le funzionalità effettive delle applicazioni ed una sintassi dichiarativa per organizzare la user interface. In tale maniera sarà possibile strutturare delle interfacce complesse e complete, simili a quelle utilizzate nelle applicazioni desktop, anche per il software destinato al web. Ovviamente tali programmi non saranno portabili poiché eseguibili solo sotto Windows; difatti si prevede che tale nuovo paradigma di programmazione venga progressivamente inserito nella piattaforma .NET per lo sviluppo di software per Windows. Le applicazioni web sviluppate con tale nuova metodologia di programmazione, utilizzando XAML, potrebbero sostituire o comunque porsi come alternativa alle applicazioni web basate sull’HTML ed altre tecnologie web pubbliche e standardizzate; in tale situazione l’interazione con l’utente verrebbe affidata ai controlli XAML e non più alle tradizionali web form ed il carico elaborativo sarebbe spostato in maniera consistente sul lato client, riducendo e strutturando in maniera differente gli scambi di dati via rete tra client e server (tale comunicazione probabilmente consisterà nello scambio di pacchetti appositamente organizzati in relazione alle funzioni della specifica applicazione). Questa tendenza è confermata anche dallo scarso impegno della Microsoft nell’implementare e sviluppare nuove versioni del proprio browser Internet Explorer (IE) compatibili con i più recenti standard di Internet definiti dal World Wide Web Consortium. Al contrario l’azienda americana ha previsto di eliminare del tutto dalla versione 7 di IE il supporto alla visualizzazione di contenuti web che non siano le parti utente delle applicazioni di rete sviluppate sotto Windows, le quali utilizzano interfacce utente XAML. L’impatto di una simile scelta potrebbe segnare fortemente il futuro del web se si pensa che attualmente IE è il browser utilizzato da più del 90% degli utenti del web stesso. Oltretutto IE sarà direttamente integrato nel sistema operativo a partire dalla nuova versione di Windows e non sarà più disponibile quale pacchetto software aggiuntivo. Le applicazioni prodotte utilizzando XAML sono formate da un insieme di pagine (definite ciascuna, per ciò che riguarda le funzionalità, da un file XAML), tra le quali è possibile navigare sul modello del web ma con possibilità di azioni molto differenti, durante l’avanzamento delle elaborazioni; queste pagine sono gestite da codice procedurale che permette di modificare i controlli utilizzandoli dinamicamente nell’interazione con l’utente e di agganciare le funzionalità vere e proprie della parte elaborativa dei programmi. Al giorno d’oggi i linguaggi di programmazione compatibili .NET utilizzabili per lo sviluppo di applicazioni della tipologia descritta sono C#, Visual Basic .NET e JScript .NET. Attualmente sono già disponibili dei tool per lo sviluppo delle interfacce grafiche di queste applicazioni adoperando XAML. In questo contesto diviene fondamentale, per una corretta gestione del software web, scaricato magari dalla rete ed eseguito localmente, porre molta attenzione al problema della sicurezza. Attualmente infatti gran parte dei computer sono sempre connessi in rete, ad Internet il più delle volte, e tale connessione rappresenta sempre più spesso una fonte insicura di dati ed applicazioni di rete che contengono bug o effettuano operazioni illecite. Per evitare ciò, a partire dalla nuova versione di Windows, sarà introdotto il paradigma del “managed code”, ovvero il software verrà eseguito all’interno di un container (di un processo applicativo) che ne controllerà, tra le altre cose, le richieste di memoria ed i criteri di accesso alle risorse. Ciò permetterà di fornire un certo livello di sicurezza nell’esecuzione delle applicazioni, alleggerendo il programmatore dall’implementazione di tali funzionalità quali parte integrante della specifica applicazione. Oltre a ciò, un ulteriore miglioramento del sistema in termini di sicurezza sarà ottenuto grazie all’introduzione in Longhorn di un nuovo File System detto WinFS che dovrebbe fornire maggiori garanzie nel verificare gli accessi ai dati, oltre che maggiore affidabilità e velocità di ricerca delle informazioni. Viene descritto nel seguito, più in dettaglio, come viene realizzata l’interfaccia utente delle applicazioni adoperando XAML. Il linguaggio XAML è strettamente correlato ad Avalon, il sistema di presentazione di Longhorn il quale, grazie ad un’elaborata collezione di librerie e gerarchie di classi, permette di supportare interfacce capaci di gestire documenti di vario tipo e contenuti multimediali e caratterizzate da notevoli possibilità di elaborazioni grafiche. Ogni parte di un’interfaccia, infatti, è di solito gestita per mezzo di una componente di Avalon e, tramite sintassi XAML, sostanzialmente, le varie componenti, che formano nel loro insieme la user interface, vengono istanziate, organizzate e inizializzate con opportuni valori. Ogni elemento del vocabolario XAML corrisponde ad una classe Avalon dalla quale deriva il proprio nome; per mezzo delle proprietà degli elementi di solito vengono definiti i parametri relativi all’istanziazione dei vari oggetti (componenti Avalon). La struttura gerarchica dei documenti XML e quindi anche dei file XAML, ben si presta a descrivere le gerarchie di classi che devono essere istanziate per definire un’interfaccia utente; questa possibilità riduce il lavoro dei programmatori se paragonata alla determinazione di tali caratteristiche dell’interfaccia delle applicazioni per mezzo di sintassi procedurale, molto più complessa ed oltretutto spesso mista a parti relative alla definizione delle elaborazioni da effettuare e non della user interface. XAML si presenta come uno strumento per definire interfacce utente adoperando una sintassi molto più coincisa, strutturata e facilmente interpretabile rispetto al codice procedurale; è però importante notare che tutto ciò che può essere determinato per mezzo di XAML, è possibile anche specificarlo adoperando un linguaggio di programmazione, istanziando e settando opportunamente i vari oggetti che compongono un’interfaccia. Oltretutto alcune delle possibilità di definizione delle user interface che mette a disposizione Avalon non possono essere strutturate adoperando XAML, ma solamente usando la sintassi procedurale. Ciò pero non sminuisce le notevoli potenzialità di XAML. Grazie a XAML e all’ introduzione della sintassi dichiarativa XML, diviene possibile definire dei fogli di stile XSLT (EXtensible Stylesheet Language Transform) per trasformare, rispettando regole di trasformazione generali, un documento XML organizzato secondo la struttura (elementi ed attributi) di un determinato vocabolario in un documento XAML che sfrutta le potenzialità delle classi Avalon. Al momento della renderizzazione, un file XAML può essere già stato compilato passando attraverso la conversione automatica del proprio contenuto da sintassi dichiarativa a sintassi procedurale, producendo così un file sorgente intermedio comprendente sia il codice eventualmente inserito nel file XAML per la gestione dell’interfaccia, che il codice ulteriore necessario a definire l’interfaccia stessa, ricavato traducendo gli elementi XAML. In alternativa un file XAML può essere letto e convertito a run-time in una serie di oggetti opportunamente istanziati di cui si compone la user interface. Le applicazioni web che fanno uso di XAML di solito sono costituite da una o più pagine XAML e del codice per la gestione delle elaborazioni e delle proprietà dell’interfaccia utente. La parte client di tali applicazioni Windows può essere scaricata da server, eseguita su sistemi Windows compatibili con XAML, essendo ospitata (hosted) e controllata nell’esecuzione tramite un browser apposito. Molto probabilmente tale ruolo di hosting delle applicazioni web e supporto alla renderizzazione dell’interfaccia sarà implementato nella futura versione 7 di Internet Explorer in Windows Longhorn. Queste applicazioni web di solito vengono scaricate in rete in versione già compilata o parzialmente compialta per l’esecuzione su piattaforme Windows; esse rappresentano una possibile evoluzione del modello attuale di programmazione e gestione delle applicazioni web lato client (HTML + Javascript). Nel seguito verranno analizzate le principali caratteristiche dei documenti XAML. Tale linguaggio di definizione dell’interfaccia utente è formato da una serie di elementi che uniti concorrono a definire una struttura gerarchica di oggetti e vengono suddivisi, in base alle loro caratteristiche, in quattro grandi famiglie: 1. PANELS: elementi che fungono sostanzialmente da contenitori di altri elementi e hanno la funzione di organizzare adeguatamente il layout; 2. CONTROLS: elementi utilizzati per realizzare le caratteristiche base dell’interazione con l’utente; ve ne sono numerose tipologie per permettere di implementare con flessibilità ed efficacia le caratteristiche di interattività dell’applicazione (button, input field, checkbox, combobox, menù submenàù, scrollbar, drop-down list, spider, hyperlink, etc.); 3. TEXT FORMATTING ELEMENTS: elementi utili a formattare il testo e trattare i documenti e la loro visualizzazione ottimale all’interno dell’interfaccia utente; 4. SHAPES: elementi adoperati per inserire della grafica vettoriale nelle interfacce. I Panels, componenti fondamentali di XAML, come affermato, offrono l’opportunità di posizionare e renderizzare adeguatamente gli elementi che contengono. E’ inoltre possibile annidare a piacimento i Panels così da avere maggiori possibilità di definizione del layout delle pagine. Esistono sei differenti tipi di Panels: NOME CARATTERISTICHE Canvas Posiziona gli elementi contenuti secondo coordinate relative all’area a disposizione per la renderizzazione e permettendone la sovrapposizione. Dock Panel Posiziona gli elementi contenuti con riferimenti relativi tra gli elementi stessi (a destra/sinistra/in alto/in basso rispetto all’elemento precedentemente dichiarato). Flow Panel Visualizza e posizione gli elementi contenuti secondo l’ordine con cui sono stati definiti arrangiandoli ed organizzandoli in maniera automatica al fine di utilizzare al meglio l’area a disposizione. E’ adatto a gestire complesse renderizzazioni di testo e grafica. Text Panel E’ utilizzato per ottenere una gestione ottimale di complessi layout di contenuti testuali e supporta molti formati di file di testo Grid Panel Serve per organizzare gli elementi contenuti in griglie, a formare righe e colonne di controlli dell’interfaccia utente. E’ usato per creare semplici tabelle di layout. Fixed Panel E’ usato per posizionare gli elementi di una pagina definendo un layout fisso, che rispetta la stessa organizzazione e posizionamento delle parti dell’interfaccia, indipendentemente dalle dimensioni della finestra o dalla risoluzione del device. Tramite i panels è quindi possibile strutturare facilmente interfacce grafiche che si adattano automaticamente alle dimensioni dell’area dello schermo disponibile; tale problema in alternativa può essere risolto con una cospicua e ben più complessa quantità di codice procedurale dedicato. Nel definire le caratteristiche grafiche dell’interfaccia, XAML permette di adoperare la grafica vettoriale per mezzo degli elementi SHAPES, offrendo la possibilità di includere le forme geometriche delle seguenti tipologie: Ellipse, Line, Rectangle, Path, Polygon e Polyline. Di ognuno dei precedenti elementi è possibile definire numerose proprietà tra cui le dimensioni, i bordi, i colori, etc. Oltretutto i vari elementi che compongono l’interfaccia utente possono essere modificati mediante trasformazioni di vario tipo come rotazioni ad esempio sull’asse, traslazioni, rappresentazioni in scala, etc. E’ possibile anche animare con facilità le varie caratteristiche e proprietà dei controlli dell’interfaccia, ottenendo tramite semplici procedimenti, effetti grafici molto interessanti. Con XAML vi è la possibilità di definire tramite l’elemento <style> degli stili, ovvero delle proprietà comuni ad un certo gruppo di elementi che riferiscono tutti il medesimo stile (questa caratteristica è assimilabile ad alcune delle possibilità offerte dai Cascading Stylesheet CSS). Ogni componente dell’interfaccia utente è rappresentata da un elemento apposito del markup XAML e riferisce un oggetto XAML che verrà istanziato a tempo di esecuzione; le proprietà degli oggetti possono essere specificate per mezzo delle proprietà degli elementi XAML o nei casi più complessi per mezzo di gerarchie di elementi discendenti da quello da determinare. L’interfaccia viene gestita per mezzo di codice procedurale associato al fine di trattare opportunamente gli eventi; tale parte procedurale del file XAML, che è possibile includere anche in un file esterno, rende necessaria la compilazione dell’applicazione prima dell’esecuzione e può essere sviluppata in linguaggi come C#, Visual Basic .NET o JScript .NET; all’interno di tale codice è possibile riferire le varie parti della gerarchia di oggetti dell’interfaccia e modificarle con grande immediatezza. Ad esempio: bottone1.Width = new Length(90); setto la proprietà Width (larghezza) del bottone riferito dalla variabile di nome bottone1 a 90 pixel. Attraverso il seguente esempio, opportunamente commentato, viene mostrato come è strutturata una semplice interfaccia utente utilizzando XAML. Tale esempio è una dimostrazione basilare delle possibilità di XAML; le interfacce realizzate adoperando tale linguaggio e quindi appoggiandosi alla collezione di classi grafiche Avalon presentano una complessità ed una ricchezza di componenti molto maggiore. Esempio di organizzazione di un file XAML. <Window xmlns=http://schemas.microsoft.com/2003/xaml xmlns:def="Definition" def:Class="CounterSample.Counter" <!-- La proprieta' def:CodeBehind indica il nome del file nel quale e' presente il codice procedurale per la gestione della interfaccia utente --> <!-- def:CodeBehind="Counter.xaml.cs" --> Text="Esempio XAML" Visible="True" Width="268" Height="150" Loaded="OnLoaded"> <!-- All'interno dell'elemento Window.Resources si specificano le proprieta' comuni di alcune classi di elementi; in tal caso tutti i bottoni inseriti nell'interfaccia utente saranno caratterizzati dal margine e dalla dimensione dei caratteri di seguito specificati (elemento style) --> <Window.Resources> <Style> <Button Margin="5" FontSize="14" /> </Style> </Window.Resources> <!-- L'elemento FlowPanel definisce automaticamente il layout degli elementi dell'interfaccia che contiene sfruttando al meglio l'area disponibile --> <FlowPanel> <-- Tramite l'elemento FlowPanel.Background definisco le modalita' relativamente alla sfumatura dei colori di sfondo del FlowPanel (sto modificando una proprieta' del FlowPanel) --> <FlowPanel.Background> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <LinearGradientBrush.GradientStops> <GradientStop Color="#E7E7E7" Offset="0" /> <GradientStop Color="#FFFFFF" Offset="0.02" /> <GradientStop Color="#FFF287" Offset="0.2" /> <GradientStop Color="#F9E11A" Offset="0.98" /> <GradientStop Color="#000000" Offset="1" /> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </FlowPanel.Background> <!-- L'elemento SimpleText inserisce del testo definendone alcune proprieta' di formattazione --> <SimpleText Margin="5" FontSize="14">Esempio XAML</SimpleText> <!-- L'elemento TextBox determina una casella di testo specificandone le dimensioni, l'allineamento, il margine e la modalita' di sola lettura del contenuto --> <TextBox ID="ValueTextBox" FontSize="14" Width="250" Height="30" HorizontalAlignment="Center" IsReadOnly="True" Margin="5"></TextBox> <!-- L'elemeto FlowPanel annidato all'interno di un altro elemento FlowPanel serve per definire il layout dei tre bottoni --> <FlowPanel HorizontalAlignment="Center" Width="100%"> <!-- I tre elementi Button definiscono tre bottoni all'interno del FlowPanel col testo visualizzato su ognuno ed associando, per mezzo della proprieta' Click all'evento "click del mouse sul bottone" l'esecuzione della funzione di nome rispettivamente Funz_a, Funz_B e Funz_C; il codice associato a tali funzioni sara' contenuto nel file di codice specificato quale valore dell'attributo def:CodeBehind del root element Window --> <Button Click="Funz_A">A</Button> <Button Click="Funz_B">B</Button> <Button Click="Funz_C">C</Button> </FlowPanel> </FlowPanel> </Window> Di seguito è mostrato come viene visualizzato il file XAML appena descritto: XUL versus XAML: l’evoluzione delle interfacce utente delle applicazioni web XUL e XAML sono due delle principali proposte, attualmente in fase di sviluppo e di perfezionamento, riguardanti nuovi linguaggi XML-based per la definizione di elaborate interfacce utente per applicazioni di varia tipologia. Se per quanto riguarda lo sviluppo di software per desktop già ora sono disponibili elaborate interfacce grafiche da poter adoperare, riferendosi alle applicazioni web, l’interazione con l’utente, al giorno d’oggi, il più delle volte, è ottenuta per mezzo del tradizionale scambio di documenti HTML contenenti eventuali form supportati magari da script, secondo un modello di gestione delle operazioni inevitabilmente condizionato dalla natura page-based delle applicazioni di rete tuttora diffuse (si visitano, interagendo, una serie di pagine). Al contrario le applicazioni web sviluppate appoggiandosi a tali linguaggi per gestire l’interazione con l’utente (lato client), permettono una definizione della porzione front-end molto più ricca e strutturata. Sia XUL che XAML sono entrambi inseriti in uno specifico ambiente di sviluppo di applicazioni. In particolare XAML sarà pienamente supportato per ciò che riguarda la produzione del software nella prossima versione di Microsoft Windows denominata Longhorn e sarà integrato nel framework Microsoft .NET, mentre XUL è supportato dalla piattaforma Mozilla e, assieme ad altre componenti del Mozilla XPToolkit, permette prevalentemente lo sviluppo di applicazioni di rete. Nonostante siano numerose le affinità tra tali due linguaggi di definizione dell’interfaccia utente, le finalità che stanno alla loro base sono ben differenti: XUL si propone di rendere possibile la creazione di elaborate interfacce utente, presentandosi come uno standard aperto, supportato dalla piattaforma Mozilla (XPToolkit) la quale permette la renderizzazione e la gestione di molti altri standard del web (HTML, DOM, CSS, supporto a Javascript, etc.). I browser Mozilla e Netscape nelle versioni attuali sono implementati sfruttando tale piattaforma. Strettamente connesse a XUL sono oltretutto tecnologie molto diffuse e da tempo standardizzate quali CSS e Javascript. XAML è un linguaggio sviluppato interamente dalla Microsoft che per molti aspetti ricalca le caratteristiche di XUL, già diffuso al momento della creazione di XAML. Per mezzo di XAML è possibile definire complesse user interface per applicazioni Windows appoggiandosi per la loro gestione al codice procedurale adoperabile all’interno del framework .NET. XAML è fortemente correlato alla gerarchia di classi Avalon sviluppate dalla Microsoft che si occupano di gestire l’interfaccia utente; con XAML sostanzialmente si definisce con sintassi XML l’organizzazione gerarchica degli oggetti Avalon che compongono l’interfaccia. Le applicazioni web in futuro potrebbero appoggiarsi, per ciò che concerne la user interface, a tali nuovi UIDL piuttosto che agli standard web tuttora diffusi per l’implementazione dell’interfaccia del client e, più in generale della comunicazione client-server. In questa maniera si passerebbe da una struttura basata sulla visitazione successiva di pagine (page-based), che attualmente è la più adoperata, ad una gestione più elaborata lato client delle azioni dell’utente, non più una sequenza di pagine da visitare ma un vero e proprio programma in esecuzione localmente. In questo modo si permette all’applicazione di accedere alle risorse locali e di comunicare all’occorrenza con il server. In tale contesto diviene di fondamentale importanza una corretta gestione della sicurezza, della portabilità, della facilità d’uso e dell’accessibilità delle applicazioni. Se XUL è un UIDL open standard e basato su un progetto open source di piattaforma per lo sviluppo di applicazioni, XAML è stato ideato dalla Microsoft sia per semplificare la programmazione delle user interface del software prodotto, ma soprattutto per disporre di un linguaggio XML-based proprietario per la definizione della porzione front-end delle applicazioni web, con possibilità grafiche paragonabili a quelle delle applicazioni desktop. Se si pensa alla grande diffusione del sistema operativo Windows nelle sue varie versioni e del browser Microsoft Internet Explorer è evidente come la Microsoft abbia la forza per spingere l’utenza del web all’uso di questa sua nuova tecnologia nelle applicazioni di rete. Ciò, come già sottolineato, è confermato dalla intenzione della Microsoft di non supportare più dalla futura versione 7 di Internet Explorer, la visualizzazione di contenuti web che non siano le parti client di applicazioni Windows sviluppate adoperando XAML. I competitor di Microsoft affermano, confermando tale tendenza, che se nel giro di alcuni anni non emergerà uno standard aperto e retrocompatibile con HTML e col DOM in maniera tale da poter essere anche adoperato con le vecchie versioni dei vari browser tra cui Internet Explorer 6 (che probabilmente sarà l’ultima versione di IE che supporta le tecnologie open standard diffuse sul web attualmente), accadrà che nel giro di una decina di anni con molta probabilità lo standard per le applicazioni web sarà Microsoft Avalon ed il framework .NET. Al giorno d’oggi il futuro del web, delle applicazioni di rete e della gestione dell’interazione con l’utente è molto incerto; le proposte sono molteplici se si considera il giro di interessi, anche economici che circonda tali problematiche. In questo panorama frammentato si delineerà probabilmente o il raggiungimento della standardizzazione delle nuove tecnologie adoperate sul web o la coesistenza di soluzioni proprietarie concorrenti; in tale processo di definizione del futuro del web la forza delle aziende e delle organizzazioni coinvolte sicuramente costituirà un fattore determinante. Conclusioni L’analisi sviluppata nei capitoli di questo studio consente di dedurre che attualmente c’è un forte fermento: in rapporto al trattamento dei dati circolanti su web tramite form sono in atto numerosi tentativi di individuare una soluzione che sia efficace e flessibile oltre che ampiamente supportata. Tutto ciò è di grande attualità anche perché oggi il web è divenuto veicolo per lo scambio di informazioni relative anche a processi di business intorno ai quali gravitano forti interessi economici. Ciò che risulta evidente è che le esigenze di interattività delle applicazioni web, fortemente connesse alla possibilità di poter trattare facilmente e in maniera immediata l’input degli utenti per permettere loro di sfruttare appieno le possibilità della comunicazione in rete, sono cresciute e, il più delle volte, l’HTML assieme alle form con esso definite, non sono più sufficienti a soddisfarle. Vi è la necessità di avere a disposizione mezzi più potenti che permettano di strutturare l’interazione con l’utente la quale caratterizza le applicazioni web, in maniera più flessibile, immediata e ricca: si faccia riferimento, ad esempio, ai metodi con i quali è possibile reperire dati dall’utente e comunicarli attraverso la rete ad un eventuale server. Le risposte a tali esigenze sono molteplici e sono state discusse nelle precedenti sezioni di questo elaborato. Dalla ricerca svolta risulta che esse sono sostanzialmente divisibili in due grandi categorie, ovvero in soluzioni che mirano a definire degli standard pubblici e delle piattaforme di sviluppo web open source e in proposte di nuove tecnologie proprietarie, sostenute da aziende leader nel settore informatico. Il World Wide Web Consortium ha proposto e standardizzato la tecnologia XForms per fornire una nuova soluzione per la gestione dell’input degli utenti, in merito alle applicazioni e ai servizi web, che tenga conto sia delle maggiori esigenze di interattività manifestate in tale ambito che della progressiva affermazione dell’XML come mezzo principe per veicolare le informazioni in rete; tale tecnologia però è legata alla presenza di un’applicazione lato client che si occupa di gestire i moduli elettronici. Il Web Hypertext Application Technology Working Group, organizzazione impegnata nello sviluppo di nuove tecnologie direttamente connesse ad applicazioni web, ha proposto le specifiche Web Forms 2.0, ovvero delle estensioni alle form HTML che, pur mantenendo la retrocompatibiltà col passato, hanno l’obiettivo di estenderne le caratteristiche tenendo, ove possibile, conto delle nuove esigenze manifestatesi sul web. Sia Mozilla, fondazione per la produzione di software open source, che la Microsoft stanno addirittura sviluppando nuove piattaforme per lo sviluppo di applicazioni web che permettono di gestire l’interazione con l’utente attraverso delle interfacce elaborate che si appoggiano a librerie grafiche avanzate, la cui definizione è resa possibile per mezzo di appositi User Interface Definition Languages, ovvero di linguaggi appositamente strutturati, i quali adoperano una sintassi dichiarativa XMLbased. Tra gli UIDL attorno ai quali oggi vi è maggiore attenzione da parte degli sviluppatori web vi sono l’EXtensble Application Markup Language della Microsoft e l’Extensible Usre-interface Language implementato da Mozilla. Tale tipologia di applicazioni web, nelle quali è possibile decentrare parte delle elaborazioni lato client, potrebbe sostituirsi col tempo all’attuale modello di sviluppo di applicazioni web, in cui gran parte delle elaborazioni avviene lato server e il server stesso comunica con i client sostanzialmente per mezzo dell’HTML, affiancato da eventuali tecnologie complementari che ne estendono le potenzialità. In questo scenario è rilevante considerare anche le più importanti tecnologie proprietarie per la gestione dell’input degli utenti delle applicazioni web che sono: Microsoft Web Forms ed ASP.NET, Microsoft Info Path, Adobe Form Designer, Macromedia Flash MX. Oltre a quelle appena menzionate, molte sono le soluzioni meno note, poiché più specifiche e legate a particolari piattaforme, adottate per la raccolta di informazioni e l’interazione con l’utente su web; tra queste vi è il framework Cocoon Forms per la gestione dei moduli elettronici delle applicazioni web che si appoggiano alla servlet Cocoon. In conclusione è possibile affermare che oggi vi sono varie proposte di nuove tecnologie relative alla gestione delle form nel web e più in generale dell’interfaccia delle applicazioni di rete con gli utenti web e che esse sono più o meno diffuse e spesso in continua evoluzione e in perfezionamento. Sembra probabile che col tempo si superi tale varietà di proposte e si arrivi ad una soluzione stabile e largamente supportata. Bibliografia 1. Micah Dubinko - XForms Essentials - O’Reilly Editions, 1st Edition August,2003 2. Elliotte Rusty, W. Scott Means - XML in a Nutshell - Editions, 2nd edition June,2002 3. Doug Tidwell - XSLT - O’Reilly Editions, 1st Edition August,2001 4. David Flanagan - JavaScript: The Definitive Guide - O’Reilly Editions, 4th Edition November,2001 5. [www.w3.org] World Wide Web Consortium Web Site 6. [www.w3.org/TR/Markup/] HTML Home Page 7. [www.w3.org/MarkUp/html-spec/html-spec_toc.html] HTML 2.0 8. [www.w3.org/TR/html401/] HTML 4.01 9. [www.w3.org/Style/CSS/] CSS - Cascading Style Sheet 2.1 10. [www.w3.org/TR/2003/REC-xforms-20031014/] XForms 1.0 11. [www.w3.org/XML/] XML - Extensible Markup Language 1.0 12. [www.w3.org/TR/xpath] XPath - XML Path language 1.0 13. [www.w3.org/Style/XSL/] XSLT - Extensible Stylesheet Language Transformation 1.0 14. [www.w3.org/DOM/] DOM 15. [www.w3.org/TR/REC-xml/#dt-doctype] DTD 16. [www.w3.org/XML/Schema] XML Schema 17. [www.w3.org/TR/xhtml2/] XHTML 18. [www.w3.org/Protocols/rfc2616/rfc2616.html] HTTP protocol 19. [www.whatwg.org] Web Hypertext Application Technology Working Group Web Site 20. [www.whatwg.org/specs/web-forms/2004-06-27-call-for-comments/] Working draft: Web Forms 2.0 - Call for Comment (27/6/2004) 21. [www.apache.org/] Apache 22. [cocoon.apache.org] Apache Cocoon Web Site 23. [cocoon.apache.org/2.1/userdocs/concepts/#Pipeline+Processing] Cocoon and pipeline processing 24. [cocoon.apache.org/2.1/userdocs/flow/api.html] Flowscript Cocoon 25. [cocoon.apache.org/2.1/userdocs/forms/] Cocoon Forms 26. [www.mozilla.org/] Mozilla 27. [www.mozilla.org/why/framework-details.html] The Mozilla Application Framework in Detail 28. [www.mozilla.org/projects/xul/xul.html] XML User Interface Language (XUL) 29. [www.mozilla.org/projects/xul/joy-of-xul.html] Peter Bojanic - The Joy of XUL 2/12/2003 30. [www.mozilla.org/xpfe/xptoolkit/] Mozilla XPToolkit 31. [www.mozilla.org/projects/xpcom/] XPCOM 32. [http://wiki.mozilla.org/Gecko:Home_Page] Gecko 33. [www.mozilla.org/projects/netlib/] Necko 34. [www.mozilla.org/projects/xbl/xbl.html] XBL 35. [wp.netscape.com/eng/mozilla/3.0/handbook/javascript] Sito JavaScript 36. [www.microsoft.com] Microsoft 37. [msdn.microsoft.com/Longhorn/] Longhorn 38. [www.ondotnet.com/pub/a/dotnet/2004/01/19/longhorn.html] Ian Griffiths Inside XAML - 19/1/2004 39. [msdn.microsoft.com/msdnmag/issues/04/01/DevelopingAppsforLonghorn/def ault.aspx] Dino Esposito - CODE NAME LONGHORN: A First Look at Writing and Deploying Apps in the Next Generation of Windows - 27/8/2004 40. [http://msdn.microsoft.com/longhorn/understanding/pillars/avalon/default.aspx ?pull=/msdnmag/issues/04/01/Avalon/default.aspx] CODE NAME AVALON: Create Real Apps Using New Code and Markup Model - Charles Petzold gennaio,2004 41. [msdn.microsoft.com/library/en-us/script56/html/js56jsoriJScript.asp] Sito JScript 42. [www.microsoft.com/net/] .NET 43. [www.microsoft.com/office/infopath/prodinfo/default.mspx] InfoPath 44. [www.asp.net/] Sito ASP 45. [www.visual-basic.it/uploads/articoli/tecnici/fbFramework.htm] Fabrizio Baldazzi - Il Framework .NET: questo sconosciuto - 2002 46. [xml.coverpages.org/userInterfaceXML.html] XML Markup Languages for User Interface Definition 47. [xul.sourceforge.net/counter.html] Raccolta di esempi di UIDL: XUL Grand Coding Challenge 2004 - Counter Sample Showcase 48. [www.aspnetpro.com/opinion/2004/03/asp200403jg_o/asp200403jg_o.asp] Jonathan Goodyear - What will happen when Windows and the Web collide? aprile,2004 49. [webnews.html.it/focus/395.htm] Cesare Lamanna - Il futuro dei browser 3/6/2004 50. [www.sax.net/live/?date=10/31/2003] Mike Sax - Is XAML the future of the web? - 31/10/2003 51. [www.devx.com/DevX/Article/17899/0] Nigel McFarlane - Longhorn and Mozilla: Birds of a Feather - 25/11/2003 52. [www.davidtemkin.com/mtarchive/000004.html] David Temkin - W3C standards and Web applications - 19/6/2004 53. [wesnerm.blogs.com/net_undocumented/2003/10/xaml_and_standa.html] Joe Beda - XAML and Standards - 30/10/2003 54. [www.asp.net/] Microsoft ASP.NET 55. [msdn.microsoft.com/library/default.asp?url=/library/enus/dndotnet/html/introwebforms.asp] Paul D. Sheriff - Introduction to ASP.NET and Web Forms - novembre 2001 56. [www.adobe.com/] Adobe System Web Site 57. [www.adobe.de/products/server/formdesigner/main.html] Adobe Form Designer 58. [www.oreillynet.com/pub/a/javascript/2003/05/20/colinmoock.html] Colin Moock - A Study in Flash Form Submission - 20/5/2003 59. [www.macromedia.com/] Macromedia 60. [www.macromedia.com/software/flash/] Macromedia Flash MX 61. [www.macromedia.com/support/flash/ts/documents/f4_form.htm] How to create and submit a form in Flash 4 62. [www.internetnews.com/dev-news/print.php/3361141] Sean Michael Kerner Mozilla, Opera Join Forces For New W3C Proposal - 31/5/2004 63. [www.w3schools.com/xforms/xforms_intro.asp] Sito di e-learning: Introduction to XForms 64. [www.xml.com/pub/a/2001/09/05/xforms.html] Micah Dubinko - What Are XForms? - agosto 2003 65. [www.xsmiles.org/] Sito del web browser X-Smiles 66. [http://www.eweek.com/article2/0,3959,985910,00.asp] Timothy Dyck XForms: Next Destination for Web Forms - 31/3/2003 67. [freephp.html.it/] Sito italiano di guide e tutorial di sul PHP 68. [www.javascript.it/] Sito italiano di risorse di sul linguaggio JavaScript 69. [www.php.net] Sito PHP 70. [hoohoo.ncsa.uiuc.edu/cgi/] Sito CGI 71. [www.ecma.international.org] ECMA 72. [www.ecma-international.org/publications/standards/Ecma-262-htm] ECMAScript