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 otherui: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

Schreibe einen Kommentar