Ai fini della tutela della privacy (D.Lgs 196/2003) i dati inseriti nel presente form non saranno in alcun modo memorizzati. Per evitare che questo servizio venga utilizzato per inviare mail anonime, nel corpo del messaggio verrà inserito il tuo indirizzo IP.
Facelets
Quando è stata introdotta la tecnologia JavaServer Faces si pensava di utilizzarla congiuntamente alle JavaServer Pages nella creazione delle pagine di una web application.
Come è noto però, il ciclo di vita JavaServer Faces è composto da diverse fasi e a differenza di JSP che processa gli elementi di una pagina nell’ordine in cui questi appaiono, JSF organizza i componenti di una pagina in una complessa struttura ad albero.
Tali differenze pongono in essere una serie di incompatibilità legate al fatto che i componenti gestiti da JSP vengono visualizzati in ordine di apparizione all’interno della pagina mentre quelli JSF secondo quanto definito dalla fase di Render Response.
Facelets nasce per sostituire JSP nella creazione delle pagine, superando tali incompatibilità e fornendo i seguenti vantaggi:
indipendenza dal web container
compatibilità con qualsiasi versione JSF
tempi di compilazione più veloci
supporto per il templating
supporto di Expression Language
Per utilizzare Facelets all’interno di una web application è necessario configurare il file web.xml specificando il suffisso delle pagine che utilizzeranno Facelets (per convenzione l’estensione delle pagine che usano Facelets è xhtml):
javax.faces.DEFAULT_SUFFIX.xhtml
Facelets inoltre sostituisce il ViewHandler JSF con la classe FaceletViewHandler del package com.sun.facelets che va indicata all’interno del file faces-config.xml:
com.sun.facelets.FaceletViewHandler
Librerie di tag
Facelets richiede che la pagina XML sia valida, definendo i namespace è possibile inoltre specificare quelle che sono le librerie di tag utilizzate all’interno della pagina.
Nell’esempio precedente si utilizzano tre librerie di tag, la libreria di tag xhtml (senza prefisso), la libreria di tag Facelets con prefisso ui e la libreria di tag HTML di JSF con prefisso h.
Tag Facelets
Il tag ui:component inserisce una nuova istanza di UIComponent nell’albero dei componenti JavaServer Faces o come radice dell’albero o all’interno dell’elemento che lo contiene: ogni cosa all’esterno del tag ui:component viene ignorata.
Gli attributi di ui:component sono due:
id: consente di specificare un identificativo per il componente
binding: consente di fare riferimento alla proprietà di un backing bean dello stesso tipo
...
Il tag ui:composition è usato per incapsulare contenuti che sono usati in altre pagine (templating).
Questo tag ha un attributo template che fa riferimento al path del template che sarà popolato dagli elementi contenuti all’interno di ui:composition.
Nel seguente esempio il contenuto del tag ui:composition viene utilizzato per popolare il tag ui:insert con attributo name pari a menu all’interno del template template.xhtml
Il tag ui:debug è molto utile per effettuare il debugging di una web application, infatti utilizzando la combinazione di tasti Ctrl+Shift+ (dove hotkey è specificata dall’attributo hotkey) è possibile visualizzare l’albero dei componenti e le variabili di scope.
L’attributo opzionale rendered se posto a false non inserisce lo script necessario a visualizzare la finestra di debug nella pagina.
L’elemento ui:decorate è simile all’elemento ui:composition, l’unica differenza è rappresentata dal fatto che non rimuove ciò che non si trova al suo interno.
L’attributo template consente quindi di specificare il path del template che verrà popolato con il contenuto dell’ui:decorate.
Questo non viene cancellato
Contenuto nome1
Contenuto nome2
Questo non viene cancellato
Il tag ui:define viene utilizzato all’interno degli elementi ui:composition e ui:decorate per sostituire al posto dei tag ui:insert presenti nel template (aventi lo stesso attributo name del tag ui:define) il contenuto definito al loro interno.
Contenuto nome1
Nel precedente esempio i tag ui:insert (presenti in template.xhtml) con attributo name pari a “nome1” e “nome2” saranno sostituiti dal contenuto degli elementi ui:define aventi lo stesso attributo name.
Il tag ui:fragment è simile al tag ui:component ma non elimina il contenuto al di fuori di esso.
Questo tag inserisce un UIComponent nell’albero dei componenti impostando come figli tutti gli elementi al suo interno.
Anche gli elementi al di fuori del tag saranno inseriti nell’albero ma non come figli dell’elemento rappresentato dal tag ui:fragment.
Questo non viene eliminato
Questo non viene eliminato
L’elemento ui:include viene utilizzato per includere un altro documento Facelets nella pagina: è possibile includere file che abbiano i tag ui:component e ui:composition o semplicemente frammenti di codice XML o XHTML.
Il tag ui:insert viene utilizzato per specificare in un template le parti sostituibili: ha un attributo name (al quale deve corrispondere l’attributo name del corrispondente ui:define) e può contenere altri elementi al suo interno che vengono visualizzati se il corrispondente ui:define non viene definito.
Nessun titolo inserito
Nessun contenuto definito
Se l’attributo name non viene specificato l’intero contenuto dell’elemento ui:composition che fa riferimento al template sarà inserito al suo posto.
Il tag ui:param viene utilizzato per il passaggio di oggetti fra Facelets, non può contenere elementi al suo interno e ha due attributi:
name: fa riferimento al nome dell’oggetto
value: contiene un’espressione valore EL o un letterale.
Il tag ui:remove è usato per rimuovere blocchi di codice a tempo di compilazione.
Questo sarà rimosso.
Infine il tag ui:repeat viene usato per iterare su una lista di oggetti ed ha due attributi:
value: referenzia la List di oggetti da iterare
var: un nome con il quale si referenzia la lista nel corpo di ui:repeat per accedere ai singoli elementi
#{elemento.valore}
Creare composizioni di componenti
Facelets offre la possibilità di creare delle composizioni di componenti e di registrare tag personalizzati per richiamarli all’interno delle pagine.
Supponiamo di voler creare una combinazione di h:outputText e h:inputText che possa essere inserita in una pagina mediante il tag:
La prima cosa da fare è creare un file xhtml che contenga la composizione dei due elementi
Come vediamo le espressioni EL fanno riferimento agli attributi dell’elemento personalizzato.
Quindi occorre registrare il tag nella corrispondente libreria