【问题标题】:Evaluation of EL during view build time in c:forEach在 c:forEach 中的视图构建期间评估 EL
【发布时间】:2013-09-19 01:34:20
【问题描述】:

在 c:forEach 循环的视图构建时间中,EL 语句会发生什么。

<c:forEach var="v" values="#{bean.values}">
    <p:inputText value="#{v.name}" />
</c:forEach>

class Bean {
   public List<Pojo> getValues();
}

class Pojo {
   public void setName (String);
   public String getName();
}

如何评估此代码以进行渲染?致:

 <p:inputText value="John Smith">

 <p:inputText value="#{pojo.name}" >

【问题讨论】:

    标签: jsf jsf-2 jstl el


    【解决方案1】:

    对于 UI 组件,只有 idbinding 属性会在视图构建时立即进行评估。所有其他属性都被延迟。 IE。他们将获得ValueExpression(或MethodExpression)的实例,而不是立即评估的值。 ValueExpression 会在每个 getValue()/setValue() 电话上重新评估。

    另见:

    【讨论】:

    • 谢谢!如果我正确理解您的答案,集合中每个对象的引用将保存在ValueExpression(或某处)中,然后将在渲染阶段重新评估 EL。
    • 不,保存的是 EL 表达式本身(类似于 String 的精确值 #{pojo.name})。它会在每次 getValue()/setValue() 调用时重新执行。
    • 好的,我知道EL表达式会被保存。但是 EL 表达式如何知道要为哪个对象(在我的示例 Pojo 类中)调用 getter/setter。对对象的引用应该保存在某处。它是否保存在 getValue() / setValue()ELContext 参数中?或者从您的评论中评估的字符串值将被保存?
    • 确实,每次迭代都有自己的 EL 上下文。如果是 Mojarra,则为 com.sun.facelets.tag.jstl.core.ForEachFaceletContext
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多