JSF ui:fragment rendered Leistung
Habe ich eine Reihe von jsf-Komponenten, die statisch erzeugt aus einem Satz von excel-Dateien (Sie aktualisiert werden, um business-Leute). Jede generierte Datei entspricht einem business-Objekt, das hat etwas andere Daten, und alle von Ihnen gehören zur selben Klasse.
Um diese dynamisch, die einzige Lösung, die ich fand, war die Einrichtung einer Reihe von ui:fragment
und den Versand an die richtige Komponente zur Laufzeit:
<!-- IMPLEMENTATION -->
<composite:implementation>
<ui:fragment rendered="#{cc.attrs.type eq 'cartcred'}">
<limites:limites-cartcred limite="#{cc.attrs.limite}"/>
</ui:fragment>
<ui:fragment rendered="#{cc.attrs.type eq 'cdcp'}">
<limites:limites-cdcp limite="#{cc.attrs.limite}"/>
</ui:fragment>
<ui:fragment rendered="#{cc.attrs.type eq 'cheqpredatado'}">
<limites:limites-cheqpredatado limite="#{cc.attrs.limite}"/>
</ui:fragment>
<ui:fragment rendered="#{cc.attrs.type eq 'confirming'}">
<limites:limites-confirming limite="#{cc.attrs.limite}"/>
</ui:fragment>
<!-- many more lines -->
<!-- many more lines -->
<!-- many more lines -->
<ui:fragment rendered="#{cc.attrs.type eq 'contacorr'}">
<limites:limites-contacorr limite="#{cc.attrs.limite}"/>
</ui:fragment>
Aber ich fand heraus, dass die Performance das ist schrecklich. Ich dache JSF würde nur Rendern einer einzelnen Komponente, aber es scheint, dass es Rendern alle von Ihnen und "versteckt" die anderen zur Laufzeit.
Ist es ein effizienter Weg, mein Ziel? Ich möchte zum Rendern eine einzelne Komponente basiert auf Laufzeit-Informationen über eine business class (ähnlich wie ein if-then-else), aber ich kann nur feststellen, was ist die Komponente für die Darstellung zur Laufzeit.
Klarstellung:
was passiert, ist, dass jede Komponente verweist limites:limites*
ist eine riesige komplexe Seite mit vielen anderen Komponenten. Zur Laufzeit werden die parameter mit dem Namen type' will decide what component to render. But my tests show that if I only render one component, but leave the other
ui:Fragmente` (sogar zu wissen, dass Sie nicht gerendert werden), machen wird es viel langsamer, als wenn ich entfernen Sie die Komponenten.
Also, wenn das meine Seite genau so:
<composite:interface>
<composite:attribute name="type" required="true" />
<composite:attribute name="limite" required="true" />
</composite:interface>
<composite:implementation>
<ui:fragment rendered="#{cc.attrs.type eq 'cartcred'}">
<limites:limites-cartcred limite="#{cc.attrs.limite}"/>
</ui:fragment>
</composite:implementation>
machen wird es viel (etwa 10x) schneller als die erste version, obwohl die Parameter sind die gleichen. Ich vermute, dass JSF-erstellen der gesamten Komponente Baum und erst zur Laufzeit wird es sich entscheiden (je nach dem angegebenen parameter), wenn machen wird es jeder andere oder nicht.
Bearbeiten
Fast da. Ich brauche nur auf meine composite component dynamisch. Ich habe versucht, die Bewertung einer ELExpression aber das hat nicht funktioniert. Was ich brauche ist eine Möglichkeit für den Zugriff auf den aktuellen Bereich innerhalb der Komponente erstellen und verwenden, erzeugen Sie die richtige Datei-name:
//obviously, ELExpressions don't work here
Resource resource = application.getResourceHandler().createResource("file-#{varStatus.loop}.xhtml", "components/dynamicfaces");
InformationsquelleAutor Miguel Ping | 2011-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Möglichkeit könnte sein, die
binding
Attribut zum Zugriff auf einen containerKomponente aus dem inneren Ihres managed bean und bauen die Komponenten-Struktur von der
java-Seite. So könnte man nur die Komponenten, die Sie benötigen, nicht benötigte
Komponenten werden nicht ausgewertet überhaupt.
JSP:
Managed Bean:
Ich habe nicht verwendet diese zusammen mit composite-Komponenten noch, diese Frage zu haben scheint, etwas mehr details und eine Beispiel-Anwendung bezüglich der Verwendung dieser mit composite-Bauteile.
Edit: Bezüglich Ihrer Bearbeiten, können Sie auch evaluieren, EL-Ausdrücke in Ihrem managed bean so:
danke, siehe mein update für ein Beispiel, wie el-Ausdrücke aus java-code.
Hehe danke, ich habe bereits versucht, die Bewertung der ELExpression auf die Bohne, aber für einige Grund es didn ' T evaluate richtig; es hätte wahrscheinlich nicht beheben die Variablen, die ich war versucht, Zugriff auf die zum Zeitpunkt der
setComponent
genannt wird. Manchmal muss man einfach zu bewegen auf.InformationsquelleAutor Jörn Horstmann
Ja, die
rendered
Attribut wertet während der render-Zeit, auch nicht während der Bauzeit. Ja, es ist relativ schrecklich. Vorstellen, dass man so ein Zustand kostet 1 MS, Auswertung von zehn von Ihnen nehmen würde, insgesamt 10-mal länger, 10ms. Wenn Sie wiederum haben zehn dieser Komponenten in eine paginiert Tisch, die webapp laden Zeit nehmen würde, 0,1 Sekunde länger. Über eine eyeblink mehr. Aber wenn man nicht paginieren und/oder sind mit MSIE als Referenz-browser, dann wird es viel länger dauern würde. Sind Sie umbrechen der Daten und Tests in richtigen Browsern?Beste, was Sie tun können, ist zu ersetzen die
<ui:fragment>
von JSTL-tags wie<c:if>
/<c:choose>
so, dass es wertet während der Bauzeit, nicht während der render-Zeit. Oder, alternativ, bauen Sie die Komponente Baum in der backing-bean Konstruktor, anstatt in der Ansicht.fragment
Inhalte sind nur "verarbeitet", wenn die erbrachten Bedingungtrue
. Außerdem, meine Referenz-browser ist MSIE6. Ich sollte wahrscheinlich erhalten einen anderen job...MSIE hat einen extrem schlechten HTML-Tabelle rendering-Leistung. Ich bezweifle, ob das problem tatsächlich verursacht durch EL. Es ist extrem schnell. Testen Sie die gleiche Seite in anderen Browsern, z.B. Firefox oder Chrome -nur für Ihre eigenen Referenz.
Ich habe geklärt, mein problem.
Ich aktualisierte die Antwort, zu versuchen, JSTL, stattdessen bauen die Ansicht.
JSTL hat nicht funktioniert als ich erwartet hatte. Mein real-Fall war ein wenig mehr künstlich als das Beispiel, das ich gepostet, aber trotzdem danke.
InformationsquelleAutor BalusC