JSF / Facelets / JSTL лучшие практики условного отображения - PullRequest
1 голос
/ 03 декабря 2011
            <ui:repeat  value="#{bean.allResults}" var="result">
                <ui:fragment rendered="#{result.condition1}">
                    <ui:include src="/item1.xhtml">
                </ui:fragment>
                <ui:fragment rendered="#{result.condition2}">
                    <ui:include src="/item2.xhtml">
                </ui:fragment>
                <ui:fragment rendered="#{result.condition3}">
                    <ui:include src="/item3.xhtml">
                </ui:fragment>
                <ui:fragment rendered="#{result.condition4}">
                    <ui:include src="/item4.xhtml">
                </ui:fragment>
            </ui:repeat>

У меня есть пара вопросов относительно лучших практик при использовании JSF / JSTL / Facelets
У меня есть страница JSF, которая выглядит как приведенный выше код.Давайте предположим, что этот цикл возвращает 10 результатов, и для каждого результата только 1 условие оценивается как истинное.Таким образом, пользователь увидит 10 результатов на html-странице после загрузки.

  1. Несмотря на то, что в html будет отображаться только 10 элементов, дерево компонентов будет содержать 40 элементов, которые будут содержать те, которые были обработаны и обработаны.ложно.Является ли описанное выше поведение точным?

  2. Если 1 истинно, и у нас может быть много скрытых компонентов в дереве компонентов, то это из-за проблем производительности, скажем, это 400 элементов вместо 40?

  3. В Faceletes или JSF есть обработчик условных тегов, который ведет себя как c: if и не будет включать компонент в дерево?Или я должен использовать c: если в крайнем случае?Я пытаюсь избежать использования JSTL.

Спасибо.

1 Ответ

3 голосов
/ 03 декабря 2011

Даже если в html будет отображаться только 10 элементов, дерево компонентов будет содержать 40 элементов

Вы правы в том, что включенные компоненты будут частью дерева компонентов, даже если отображаемое значение равно false.Однако <ui:repeat> не дублирует свое содержимое в дереве компонентов, но будет многократно повторять его дочерние компоненты на каждом этапе жизненного цикла JSF.Следовательно, дерево компонентов будет содержать только 4 компонента "item".

Если 1 равно true, и у нас может быть много скрытых компонентов в дереве компонентов, то это из-за проблем производительности, скажем, 400элементы вместо 40?

Это может быть, как задокументировано в связанном ответе , но для заметности требуется много компонентов.(Некоторое время назад я проводил тестирование по этому поводу. У меня нет цифр под рукой, но IIRC, добавив 600 неотрисованных компонентов, добавил 300 мс к времени отклика веб-приложения.)

- этоесть обработчик условного тега, который ведет себя как c: if и не будет включать компонент в дерево?Или я должен использовать c: if в качестве крайней меры?

TagHandlers со значениями выражений имеют всевозможные ограничения, поэтому я рекомендую по возможности избегать их.Но да, чтобы на самом деле предотвратить включение в дерево компонентов, я тоже использую <c:if>.

...