JSF è la tecnologia che si propone di rendere più semplice e produttiva l‘attività di sviluppo dell‘interfaccia nelle applicazioni web Java EE. Introduciamo gli elementi essenziali per capirne il funzionamento.
Introduzione
L‘argomento dello sviluppo di applicazioni web Java EE è stato più volte dibattuto nelle pagine di MokaByte. Sono stati presentati i principali framework utilizzati nello sviluppo, quali Struts [1] e Spring [2], ed è più volte stato affrontato l‘argomento del MVC Model-2 [1], il pattern architetturale di riferimento per lo sviluppo di questo tipo di applicazioni. In questa serie di articoli dedicati a Java Server Faces non ripeteremo questi concetti, che fanno ormai parte del bagaglio di conoscenza di qualsiasi sviluppatore o progettista che si occupi di queste problematiche; cercheremo piuttosto di capire cosa è JSF e cosa introduce di nuovo nel già ricco mondo dei framework per lo sviluppo di applicazioni web. In questo primo articolo cercheremo di spiegare cosa è JSF e cosa introduce di nuovo rispetto ai framework già esistenti, per poi passare, nei successivi articoli, nel dettaglio dei singoli elementi che lo costituiscono.
Cosa è JSF?
JSF, Java Server Faces, è il framework della Java EE per lo sviluppo del web layer delle applicazioni web server-side. JSF in particolare fornisce strumenti per la costruzione dell‘interfaccia web e per la gestione del flusso di navigazione dell‘applicazione.
In base a questa definizione, è lecito chiedersi che differenza ci sia tra JSF ed altri framework, quali ad esempio Struts, che ancora oggi è quello maggiormente usato in questo ambito. JSF in realtà , pur essendo simile agli altri, per alcuni servizi che fornisce introduce numerosi aspetti di novità che lo rendono senza dubbio il modello di sviluppo dominante nel breve futuro.
JSF è strutturato secondo il pattern MVC, ma propone un modello di sviluppo per componenti e a eventi che lo rende molto simile a quello che è Swing per lo sviluppo di applicazioni client-server.
JSF si propone come un framework che rende possibile sviluppare l‘interfaccia web di una applicazione server-side secondo la logica RAD, Rapid Application Development, tipica degli ambienti di sviluppo di Swing, in cui si ha a disposizione una palette di componenti predefiniti, realizzati secondo lo standard dei JavaBeans, da selezionare e trascinare nell‘area in cui si costruisce l‘interfaccia.
Tutti conoscono la Java Enterprise Edition come una piattaforma matura, solida e affidabile per la costruzione di applicazioni enterprise, con un solido back-end applicativo. Una delle critiche più comuni rivolte alla piattaforma è sempre stata la mancanza di un modello di riferimento per lo sviluppo dell‘interfaccia che consentisse una maggiore produttività in questa attività . Anche con framework evoluti, questa attività necessita di un approccio “hard coding” più dispendioso dell‘approccio utilizzato, ad esempio, nella piattaforma concorrente .NET di Microsoft, nella quale è possibile sviluppare le pagine web con una logica visuale, con “drag&drop” di componenti simile a quella utilizzata nello sviluppo di applicazioni client-server.
Prima di ora nulla di simile esisteva nella Java EE; ricordiamo infatti che, essendo sostanzialmente solo un front-controller, anche un framework molto diffuso come Struts non proponeva un modello per lo sviluppo dell‘interfaccia, ma solo alcune librerie di custom tag per rendere più semplice e standard la generazione del codice HTML nelle pagine JSP.
Con JSF questa lacuna viene completamente colmata, in quanto vengono messi a disposizione gli strumenti per lo sviluppo rapido dell‘interfaccia web di applicazioni Java EE. Tutti i più diffusi tool di sviluppo consentono già di realizzare interfacce web complesse mettendo a disposizione l‘ambiente visuale per l‘utilizzo dei componenti che l‘implementazione JSF mette a disposizione.
JSF quindi si occupa di indirizzare lo sviluppo dell‘interfaccia dell‘applicazione e non del livello di business-logic, per il quale restano validi tutti i concetti conosciuti.
Uno degli elementi fondamentali di JSF è quindi un insieme di componenti che rappresentano gli elementi più comuni di un‘interfaccia web e alcune librerie di custom-tag per l‘utilizzo di questi componenti nelle pagine JSP.
In JSF gli elementi di una pagina JSP sono rappresentati lato server da un albero di oggetti che rappresenta lo stato dell‘interfaccia in ogni momento del suo ciclo di vita.
Gli elementi principali che costituiscono JSF possono essere quindi così riassunti:
- Un insieme di componenti di interfaccia predefiniti. JSF comprende un insieme di componenti pronti per l‘uso che rispondono alla gran parte delle comuni necessità di sviluppo di una interfaccia web.
- Un modello di sviluppo “event-driven”. Il modello di sviluppo di JSF è a eventi. Gli eventi sono costituiti dalle azioni che l‘utente effettua sui componenti di interfaccia. A questi eventi vengono registrati dei listener per la gestione server-side degli stessi.
- Un modello a componenti. Ogni elemento dell‘interfaccia è realizzato da un componente, una classe che implementa una interfaccia stabilita. Questo modello fornisce al framework modularità , riusabilità ed estensibilità in quanto è possibile realizzare i propri componenti custom qualora le esigenze lo richiedessero.
I servizi di JSF
Gli strumenti messi a disposizione da JSF forniscono i servizi tipici di cui ha bisogno uno sviluppatore di applicazioni web:
- Conversioni di tipo. Come è noto, un client web può inviare via HTTP al server solo delle stringhe. È quindi poi necessario convertire queste stringhe in valori corrispondenti ai tipi necessari per il livello di Model. JSF fornisce gli strumenti per automatizzare e rendere molto semplice questa conversione
- Validazione. La validazione dei campi di un form è uno dei compiti più comuni e ripetitivi nello sviluppo dell‘interfaccia web. JSF fornisce una serie di validatori standard per le esigenze tipiche, che sollevano lo sviluppatore dal realizzare questa attività di scarso valore aggiunto, e mette a disposizione un modello di sviluppo che consente di realizzare molto semplicemente validatori custom.
- Binding tra campi di interfaccia e attributi di JavaBean. I dati immessi lato client nell‘interfaccia web di una applicazione devono poi essere contenuti in oggetti lato server che modellano le entità sulle quali devono andare ad agire le elaborazioni del livello di Model. I dati di interfaccia, dopo essere stati convertiti in valori di tipo opportuno ed essere stati sottoposti a validazione, devono andare a popolare opportuni attributi di JavaBean. JSF fornisce gli strumenti per effettuare questa operazione di “binding” in modo automatico e dichiarativo.
- Gestione del Flusso di Navigazione. Una parte molto importante di una applicazione web è la gestione del flusso di navigazione tra le pagine web che la costituiscono. JSF, analogamente a quanto fatto ad esempio in Struts, consente di definire in maniera semplice ed esternamente al codice la logica di navigazione della propria applicazione.
- Rendering dei componenti. Un aspetto molto importante in JSF è la separazione tra il comportamento di un elemento di interfaccia e la sua rappresentazione grafica. L‘elemento di interfaccia viene modellato da una classe che ne definisce il comportamento. L‘aspetto grafico, ovvero la sua “renderizzazione”, è a carico di una classe completamente distinta, un Renderer appunto. Ciò significa che una stessa interfaccia può essere “renderizzata” in formati diversi senza modificarne il comportamento funzionale. Ovviamente il Renderer Kit standard fornito con la reference implemetation di JSF è quello per l‘HTML, ma ne esistono altri e nulla vieta di personalizzarli o di svilupparne di nuovi.
- Gestione degli errori. JSF ha i meccanismi necessari per la gestione degli errori e per la segnalazione degli stessi al livello di interfaccia.
- Internazionalizzazione. JSF supporta la gestione dell‘internazionalizzazione di una applicazione web con strumenti molto simili a quelli già in uso in altri framework.
La Figura 1, tratta da [4], rappresenta lo schema architetturale di JSF e sintetizza graficamente quanto esposto.
Figura 1 – L‘architettura di JSF.
Come è facile osservare, JSF oltre a fornire servizi già presenti in altri framework introduce un livello di astrazione più elevato, analogamente a quanto fece Struts rispetto a Servlet e JSP. Come raffigurato molto efficacemente nella Figura 2, tratta da [5], se pensiamo l‘infrastruttura di una applicazione web come uno stack di servizi che partono da un livello di astrazione minimo fino a un livello più alto, vediamo come i servizi di JSF forniscono uno strato di astrazione più elevato rispetto a quelli forniti da Struts, che già a loro volta erano più in alto nella pila rispetto a quelli dell‘implementazione standard di Servlet e JSP.
Figura 2 – I servizi di una infrastruttura web
Struts ad esempio non fornisce un modello per la rappresentazione lato server degli elementi dell‘interfaccia web e non ha un modello di sviluppo a eventi. JSF introduce questi concetti svincolando lo sviluppatore dalla gestione tramite codice di oggetti quali request e response, gestione che è invece ora totalmente a carico del framework.
perché JSF?
È lecito chiedersi la ragione nell‘adottare un nuovo framework quando ne esistono già numerosi altri, uno su tutti Struts, già sperimentati, conosciuti e ormai maturi e affidabili.
La discussione potrebbe essere lunga ed eventuali scelte andrebbero valutate caso per caso. Va anche detto che è possibile ad esempio integrare JSF con Struts se si volesse reingegnerizzare l‘interfaccia web di una applicazione lasciando però inalterato tutto il codice già realizzato per la parte di business-logic. Le possibilità sono molte e alcune di queste le affronteremo nei successivi articoli di approfondimento.
Alcuni aspetti, però, fanno di JSF senza dubbio l‘opzione privilegiata nella scelta di un framework di sviluppo in un progetto che parte da zero:
- Standardizzazione. A differenza di tutti gli altri framework, JSF fa parte della specifica Java EE, ed è quindi oggi il framework standard per lo sviluppo dello strato web. Questo fa sì che tutti gli sviluppatori di applicazioni web possano riferirsi a un unico modello riducendo così la frammentazione oggi esistente e accrescendo la condivisione delle conoscenze e le possibilità di estensione delle funzionalità del framework stesso.
- Supporto negli ambienti di sviluppo. JSF è standard ed è supportato da tutti gli ambienti di sviluppo Java EE. Ciò precedentemente non avveniva, fatta eccezione probabilmente solo per Struts che costituiva uno standard de facto. La logica a componenti di JSF consente a questi tool di fornire allo sviluppatore un ambiente RAD per lo sviluppo dell‘interfaccia web aumentando notevolmente la produttività rispetto alle metodologie di sviluppo precedentemente in uso nel mondo Java EE.
- Struttura a componenti.Questa è la vera novità di JSF. Ogni elemento dell‘interfaccia è un componente riusabile e ciò rende l‘architettura molto ben strutturata, modulare ed estensibile. In JSF una pagina web corrisponde lato server a un albero di oggetti che ne rappresentano gli elementi. Esistono implementazioni di componenti JSF, quali ad esempio i componenti ADF di Oracle, che vengono ora distribuiti in modalità open source, che estendono le potenzialità di JSF e costituiscono un tipico esempio di come sia possibile arricchirne le funzionalità .
Conclusioni
In questo articolo abbiamo introdotto alcuni concetti di base su Java Server Faces. Concetti che diverranno molto più chiari e comprensibili quando saranno affrontati uno a uno i vari elementi di JSF. Dall‘approfondimento che sarà fatto nei prossimi articoli, appariranno evidenti gli elementi di novità introdotti nel modello di sviluppo di JSF e i notevoli vantaggi che essi portano nello sviluppo delle applicazioni web Java EE.
Riferimenti
[1] Alfredo Larotonda, “Sviluppare applicazioni J2EE con Jakarta Struts” Mokabyte Gennaio/Settembre 2004
[2] Mario Casari “Spring” Mokabyte Ottobre 2006/Marzo 2007
[3] David Geary – Cay Horstmann, “Core Java Server Faces”, Sun Microsystems Press, 2004
[4] Bill Dudney – Jonathan Lehr – Bill Willis – LeRoy Mattingly, “Mastering Java Server Faces”, Wiley Publishing Inc., 2004
[5] Kito D. Mann, “Java Server Faces In Action”, Manning Publications Co., 2005
Alfredo Larotonda, laureato in Ingegneria Elettronica, lavora da diversi anni nel settore IT. Dal 1999 si occupa di Java ed in particolare dello sviluppo di applicazioni web J2EE. Dopo diverse esperienze di disegno e sviluppo di applicazioni web per il mercato finanziario e industriale, si occupa ora in particolare di aspetti architetturali per progetti rivolti al mercato della pubblica amministrazione. È Sun Certified Enterprise Architect (SCEA) e ha inoltre conseguito le certificazioni SCJP, SCWCD 1.3, SCWCD 1.4, SCBCD.