Qual è la differenza tra questi approcci?
Modelli di facelet
Usa i modelli Facelet (come in <ui:composition>
, <ui:include>
e <ui:decorate>
) se vuoi dividere i frammenti del layout della pagina principale in modelli riutilizzabili. Ad esempio intestazione, menu, contenuto, piè di pagina, ecc.
Esempi:
File di tag facelet
Utilizza i file dei tag Facelet se desideri disporre di un gruppo di componenti riutilizzabili per prevenire / ridurre al minimo la duplicazione del codice. Ad esempio un gruppo di componenti etichetta + input + messaggio. La principale differenza con i componenti compositi è che l'output di un file di tag Facelet non rappresenta un singolo UIComponent
e in alcune circostanze può essere l'unica soluzione quando un componente composito non è sufficiente. Generalmente, avere un <ui:include>
con uno o più file<ui:param>
che passa una proprietà del bean gestito (e quindi non un valore hardcoded) è un segnale che il file include può essere meglio un file di tag.
Esempi:
Componenti compositi
Usa componenti compositi se vuoi creare un custom unico e riutilizzabile UIComponent
con un'unica responsabilità usando XML puro. Un tale componente composito di solito consiste in un gruppo di componenti esistenti e / o HTML e viene reso fisicamente come singolo componente e si suppone che sia associato a una singola proprietà del bean. Ad esempio un componente che rappresenta una singola java.util.Date
proprietà da 3 <h:selectOneMenu>
componenti dipendenti , o un componente che combina <p:fileUpload>
e <p:imageCropper>
in un unico <my:uploadAndCropImage>
riferimento a una singola abitudinecom.example.Image
entità come proprietà.
Esempi:
Componenti personalizzati
Utilizzare un componente personalizzato ogni volta che la funzionalità non può essere ottenuta con file di tag Facelet o componenti compositi, a causa della mancanza di supporto nel set di componenti standard / disponibile. Esempi possono essere trovati ovunque nel codice sorgente di librerie di componenti open source come PrimeFaces e OmniFaces .
Gestori di tag
Quando si desidera controllare la creazione dell'albero dei componenti JSF invece del rendering dell'output HTML, è necessario utilizzare un gestore di tag invece di un componente.
Esempi:
Progetti di esempio
Ecco alcuni progetti di esempio che utilizzano tutte le tecniche sopra menzionate.
Le prestazioni potrebbero differire?
Tecnicamente, la preoccupazione per le prestazioni è trascurabile. La scelta dovrebbe essere fatta sulla base dei requisiti funzionali concreti e del grado finale di astrazione, riusabilità e manutenibilità dell'implementazione. Ogni approccio ha il proprio scopo e i propri limiti ben definiti.
I componenti compositi hanno tuttavia un sovraccarico significativo durante la costruzione / ripristino della vista (in particolare: durante il salvataggio / ripristino dello stato di visualizzazione). E, nelle versioni precedenti di Mojarra, i componenti compositi avevano problemi di prestazioni con l'assegnazione dei valori predefiniti, questo è già stato risolto dalla 2.1.13. Inoltre, Mojarra ha avuto una perdita di memoria quando a <cc:attribute method-signature>
viene utilizzato per le espressioni del metodo, fondamentalmente l'intero albero dei componenti viene ri-referenziato nella sessione HTTP, questo è stato risolto dalla 2.1.29 / 2.2.8. La perdita di memoria può essere aggirata nelle versioni 2.1 precedenti come di seguito:
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
O nelle versioni 2.2 precedenti come di seguito:
<context-param>
<param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
<param-value>true</param-value>
</context-param>
Tuttavia, quando si hanno relativamente "molti" componenti compositi e si è javax.faces.STATE_SAVING_METHOD
impostato suclient
, le prestazioni saranno un dolore. Non abusare dei componenti compositi se desideri semplicemente la funzionalità di base che è già possibile con un semplice file include o tag. Non utilizzare la facilità di configurazione (leggi: nessun *.taglib.xml
file necessario) come scusa per preferire i componenti compositi ai file di tag.
Quando si utilizza Mojarra 2.2.10 o versioni precedenti, non dimenticare di disabilitare il periodo di aggiornamento dei Facelets relativamente breve per la modalità di produzione:
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>-1</param-value>
</context-param>
Non utilizzare questa impostazione per lo sviluppo, altrimenti devi riavviare l'intero server per far sì che le modifiche nei file Facelets si riflettano! Mojarra 2.2.11 e versioni successive e MyFaces è già impostato su -1
quando javax.faces.PROJECT_STAGE
non è impostato su Development
.