webentwicklung-frage-antwort-db.com.de

Wann werden <ui: include>, Tag-Dateien, Verbundkomponenten und / oder benutzerdefinierte Komponenten verwendet?

Ich habe kürzlich angefangen, JSF 2.0 mit Facelets zu verwenden und war verwirrt über neue Verbundkomponenten, die wissen, dass es <ui:include> und andere von Facelets 1.x angebotene Template-Techniken.

Was ist der Unterschied zwischen diesen Ansätzen? Funktional scheinen sie ungefähr dasselbe zu bieten: <ui:param> vs <cc:attribute>, <ui:insert> + <ui:define> vs Tag-Dateien, Wiederverwendung der vorhandenen Vorlagen. Gibt es außer der Syntax und der eindeutigen Schnittstellenspezifikation bei Verbundkomponenten noch etwas anderes? Könnte die Leistung abweichen?

94
mrembisz

Was ist der Unterschied zwischen diesen Ansätzen?

Facelet-Vorlagen

Verwenden Sie Facelet-Vorlagen (wie in <ui:composition>, <ui:include> Und <ui:decorate>), Wenn Sie Hauptseitenlayout-Fragmente in wiederverwendbare Vorlagen aufteilen möchten. Z.B. 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 Codeduplizierungen zu verhindern/zu minimieren. Z.B. Eine Gruppe von Label-, Eingabe- und Nachrichtenkomponenten. Der Hauptunterschied zu zusammengesetzten Komponenten besteht darin, dass die Ausgabe einer Facelet-Tag-Datei kein einzelnes UIComponent darstellt und unter Umständen die einzige Lösung ist, wenn eine zusammengesetzte Komponente nicht ausreicht. Im Allgemeinen ist ein <ui:include> Mit einem oder mehreren <ui:param>, Die eine verwaltete Bean-Eigenschaft (und somit keinen fest codierten Wert) übergeben, 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 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. Z.B. eine Komponente, die eine einzelne Java.util.Date - Eigenschaft durch 3 abhängige <h:selectOneMenu> - Komponenten darstellt, oder eine Komponente, die <p:fileUpload> und <p:imageCropper> zu einer einzelnen <my:uploadAndCropImage> Verweisen einer einzelnen benutzerdefinierten com.example.Image - Entität als Eigenschaft.

Beispiele:

Kundenspezifische Komponenten

Verwenden Sie eine benutzerdefinierte Komponente, wenn die Funktionalität mit Facelet-Tag-Dateien oder zusammengesetzten Komponenten nicht erreicht werden kann, da die Standard-/verfügbaren Komponentensätze keine Unterstützung bieten. Beispiele finden Sie überall im Quellcode von Open-Source-Komponentenbibliotheken wie PrimeFaces und OmniFaces .

Tag-Handler

Wenn Sie den Aufbau 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.


Kann die Leistung abweichen?

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 Wartbarkeit der Implementierung getroffen werden. Jeder Ansatz hat seinen eigenen, genau definierten Zweck und seine eigenen Einschränkungen.

Zusammengesetzte Komponenten haben jedoch einen erheblichen Aufwand beim Erstellen/Wiederherstellen der Ansicht (insbesondere beim Speichern/Wiederherstellen des Ansichtsstatus). In älteren Versionen von Mojarra traten bei Verbundkomponenten Leistungsprobleme bei der Zuweisung von Standardwerten auf. Dies wurde bereits seit 2.1.13 behoben. Auch Mojarra hatte ein Speicherverlust wenn ein <cc:attribute method-signature> Für Methodenausdrücke verwendet wird, wird im Grunde der gesamte Komponentenbaum in der HTTP-Sitzung neu referenziert, dies ist seit 2.1.29 behoben/2.2.8. 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 zusammengesetzte Komponenten haben und javax.faces.STATE_SAVING_METHOD Auf client gesetzt haben, ist die Leistung ein Schmerz. Missbrauchen Sie keine Composite-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: Keine *.taglib.xml - Datei erforderlich) nicht als Ausrede, um zusammengesetzte Komponenten gegenüber Tag-Dateien vorzuziehen.

Vergessen Sie bei Verwendung von Mojarra 2.2.10 oder älter nicht, die relativ kurze Aktualisierungszeit für 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 die Änderungen in den Facelets-Dateien übernommen werden! Mojarra 2.2.11 und neuer und MyFaces haben bereits den Standardwert -1, Wenn javax.faces.PROJECT_STAGE Nicht auf Development gesetzt ist.

167
BalusC