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 个项目
即使渲染为假,包含的组件也将成为组件树的一部分,这是正确的。但是,<ui:repeat>
不会在组件树中复制其内容,而是会在 JSF 生命周期的每个阶段反复迭代其子组件。因此,组件树将只包含 4 个“item”组件。
如果 1 为真,并且我们在组件树中可能有很多隐藏的组件,这是一个性能问题,假设它是 400 个项目而不是 40 个?
可以,如related answer 中所述,但需要很多组件才能引人注目。 (不久前我做了一个基准测试。我手头没有数据,但是 IIRC,添加 600 个未渲染的组件会增加 300 毫秒的 Web 应用程序响应时间。)
是否有条件标记处理程序,其行为类似于 c:if 并且不会在树中包含组件?还是我应该使用 c:if 作为最后的手段?
具有值表达式的标记处理程序有各种限制,因此我建议尽可能远离它们。但是,是的,为了真正防止包含在组件树中,<c:if>
也是我使用的。
【讨论】:
感谢您的回答。我完全忘记了以上是关于JSF/Facelets/JSTL 条件显示最佳实践的主要内容,如果未能解决你的问题,请参考以下文章