Ich habe das folgende Konstrukt an mehreren Stellen in meiner Webanwendung, um Seitenfragmente abhängig von einigen Aktionen bedingt zu rendern:
%Vor% Ich habe beobachtet, dass <ui:include>
immer noch ausgeführt wird, auch wenn das Attribut rendered
false
auswertet. Dies erzeugt unnötigerweise alle mit der service1.xhtml
-Datei verbundenen Hintergrund-Beans, die enthalten sind.
Wie kann ich die Ausführung von <ui:include>
überspringen, wenn die übergeordnete UI-Komponente nicht gerendert wird, sodass nicht alle diese Backing-Beans unnötigerweise erstellt werden?
Leider ist dies beabsichtigt. Das <ui:include>
wird während der Erstellung der Ansicht als Taghandler ausgeführt, während das Attribut rendered
während der Renderzeit der Ansicht ausgewertet wird. Dies kann besser verstanden werden, wenn man diese Antwort sorgfältig liest und "JSTL" durch " <ui:include>
" ersetzt: JSTL in JSF2 Facelets ... macht Sinn?
Je nach konkreter funktionaler Anforderung gibt es mehrere Möglichkeiten, dies zu lösen:
Verwenden Sie ein View-Build-Zeit-Tag wie <c:if>
anstelle von <h:panelGroup>
. Dies hat jedoch Auswirkungen auf die #{managedBean}
. Es kann nicht im View-Bereich sein und sollte seine Arbeit basierend auf HTTP-Anforderungsparametern erledigen. Genau diese HTTP-Anforderungsparameter sollten auch in nachfolgenden Anforderungen beibehalten werden (z. B. <f:param>
, includeViewParams
usw.), damit sie beim Wiederherstellen der Ansicht nicht beschädigt werden.
Ersetze <ui:include>
durch eine benutzerdefinierte UIComponent
welche ruft FaceletContext#includeFacelet()
während der UIComponent#encodechildren()
Methode. Bisher existiert keine solche Komponente in einer der vorhandenen Bibliotheken. Aber ich kann sagen, dass ich bereits eine solche für zukünftige OmniFaces in Betracht gezogen habe und es funktioniert so intuitiv wie hier in meiner Testumgebung (mit Mojarra). Hier ist ein Kickoff-Beispiel: