【问题标题】:How to avoid repeat evaluation of EL如何避免重复评估EL
【发布时间】:2011-04-03 13:12:00
【问题描述】:

我正在开发一个带有 seam/richfaces 的 Web 界面。

很多组件都类似于

<h:panelGrid rendered="#{complexbean.heavyoperation()}">
    ...
</h:panelGrid>
<h:panelGrid rendered="#{!complexbean.heavyoperation()}">
    ...
</h:panelGrid>

在这种情况下,#{!complexbean.heavyoperation()} 会被计算两次。

我的问题是,我可以在页面中使用类似于 if-else 语句的任何内容来避免对同一 EL 进行多次评估(并且我想避免使用任何 JSP 内容,即 %% )?

谢谢!

【问题讨论】:

    标签: java seam richfaces


    【解决方案1】:

    如果你对jstl没什么反感,可以使用c:choose/c:when/c:otherwise构造。

    【讨论】:

    • 在使用 Facelets 时不惜一切代价避免使用 JSTL。如果你使用 JSTL 标签,你需要知道你在做什么,因为 Facelets 的工作方式。
    • 你需要知道你一直在做什么,不是吗?
    • 不,如果您远离 JSTL,则不会。特别是 c:forEach 标记以及它与 Facelets 相比的呈现方式,即编译时间与运行时间。
    【解决方案2】:

    我看到你正在使用Seam。你不能在你的一个支持bean中使用@Factory吗?在同一范围内,它只会被评估一次。这就是它的目的。

    @Factory("operation")
    public bool heavyComputation() {
        return true;
    }
    

    然后是你的观点:

    <h:panelGrid rendered="#{!operation}">
        ...
    </h:panelGrid>
    <h:panelGrid rendered="#{!operation}">
        ...
    </h:panelGrid>
    

    我认为这要清楚得多。希望对您有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 2014-06-13
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      相关资源
      最近更新 更多