JavaServer Faces è come sappiamo un framework per la progettazione lato server dei componenti di interfaccia utente basato sul pattern MVC, e costituisce sin dalle primissime versioni un tentativo di standardizzare lo sviluppo di interfacce web nel mondo Java EE mediante un modello architetturale a componenti, e per eventi molto flessibile e solido.
A partire dalla versione 2 JSF sta prendendo una strada interessante e più matura, facendo leva sulle richieste fatte dalla comunità e sintetizzando le esperienze tratte da altri progetti (Ricordiamo che McClanahan è ad esempio autore di JSF così come di struts).
In particolare, le numerose richieste degli sviluppatori sono state incanalate in alcune linee evolutive principali che guardano la semplicità di sviluppo, l' estensione del framework con nuove caratteristiche, il miglioramento delle performance, ed incentivi agli sviluppatori per l'adozione della tecnologia. Molte richieste all'interno del community process sono in effetti caratteristiche interessanti prese da progetti come Seam, Ajax4JSF, Shale, Facelets, ADF, struts, ed altri: è evidente che l'ambizione è quella di arrivare nelle prossime versioni ad un framework che metta insieme le caratteristiche migliori dei vari progetti.
Principali caratteristiche e linee guida di sviluppo
Alcuni aspetti appaiono particolarmente interessanti, all'interno di quelle che sembrano essere le tendenze principali per il futuro di JSF:
- configurazioni
- minimizzazione delle configurazioni XML (in faces-config.xml) tramite l' utilizzo di annotazioni
- Managed Beans: Un Sistema di dependency injection (che si interfaccia facilmente con CDI, Spring, o Guice) – chiamato anche "Backing Beans" o "Page Beans"
- integrazione sempre più stretta con Ajax, con la definizione di una Ajax Javascript API per l'interazione con JSF, tramite il tag <f:ajax />
- eventi
- Supporto per il bookmarking & page-load actions: sviluppo di un modello client-centrico di gestione degli eventi intra-pagina.
- Server-side event model: per il dispatch di eventi e l’attach di listeners alle funzionalità di sistema, come ad esempio "Before Render Response" o "After Validation"
- integrazione standard con Facelets (in sostituzione del modello sequenziale di interpretazione di jsp)
- Integrazione con Unified Expression Language (EL), che è il cuore delle funzionalità di JSF. Le view devono accedere ai campi dei bean ed i relativi metodi tramite EL:
<my:component rendered="#{myBean.userLoggedIn}" />
- Due librerie XML-based tag (core and html) per esprimere una interfaccia JavaServer Faces con una view template (puo’ essere usata sia con le JSP che con Facelets)
- Integrazione con Unified Expression Language (EL), che è il cuore delle funzionalità di JSF. Le view devono accedere ai campi dei bean ed i relativi metodi tramite EL:
- template html
- un set di componenti HTML e specifiche UI , per semplificare lo sviluppo di componenti custom
- Un sistema basato sui template, per una rapida creazione di componenti - senza l’uso di classi java e la creazione di skin e temi dei componenti
Semplicità di sviluppo
La produttività e la semplicità nello sviluppo sono fattori cardine per il successo di un framework, e in effetti in ambito Java EE sono sempre stati indicati come i principali ambiti di miglioramento. Tra le richieste che la nuova specifica si propone di indirizzare ci sono diversi importanti aspetti che riguardano questi temi:
- semplificazione dello sviluppo di componenti;
- possibilità di usare le annotazioni per dichiarare i vari componenti JSF per arrivare ad un'applicazione con il minimo di file XML di configurazione;
- fornire un meccanismo standard di gestione delle eccezioni;
- possibilità di scelta di differenti contesti di runtime dell'applicazione quali: sviluppo, test, produzione;
- possibilità di utilizzo di tecnologie consolidate per il templating delle viste.
Altra cosa interessante che già compare nella specifica è la definizione della proprietà ProjectStage. Questa proprietà può assumere uno tra i valori definiti come costanti della classe javax.faces.application.ProjectStage
: "Development", "UnitTest", "SystemTest", o "Production". Il valore può essere configurato mediante un context init-parameter come segue:
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
A runtime, il valore configurato può essere acquisito dall'oggetto Application
invocando il metodo Application.getProjectStage()
. L'idea è quella di condizionare il comportamento dell'applicazione a seconda dello stadio dello sviluppo della stessa: ciò può consentire di attivare messaggi di errore, controlli o altre funzionalità solo nello stadio di sviluppo desiderato a scopo di testing e validazione.
Altra interessante novità è quella dell'utilizzo delle annotazioni nei Managed Beans. Interessanti ad esempio la @PostConstruct
, che serve a marcare un metodo che deve andare in esecuzione dopo che il container ha eseguito l'iniezione delle risorse ma prima che il bean sia memorizzato nello scope, così come la @PreDestroy
che marca un metodo che va in esecuzione prima che il bean sia eliminato dallo scope o che lo scope stesso venga distrutto.
Nuove caratteristiche
In questa area sono molte le caratteristiche introdotte a seguito di richieste pervenute all'Expert Group, molte delle quali scaturite dall'esperienza in altri progetti paralleli a JSF.
javascript
Vengono introdotte delle API JavaScript che rendono disponibile allo sviluppatore di JSF le potenzialità di Ajax e gli consente di iniziare richieste Ajax al framework. Vengono inoltre descritti alcuni interessanti use-case quali "Partial Tree Traversal" e "Partial Page Update". Molto interessante è la possibilità di visitare un particolare nodo del tree e di eseguire l'elaborazione a partire da una richiesta fatta dal client con Ajax. Altrettanto interessante è la possibilità di aggiornare singole porzioni di pagina lato client, cosa già possibile e mutuata dai componenti ADF Faces. Queste caratteristiche ancora non del tutto specificate fanno capire come l'integrazione tra Ajax e JSF sia uno dei filoni chiave per l'evoluzione del framework.
ciclo di vita delle JSF
viene utilizzata una separazione logica del ciclo di vita di elaborazione delle richieste in due fasi distinte, quella di esecuzione e quella di renderizzazione. Questa suddivisione logica renderà molto più semplice la gestione del ciclo di vita JSF in ambito portlet, uno dei filoni di maggiore sviluppo nel mondo Java EE.
risorse
altra novità è l'introduzione di uno standard nella gestione delle risorse dell'applicazione, dove per risorse si intendono tutti quegli artifact di cui un componente ha bisogno quali file CSS, JavaScript, immagini etc. La nuova versione di JSF definisce un packaging standard per queste risorse, cosa inesistente nelle precedenti release. Il framework individuerà le risorse in due percorsi standard:
/resources
: in questa cartella al di sotto della root dell'applicazione saranno presenti le risorse della web application/META-INF/resources
: questa cartella rappresenta le risorse nel classpath
La specifica definisce inoltre un meccanismo standard per l'individuazione delle risorse che comprende anche un numero di versione, il che consente , cosa davvero interessante, di aggiornare la versione di una risorsa a run-time senza dover effettuare nuovamente il deploy o riavviare l'applicazione.
Performance
Per quanto riguarda il ruolo chiave delle prestazioni, possiamo individuare alcuni miglioramenti importanti:
- è possibile evitare di ripristinare ogni volta l'intero stato di un “albero di componenti” (che rappresenta l’alter-ego Java dei tag che utilizzeremo nella nostra pagina), concentrandoci soltanto sulle variazioni, cioè sulla parte che ci interessa.
- avere un controller "client-side" che sia in grado di gestire la gran parte degli eventi intra-pagina ed evitare così i tempi di latenza (round trip time) con il server.
- migliorare la gestione del PhaseListener in modo che lo sviluppatore possa controllare in modo preciso quali richieste debbano essere elaborate dal Listener.
Adozione della tecnologia
Per incentivare l'adozione della tecnologia la specifica contiene l'attenzione ad alcuni punti chiave:
- Consentire l'uso di alcune caratteristiche di JSF anche in applicazioni che non usano JSF in toto. Ad esempio la definizione dei managed-bean potrebbe risultare utile anche in applicazioni che utilizzano esclusivamente servlet.
- Facilitare l'implementazione di funzionalità lato client quali drag&drop pensando ad un ciclo di vita "client-side".
- Stabilire una modalità standard di definizione per "skin" e temi dei componenti.
- Miglioramento della specifica dei componenti per facilitare l'integrazione con librerie di componenti di terze parti.
- Miglioramento delle possibilità di comunicazione ed integrazione bidirezionale fra JSF e servizi REST.