【发布时间】:2012-01-24 16:51:52
【问题描述】:
我的代码在这里迭代每一行的列,每次迭代都会计算 rendered 属性,超过 testRule。
<p:dataTable ...>
<p:column ...>
...
</p:column>
<p:column rendered="#{managedBean.testRule('rules.canDoActions')}">
<!-- Action buttons -->
<h:commandButton ...>
<h:commandButton ...>
</p:column>
</p:dataTable>
为了获得更好的性能,我想将结果设置为一个变量,但我不知道如何......它会变成这样:
<?:??? var="canDoActions" value="#{managedBean.testRule('rules.canDoActions')}">
<p:dataTable ...>
<p:column ...>
...
</p:column>
<p:column rendered="#{canDoActions}">
<!-- Action buttons -->
<h:commandButton ...>
<h:commandButton ...>
</p:column>
</p:dataTable>
另外,我不允许使用核心标签库,这意味着<c:set ../> 是不可能的。
在那个范围内,我如何设置变量?或者,如果不可能,您建议如何解决性能问题?
【问题讨论】:
-
为什么不允许你使用 JSTL 核心标签库?
-
@BalusC: Architect 决定不将 JSTL 与 JSF 一起使用,因为(如果我没记错的话)它在其他标签的不同阶段运行,而这里的人们正在肆无忌惮地使用它,混合了很多东西出现了许多错误和混乱(如果我没记错的话,JSTL 核心不会在 ajax 调用上重新运行)。 JSTL 是为 JSP 创建的,并且在逻辑上是为它设计的。我知道它可以与 JSF 一起使用,但是在这里,架构师决定使用 JSTL 不是最佳实践。尽管我们牺牲了 JSTL,但我们的问题得到了解决(相信 JSTL 并不是那么必要)。很高兴与你交谈,@BalusC!
-
JSTL 确实不是必须的。但是当您想要动态构建视图时它可能会有所帮助。另请参阅stackoverflow.com/questions/3342984/… 虽然您的架构师肯定有一个有效的观点(这确实经常让初学者感到困惑),但完全限制它有点过分热心。好吧,
<c:set>将是您问题的答案。如果这不是一个选项(或揭示了其他问题;例如,它不能很好地与视图范围的 bean 一起使用),那么您必须将自身缓存在 getter 中。请参阅 Jigar 的回答。 -
我同意 BalusC,另外请注意,与 Facelets 一起使用的 JSTL 不是 JSP 附带的 real JSTL。这是一个特别改编的“模拟”。请注意,甚至并非所有属性和标签都存在。然后,原生 Facelets 库也有构建时间和运行时间标签。
-
另外,如果我没记错的话,c:set 和 ui:param 实际上并不存储结果,而只是分配给它的表达式的动态别名。也许使用直接语法 ${...} 会给你带来这种效果。
标签: java jsf variables jstl el