Quando utilizzare , tag file, componenti compositi e / o componenti personalizzati?

Ho iniziato a utilizzare JSF 2.0 con Facelets di recente e sono rimasto perplesso dai nuovi componenti compositi che conoscevano le e altre tecniche di template offerte da Facelets 1.x.

Qual è la differenza tra questi approcci? Funzionalmente sembrano offrire lo stesso: vs , + vs tag files, riutilizzo dei template esistenti. C’è qualcosa oltre alla syntax e una chiara specifica dell’interfaccia in caso di componenti compositi? Le prestazioni potrebbero differire?

Qual è la differenza tra questi approcci?

Modelli di facelet

Usa i modelli di Facelet (come in , e ) se vuoi dividere i frammenti del layout della pagina principale in modelli riutilizzabili. Ad esempio, intestazione, menu, contenuto, piè di pagina, ecc.

Esempi:

  • Come includere un altro XHTML in XHTML usando Facelets JSF 2.0?
  • Qual è la vera differenza concettuale tra ui: decor e ui: include?
  • Come personalizzare h: head quando si utilizza ui: template composizione?
  • Come cambiare gli elementi principali di una pagina quando si utilizza ui: composizione
  • In che modo ajax-refresh dinamico includere il contenuto dal menu di navigazione? (SPA JSF)

File tag Facelet

Utilizzare i file di tag Facelet se si desidera avere un gruppo riutilizzabile di componenti al fine di prevenire / minimizzare la duplicazione del codice. Ad esempio un gruppo di etichette + input + componenti del messaggio. La principale differenza con i componenti compositi è che l’output di un file di tag Facelet non rappresenta un singolo UIComponent e può in alcune circostanze essere l’unica soluzione quando un componente composito non è sufficiente. Generalmente, avere un con uno o più è un segnale che il file include può essere meglio un file di tag.

Esempi:

  • Come creare un tag Facelets personalizzato?
  • Come creare una griglia di componenti compositi JSF?
  • Come creare un componente composito per una colonna datatable?
  • Primefaces outputLabel per componente composito

Componenti compositi

Utilizzare i componenti compositi se si desidera creare un UIComponent personalizzato singolo e riutilizzabile con una singola responsabilità utilizzando puro XML. Un tale componente composito di solito consiste in un gruppo di componenti e / o HTML esistenti e viene reso fisicamente come componente singolo e si suppone che sia associato a una singola proprietà bean. Ad esempio un componente che rappresenta una singola proprietà java.util.Date di 3 dipendenti , o un componente che combina e in un singolo fa riferimento a un singolo personalizzato com.example.Image entity framework come proprietà.

Esempi:

  • La nostra pagina wiki del componente composito
  • Il codice BalusC: Componente composita con più campi di input
  • Dividere java.util.Date su due h: campi di inputText che rappresentano ora e minuti con f: convertDateTime
  • Seleziona tutti gli elementi in Multiple SelectManyCheckBox con ID dinamici
  • Estensione del componente commandLink JSF
  • Evitare gli ID duplicati quando si riutilizzano le composizioni facelets nello stesso contenitore di denominazione

Componenti personalizzati

Utilizzare un componente personalizzato ogni volta che non è ansible ottenere la funzionalità con i file di tag Facelet o i componenti compositi, a causa della mancanza di supporto nel set di componenti standard / disponibile. Gli esempi possono essere trovati su tutto il posto nel codice sorgente delle librerie di componenti open source come PrimeFaces e OmniFaces .

Tag gestori

Quando si desidera controllare la costruzione dell’albero dei componenti JSF invece del rendering dell’output HTML, è necessario utilizzare un gestore tag anziché un componente.

Esempi:

  • Componente Facelet personalizzato in JSF
  • Come posso accedere al contenuto di qualcosa creato con a livello di codice?
  • Rendering condizionale nel file di tag a seconda che l’attributo sia specificato o meno
  • Esecuzione di un reindirizzamento, quando la conversione / convalida associata ai parametri di ricerca non riesce

Progetti di esempio

Ecco alcuni progetti di esempio che utilizzano tutte le tecniche sopra citate.

  • Java EE Kickoff App ( modelli – include – tagfile – composito )
  • OmniFaces Showcase ( modelli – include – tagfile – composito )

Le prestazioni potrebbero differire?

Tecnicamente, il problema delle prestazioni è trascurabile. La scelta dovrebbe essere fatta sulla base dei requisiti funzionali concreti e del grado finale di astrazione, riusabilità e manutenibilità dell’attuazione. Ogni approccio ha il suo scopo e le sue limitazioni ben definiti.

I componenti compositi hanno tuttavia un overhead significativo durante la costruzione / il ripristino della vista (in particolare: durante il salvataggio / ripristino dello stato della vista). E, nelle vecchie versioni di Mojarra, i componenti compositi avevano problemi di prestazioni con l’assegnazione di valori predefiniti, questo è già stato risolto dal 2.1.13. Inoltre, Mojarra ha avuto una perdita di memoria quando un è usato per le espressioni del metodo, in pratica l’intero albero dei componenti è rinviato nella sessione HTTP, questo è risolto dal 2.1.29 / 2.2.8. La perdita di memoria può essere ignorata nelle precedenti versioni 2.1 come di seguito:

  com.sun.faces.serializeServerState true  

O nelle versioni precedenti 2.2 come di seguito:

  javax.faces.SERIALIZE_SERVER_STATE true  

Tuttavia, quando si hanno relativamente “molti” componenti compositi e si ha javax.faces.STATE_SAVING_METHOD impostato su client , le prestazioni saranno un problema. Non abusare dei componenti compositi se si desidera semplicemente la funzionalità di base che è già ansible con un semplice file di inclusione o file di tag. Non utilizzare la facilità di configurazione (leggi: nessun file *.taglib.xml necessario) come scusa per preferire i componenti compositi su file di tag.

Quando si utilizza Mojarra 2.2.10 o precedente, non dimenticare di distriggersre il periodo di aggiornamento Facelets relativamente breve per la modalità di produzione:

  javax.faces.FACELETS_REFRESH_PERIOD -1  

Non usare questa impostazione per lo sviluppo, altrimenti devi riavviare l’intero server per far riflettere le modifiche nei file Facelets! Mojarra 2.2.11 e successivi e MyFaces è già impostato su -1 quando javax.faces.PROJECT_STAGE non è impostato su Development .