JSF/Facelets/JSTL 条件显示最佳实践

Posted

技术标签:

【中文标题】JSF/Facelets/JSTL 条件显示最佳实践【英文标题】:JSF/Facelets/JSTL conditional display best practices 【发布时间】:2012-01-11 20:55:10 【问题描述】:
            <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 个结果。

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

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

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

谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

具有值表达式的标记处理程序有各种限制,因此我建议尽可能远离它们。但是,是的,为了真正防止包含在组件树中,&lt;c:if&gt; 也是我使用的。

【讨论】:

感谢您的回答。我完全忘记了 它不会复制组件。

以上是关于JSF/Facelets/JSTL 条件显示最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Harbor 和Containerd的最佳实栈

K8s系列-K8S 日志采集最佳实操

在非常相似的组件的情况下,进行条件渲染的最佳方法是啥?

Atitit.列表页面and条件查询的实现最佳实践------翻页 分页 控件的实现java .net php

浮点数的精确值作为有理数

基于WPS的Word最佳实践系列(利用表格控制排版)