У меня есть набор компонентов jsf, которые статически генерируются из набора файлов Excel (они обновляются деловыми людьми).Каждый сгенерированный файл представляет бизнес-объект, который имеет немного разные данные, и все они принадлежат одному и тому же классу.
Для динамического рендеринга единственное решение, которое я нашел, было настроить группу * 1003.* и отправка в нужный компонент во время выполнения:
<!-- 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>
Но я обнаружил, что выполнение этого ужасно.Я думал, что JSF будет рендерить только один компонент, но кажется, что он рендерит всех из них и «скрывает» остальные во время выполнения.
Существует ли более эффективный способ достижениямоя цель?Я хочу визуализировать отдельный компонент на основе информации времени выполнения о бизнес-классе (очень похоже на if-then-else), но я могу только определить, какой компонент следует визуализировать во время выполнения.
Пояснение: происходит то, что каждый компонент, на который ссылается limites:limites*
, представляет собой огромную сложную страницу с множеством других компонентов.Во время выполнения, параметр с именем type' will decide what component to render. But my tests show that if I only render one component, but leave the other
ui: фрагменты (даже зная, что они не будут отображаться), будет рендерить намного медленнее, чем если бы я удалил компоненты.
Так что еслимоя страница выглядит примерно так:
<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>
она будет рендерить намного (примерно в 10 раз) быстрее, чем исходная версия, даже если параметры совпадают.Я подозреваю, что JSF создаст все дерево компонентов и только во время выполнения решит (в зависимости от предоставленного параметра), будут ли они отображать друг друга или нет.
Редактировать
Почти там.Мне просто нужно включить мой составной компонент динамически .Я пытался оценить ELExpression, но это не сработало.Мне нужен способ доступа к текущей области в рамках создания компонента и использования его для создания правильного имени файла:
//obviously, ELExpressions don't work here
Resource resource = application.getResourceHandler().createResource("file-#{varStatus.loop}.xhtml", "components/dynamicfaces");