JSF/Facelets/JSTL лучшие практики условного отображения
<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-странице после загрузки.
Даже если в html будет отображаться только 10 элементов, дерево компонентов будет содержать 40 элементов, в которых оно будет отображаться с ошибкой. Является ли описанное выше поведение точным?
Если 1 истинно, и у нас может быть много скрытых компонентов в дереве компонентов, это проблема производительности, скажем, это было 400 элементов вместо 40?
В Faceletes или JSF есть обработчик условных тегов, который ведет себя как c:if и не будет включать компонент в дерево? Или я должен использовать c: если в крайнем случае? Я пытаюсь избежать использования JSTL.
Благодарю.
1 ответ
Даже если в html будет отображаться только 10 элементов, дерево компонентов будет содержать 40 элементов.
Вы правы, что включенные компоненты будут частью дерева компонентов, даже если отображено значение false. Тем не мение, <ui:repeat>
не дублирует свой контент в дереве компонентов, но будет повторять его дочерние компоненты повторно на каждой фазе жизненного цикла JSF. Следовательно, дерево компонентов будет содержать только 4 компонента "item".
Если 1 истинно, и у нас может быть много скрытых компонентов в дереве компонентов, это проблема производительности, скажем, это было 400 элементов вместо 40?
Это может быть, как задокументировано в связанном ответе, но требуется много компонентов, чтобы быть заметным. (Некоторое время назад я проводил тестирование по этому поводу. У меня нет цифр под рукой, но IIRC, добавив 600 неперерисованных компонентов, добавил 300 мс к времени отклика веб-приложения.)
есть ли обработчик условного тега, который ведет себя как c:if и не будет включать компонент в дерево? Или я должен использовать c: если в крайнем случае?
TagHandlers со значениями выражений имеют всевозможные ограничения, поэтому я рекомендую по возможности избегать их. Но да, чтобы на самом деле предотвратить включение в дерево компонентов, <c:if>
это то, что я тоже использую.