JSF ui:fragment rendu de la performance

J'ai un ensemble de composants jsf de manière statique générée à partir d'un ensemble de fichiers excel (ils sont mis à jour par des gens d'affaires). Chaque fichier généré représente un objet métier qui est légèrement différente des données, et elles appartiennent toutes à une même classe.

Afin de rendre ce, de façon dynamique, la seule solution que j'ai trouvé était de mettre en place un groupe de ui:fragment et l'expédition vers la droite composant à l'exécution:

<!-- 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>

Mais j'ai trouvé que la performance de ce est terrible. Je tought que JSF ne ferait que rendre un seul composant, mais il semble que c'est rendu tous d'entre eux et de "cacher" les autres au moment de l'exécution.

Est-il un moyen plus efficace d'atteindre mon objectif? Je veux rendre un seul composant basée sur les informations d'exécution sur une entreprise de classe (un peu comme un if-then-else), mais je ne peut déterminer ce qui est le composant de rendre à l'exécution.


Précisions:
ce qui se passe, c'est que chaque composant référencé par limites:limites* est un énorme complexe de page avec beaucoup d'autres composants. Au moment de l'exécution, le paramètre nommé type' will decide what component to render. But my tests show that if I only render one component, but leave the otherde l'interface utilisateur:fragments (même en sachant qu'ils ne seront pas rendus), il va rendre beaucoup plus lent que si je supprimer les composants.

Donc si ma page est exactement comme ceci:

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

il va rendre beaucoup (10x) plus rapide que la version initiale, même si les paramètres sont les mêmes. Je soupçonne que JSF va créer l'ensemble de la composante de l'arbre et seulement à l'exécution, il décidera (selon le paramètre fourni) si il va rendre les uns les autres ou pas.


Modifier

Y est presque. J'ai juste besoin de ma composite composant dynamiquement. J'ai essayé de l'évaluation d'un ELExpression mais cela ne fonctionne pas. Ce dont j'ai besoin est un moyen d'accéder à l'étendue actuelle au sein de la composante de la création, et l'utilise pour générer le bon nom de fichier:

//obviously, ELExpressions don't work here
Resource resource = application.getResourceHandler().createResource("file-#{varStatus.loop}.xhtml", "components/dynamicfaces");

OriginalL'auteur Miguel Ping | 2011-05-16