1
            <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 个条件评估为真。因此,一旦加载,用户将在 html 页面上看到 10 个结果。

  1. 尽管只有 10 个项目会在 html 中显示,但组件树将包含 40 个项目,它会包含那些被渲染为 false 的项目。上述行为是否准确?

  2. 如果 1 为真,并且我们在组件树中可能有很多隐藏的组件,这是一个性能问题,假设它是 400 个项目而不是 40 个?

  3. 在 Faceletes 或 JSF 中是否有条件标记处理程序,其行为类似于 c:if 并且不会在树中包含组件?还是我应该使用 c:if 作为最后的手段?我试图避免使用 JSTL。

谢谢。

4

1 回答 1

3

尽管 html 中只会显示 10 个项目,但组件树将包含 40 个项目

您是正确的,即使渲染为假,包含的组件也将成为组件树的一部分。但是,<ui:repeat>它不会在组件树中复制其内容,而是会在 JSF 生命周期的每个阶段反复迭代其子组件。因此,组件树将只包含 4 个“项目”组件。

如果 1 为真,并且我们在组件树中可能有很多隐藏的组件,这是一个性能问题,假设它是 400 个项目而不是 40 个?

可以,如相关答案中所述,但需要很多组件才能引起注意。(不久前我做了一个基准测试。我手头没有数字,但是 IIRC,添加 600 个未渲染的组件会增加 300 毫秒的 Web 应用程序响应时间。)

是否有一个条件标记处理程序,其行为类似于 c:if 并且不会在树中包含组件?还是我应该使用 c:if 作为最后的手段?

带有值表达式的 TagHandlers 有各种各样的限制,所以我建议尽可能远离它们。但是,是的,实际上防止包含在组件树中,<c:if>这也是我使用的。

于 2011-12-02T22:19:37.263 回答