Wann verwendet , Tag -Dateien, zusammengesetzte Komponenten und/oder benutzerdefinierte Komponenten?
-
26-10-2019 - |
Frage
Ich habe kürzlich angefangen, JSF 2.0 mit Facelets zu verwenden und wurde von neuen zusammengesetzten Komponenten verwirrt, die vorhanden waren <ui:include>
und andere Vorlagentechniken, die von Facelets 1.x angeboten werden.
Was ist der Unterschied zwischen diesen Ansätzen? Funktionell scheinen sie ungefähr das gleiche zu bieten: <ui:param>
vs <cc:attribute>
, <ui:insert>
+<ui:define>
VS -Tag -Dateien, Wiederverwendung der vorhandenen Vorlagen. Gibt es bei zusammengesetzten Komponenten etwas außer der Syntax- und Klarendinstallationsspezifikation? Könnte die Leistung unterschiedlich sein?
Lösung
Was ist der Unterschied zwischen diesen Ansätzen?
Furelettsvorlagen
Verwenden Sie Furelettsvorlagen (wie in <ui:composition>
, <ui:include>
und <ui:decorate>
) Wenn Sie Hauptseite Layout -Fragmente in wiederverwendbare Vorlagen teilen möchten. ZB Header, Menü, Inhalt, Fußzeile usw.
Beispiele:
- Wie füge ich ein weiteres XHTML in XHTML mit JSF 2.0 -Facelets ein?
- Was ist der wirkliche konzeptionelle Unterschied zwischen UI: Dekor und UI: Einschließen?
- Wie kann ich H: Kopf anpassen, wenn sie UI: Kompositionsvorlage verwenden?
- So ändern Sie die Kopfelemente einer Seite bei Verwendung von UI: Komposition
- Wie können Sie die Dynamik von Ajax-Refresh in Content by Navigation einfügen? (JSF Spa)
Facelet -Tag -Dateien
Verwenden Sie FREISE -MAG -Dateien, wenn Sie eine wiederverwendbare Gruppe von Komponenten haben möchten, um die Code -Duplikation zu verhindern/zu minimieren. ZB eine Gruppe von Label+Eingabe+Nachrichtenkomponenten. Der Hauptunterschied bei zusammengesetzten Komponenten besteht darin, dass die Ausgabe einer Facelet -Tag -Datei keine einzelne darstellt UIComponent
und kann unter bestimmten Umständen die einzige Lösung sein, wenn eine zusammengesetzte Komponente nicht ausreicht. Im Allgemeinen eine <ui:include>
mit einem oder mehreren <ui:param>
Das über eine verwaltete Bean -Eigenschaft besteht (und damit kein hartgesottener Wert) ist ein Signal, dass die inklusive Datei besser eine Tag -Datei sein kann.
Beispiele:
- Wie erstelle ich ein benutzerdefiniertes Facelets -Tag?
- Wie erstellt man ein Gitter aus JSF -Komposit -Komponente?
- Wie erstelle ich eine zusammengesetzte Komponente für eine DataTable -Spalte?
- Primefaces OutputLabel für zusammengesetzte Komponente
Zusammengesetzte Komponenten
Verwenden Sie zusammengesetzte Komponenten, wenn Sie einen einzelnen und wiederverwendbaren Benutzer erstellen möchten UIComponent
mit einer einzigen Verantwortung mit reinem XML. Eine solche zusammengesetzte Komponente besteht normalerweise aus einer Reihe vorhandener Komponenten und/oder HTML und wird physikalisch als Einzelkomponente gerendert und soll an eine einzelne Bohneneigenschaft gebunden sein. ZB eine Komponente, die eine einzelne darstellt java.util.Date
Eigentum durch 3 abhängig <h:selectOneMenu>
Komponenten oder eine Komponente, die sich kombiniert <p:fileUpload>
und <p:imageCropper>
in eine Single <my:uploadAndCropImage>
Verweisen Sie einen einzigen Brauch com.example.Image
Entität als Eigentum.
Beispiele:
- Unsere zusammengesetzte Komponenten -Wiki -Seite
- Der Balusc -Code: zusammengesetzte Komponente mit mehreren Eingangsfeldern
- Split java.util.date über zwei h: InputText -Felder, die Stunde und Minute mit F: convertDatetime darstellen
- Wählen Sie alle Elemente in mehreren SelectManyCheckbox mit dynamischen IDs aus
- Erweiterung der JSF -Befehlskomponente
- Vermeiden Sie doppelte IDs bei der Wiederverwendung von Facelets -Zusammensetzungen im selben Namensbehälter
Benutzerdefinierte Komponenten
Verwenden Sie eine benutzerdefinierte Komponente, wenn die Funktionalität aufgrund des Mangels an Unterstützung im Standard-/verfügbaren Satz von Komponenten nicht mit Furelet -Tag -Dateien oder zusammengesetzten Komponenten erreicht werden kann. Beispiele finden Sie in allen Orten im Quellcode von Open Source -Komponentenbibliotheken wie z. Primefaces und Allgemeine.
Tag -Handler
Wenn Sie das Gebäude des JSF -Komponentenbaums steuern möchten, anstatt die HTML -Ausgabe zu rendern, sollten Sie einen Tag -Handler anstelle einer Komponente verwenden.
Beispiele:
- Benutzerdefinierte Facelet -Komponente in JSF
- Wie kann ich auf den Inhalt von etwas zugreifen, das mit erstellt wurde?u003Cui:define> programmatisch?
- Bedingter Render in Tagfile, je nachdem, ob das Attribut angegeben ist oder nicht
- Durchführung einer Umleitung, wenn die mit Abfrageparametern zugefügten Konvertierung / Validierung fehlschlägt
Beispielprojekte
Hier sind einige Beispielprojekte, bei denen alle oben genannten Techniken verwendet werden.
- Java ee Kickoff App (Vorlagen - inklusive - Tagfiles - zusammengesetzt)
- Omnifaces Showcase (Vorlagen - inklusive - Tagfiles - zusammengesetzt)
Könnte die Leistung unterschiedlich sein?
Technisch gesehen ist die Leistungsbedenken vernachlässigbar. Die Auswahl sollte auf der Grundlage der konkreten Funktionsanforderungen und dem endgültigen Grad der Abstraktion, Wiederverwendbarkeit und Wartbarkeit der Implementierung getroffen werden. Jeder Ansatz hat seinen eigenen, bestimmten Zweck und seine eigenen Einschränkungen.
Verbundkomponenten haben jedoch einen signifikanten Overhead während des Aufbaus/Wiederherstellens der Ansicht (insbesondere beim Speichern/Wiederherstellen des Ansichtszustands). In älteren Versionen von Mojarra hatten zusammengesetzte Komponenten Leistungsprobleme bei der Zuweisung von Standardwerten, dies ist bereits seit 2.1.13 behoben. Auch Mojarra hatte eine Speicherleck Wenn ein <cc:attribute method-signature>
Wird für Methodenausdrücke verwendet, im Grunde wird der gesamte Komponentenbaum in der HTTP-Sitzung erneut referenziert. Dies ist festgelegt, da 2.1.29 / 2.2.8. Das Speicherleck kann in älteren 2.1 -Versionen wie unten 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 unten:
<context-param>
<param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
<param-value>true</param-value>
</context-param>
Dennoch, wenn Sie relativ "viele" zusammengesetzte Komponenten haben und Sie haben javax.faces.STATE_SAVING_METHOD
einstellen client
, Dann wird die Aufführung ein Schmerz sein. Missbrauche zusammengesetzte Komponenten nicht, wenn Sie lediglich die grundlegende Funktionalität wünschen, die bereits mit einer einfachen Include -Datei oder einer Tag -Datei möglich ist. Verwenden Sie nicht die einfache Konfiguration (lesen Sie: Nein *.taglib.xml
Datei benötigt) als Ausrede, um zusammengesetzte Komponenten gegenüber Tagendateien zu bevorzugen.
Vergessen Sie bei Verwendung von Mojarra 2.2.10 oder älter nicht, die relativ kurzen Facelets -Aktualisierungszeiten 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. Andernfalls können Sie den gesamten Server neu starten, um Änderungen in den zu reflektierten Funktionsdateien zu erhalten! Mojarra 2.2.11 und neuer und MyFaces ist bereits standardmäßig standardmäßig -1
Wenn javax.faces.PROJECT_STAGE
ist nicht eingestellt auf Development
.