【问题标题】:JSF EL evaluationJSF EL 评估
【发布时间】:2013-11-05 09:01:13
【问题描述】:

我认为我的问题与 BalusC 的回答有关:Evaluation of EL during view build time

我正在尝试使用 JSF2 复合组件显示一系列 Primefaces BarCharts,并将自定义 Chart 对象作为属性传递。 Chart 对象包含图表名称、标题和对 DAO 对象的调用以检索数据模型。这是我的复合组件。

<composite:interface>
    <composite:attribute name="chart" />
</composite:interface>
<composite:implementation>
    <p:barChart id="#{cc.attrs.chart.name}" title="#{cc.attrs.chart.title}" value="#{cc.attrs.chart.model}" 
            style="width:300px" legendPosition="ne" xaxisAngle="45"/>
</composite:implementation>    

当 Primefaces 呈现条形图对象时,它会为条形图对象对 getValue() 进行 3 次调用,并且如上面链接中所述,仅存储了 EL 表达式“#{cc.attrs.chart.model}” .这会导致每次 Primefaces 在内部调用 getValue 时都会进行新的模型评估,因此需要对数据库进行三次往返。

有没有办法评估 cc.attrs.chart.model 一次并将其用作图表的 value 属性?

我认为我可以使用图表 UI 组件和绑定,但我希望在我的视图中定义尽可能多的图表属性,所以这感觉不对?

【问题讨论】:

    标签: jsf primefaces el


    【解决方案1】:

    为什么不使用延迟加载?

    喜欢:

    public Object getValue() {
      if(this.value == null) {
        // do value loading here   
      }
      return this.value;
    }
    

    【讨论】:

    • 我愿意,但 #{cc.attrs.chart... 评估的图表对象每次都是一个新对象,因此模型成员变量总是再次为空。请注意,getValue() 方法位于 PrimeFaces 的 BarChart 组件上。这是我实现延迟加载的 Chart.getModel() 方法。我几乎觉得 Primefaces 应该评估一次 getValue() 并存储检索到的模型,而不是不断地重新评估它(即它们应该是延迟加载),但我确信这是有原因的。
    • 不能为此使用对话范围的 bean 吗?使用“BarChartHandler”或类似的东西来获取模型。然后你只能加载一次......
    • 抱歉,应该添加我在 Tomcat 6 上,所以认为我无法访问 ConversationScope?我考虑过使用 bean,但我的组件从 c:forEach 循环中多次调用,每个复合组件都有不同的图表对象。图表的数量是动态的并在数据库中定义。 (我本质上是在制作仪表板)。在这种情况下,我无法在 faces-config.xml 或使用注释中定义我的 bean。我需要以编程方式声明它们吗?我并不反对这一点,但我正在寻找关于视图和模型之间平衡的最佳建议。希望这是有道理的。
    • 抱歉,直到现在我才使用 PrimeFaces 图表。而且我对Tomcat不是很了解,我们用的是IBM Websphere...
    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2010-10-04
    相关资源
    最近更新 更多