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?

War es hilfreich?

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:

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:

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:

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:

Beispielprojekte

Hier sind einige Beispielprojekte, bei denen alle oben genannten Techniken verwendet werden.


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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top