Was ist der Unterschied zwischen diesen Ansätzen?
Facelet-Vorlagen
Verwenden Facelet Vorlagen (wie in <ui:composition>
, <ui:include>
und <ui:decorate>
) , wenn Sie Haupt-Seitenlayout - Fragmente in wiederverwendbare Vorlagen spalten. ZB Kopfzeile, Menü, Inhalt, Fußzeile usw.
Beispiele:
Facelet-Tag-Dateien
Verwenden Sie Facelet-Tag-Dateien, wenn Sie eine wiederverwendbare Gruppe von Komponenten haben möchten, um Codeduplikationen zu verhindern / zu minimieren. ZB eine Gruppe von Label + Input + Message-Komponenten. Der Hauptunterschied zu zusammengesetzten Komponenten besteht darin, dass die Ausgabe einer Facelet-Tag-Datei keine einzelne darstellt UIComponent
und unter bestimmten Umständen die einzige Lösung darstellt, wenn eine zusammengesetzte Komponente nicht ausreicht. Im Allgemeinen ist eine <ui:include>
mit einer oder mehreren, <ui:param>
die eine verwaltete Bean-Eigenschaft (und damit kein fest codierter Wert) übergibt, ein Signal dafür, dass die Include-Datei besser eine Tag-Datei sein kann.
Beispiele:
Verbundbauteile
Verwenden Sie zusammengesetzte Komponenten, wenn Sie eine einzelne und wiederverwendbare benutzerdefinierte Komponente UIComponent
mit einer einzigen Verantwortung unter Verwendung von reinem XML erstellen möchten . Eine solche zusammengesetzte Komponente besteht normalerweise aus einer Reihe vorhandener Komponenten und / oder HTML und wird physisch als einzelne Komponente gerendert und soll an eine einzelne Bean-Eigenschaft gebunden sein. ZB eine Komponente, die eine einzelne java.util.Date
Eigenschaft durch 3 abhängige <h:selectOneMenu>
Komponenten darstellt, oder eine Komponente, die eine einzelne benutzerdefinierte Entität als Eigenschaft kombiniert <p:fileUpload>
und <p:imageCropper>
zu einer einzelnen <my:uploadAndCropImage>
verweist com.example.Image
.
Beispiele:
Benutzerdefinierte Komponenten
Verwenden Sie eine benutzerdefinierte Komponente, wenn die Funktionalität mit Facelet-Tag-Dateien oder zusammengesetzten Komponenten nicht erreicht werden kann, da der Standard- / verfügbare Komponentensatz keine Unterstützung bietet. Beispiele finden sich überall im Quellcode von Open-Source-Komponentenbibliotheken wie PrimeFaces und OmniFaces .
Tag-Handler
Wenn Sie die Erstellung des JSF-Komponentenbaums steuern möchten, anstatt die HTML-Ausgabe zu rendern, sollten Sie anstelle einer Komponente einen Tag-Handler verwenden.
Beispiele:
Beispielprojekte
Hier sind einige Beispielprojekte, die alle oben genannten Techniken verwenden.
Könnte sich die Leistung unterscheiden?
Technisch gesehen ist das Leistungsproblem vernachlässigbar. Die Auswahl sollte auf der Grundlage der konkreten funktionalen Anforderungen und des endgültigen Abstraktionsgrades, der Wiederverwendbarkeit und der Wartbarkeit der Implementierung erfolgen. Jeder Ansatz hat seinen eigenen, genau definierten Zweck und seine eigenen Grenzen.
Zusammengesetzte Komponenten haben jedoch einen erheblichen Overhead beim Erstellen / Wiederherstellen der Ansicht (insbesondere: beim Speichern / Wiederherstellen des Ansichtsstatus). In älteren Versionen von Mojarra hatten Verbundkomponenten Leistungsprobleme beim Zuweisen von Standardwerten. Dies ist bereits seit 2.1.13 behoben. Außerdem hatte Mojarra einen Speicherverlust, wenn a <cc:attribute method-signature>
für Methodenausdrücke verwendet wird. Im Grunde wird der gesamte Komponentenbaum in einer HTTP-Sitzung erneut referenziert. Dies ist seit 2.1.29 / 2.2.8 behoben. Der Speicherverlust kann in älteren 2.1-Versionen wie folgt umgangen werden:
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
Oder in älteren 2.2-Versionen wie folgt:
<context-param>
<param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
<param-value>true</param-value>
</context-param>
Wenn Sie jedoch relativ "viele" Verbundkomponenten haben und sich darauf javax.faces.STATE_SAVING_METHOD
eingestellt haben client
, wird die Leistung schmerzhaft sein. Missbrauchen Sie keine zusammengesetzten Komponenten, wenn Sie lediglich die Grundfunktionalität wünschen, die bereits mit einer einfachen Include- oder Tag-Datei möglich ist. Verwenden Sie die einfache Konfiguration (lesen Sie: keine *.taglib.xml
Datei erforderlich) nicht als Ausrede, um zusammengesetzte Komponenten Tag-Dateien vorzuziehen.
Vergessen Sie bei Verwendung von Mojarra 2.2.10 oder älter nicht, die relativ kurze Aktualisierungszeit von Facelets für den Produktionsmodus zu deaktivieren:
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>-1</param-value>
</context-param>
Verwenden Sie diese Einstellung nicht für die Entwicklung, da Sie sonst den gesamten Server neu starten müssen, damit Änderungen in den Facelets-Dateien übernommen werden! Mojarra 2.2.11 und neuer, und MyFaces ist bereits standardmäßig auf -1
wann javax.faces.PROJECT_STAGE
nicht eingestellt Development
.
NamingContainer
werden. Andernfalls treten Probleme mit doppelten IDs auf, wenn dieselbe Komponente mehrmals wiederverwendet wird.Image
Eigenschaft gebunden in Bohne.