【问题标题】:immediate vs deferred evaluation for reading bean properties读取 bean 属性的立即评估与延迟评估
【发布时间】:2013-03-09 17:22:21
【问题描述】:

对于JSFimmediate evaluation和deferred evaluation的使用我还是不太清楚,主要是网上的例子好像几乎没有用过前一种方法。

我已经看过相当多的 JSF 示例,包括包含在 http://docs.oracle.com/javaee/6/tutorial/doc/ 中的示例,我有点困惑的是,我几乎只看到带有 #{} 而不是 ${} 的示例,即使所有这些我们正在做的是读取一个 bean 属性。

从我对这两种用途的理解来看,${}只能用来读取bean属性,不能用来写入。我还没有找到关于 immediate 与 deferred 评估在 JSF 生命周期方面的确切差异以及读取 bean 属性会有什么差异的明确解释。

如果大家总是使用#{}来读取bean属性,你会推荐什么时候使用${}?

所以,总结一下:

  • 为什么在读取 bean 属性时,每个人似乎都更喜欢#{} 而不是${}?
  • 您何时建议使用${} 而不是#{}?
  • 您能否举例说明使用${} 与使用#{} 会产生不同的结果(您能解释为什么结果不同)?

【问题讨论】:

标签: jsf el managed-bean


【解决方案1】:

在 Facelets 中,${} 被视为 #{},因此在技术上没有区别,并且总是延迟。

在 JSP 2.0 和更早版本中,${} 不会在它不在范围内时自动创建托管 bean。因此,只有当您可以保证在组件树中的某处之前使用了同一托管 bean 上的 #{} 并且还考虑了 view build time vs view render time 生命周期时,您才能使用它。在所有 JSP 版本中,${} 不能设置模型中 JSF 输入组件的提交值。总而言之,将它们混合起来可能会让初学者感到困惑,从长远来看甚至对您自己也是如此,因此不推荐。

另见:

【讨论】:

  • 感谢您的快速回复。但是,我不明白您所说的“自动创建托管 bean”是什么意思,以及我是否可以“保证 #{} ... 之前在组件树中的某个地方使用过 ...”。我做了一个小测试:我创建了一个新项目、一个 index.xhtml 页面和一个带有一个 getter/property 的 Bean.java JSF 托管 bean。我用 ${bean.name} 引用了该属性。我进行了部署,一切都按照第一个请求进行。我不确定这个托管 bean 可以“在组件树之前”在哪里使用,但我的代码运行没有错误。你能解释一下你的意思吗?
  • 附注我注意到您删除了我的问题标题中的“JSF EL”。当我寻找关于 SO 的现有问题时,如果没有该前缀,就很难知道这个问题是关于什么的。扫描多个问题的列表时,这些标签更难捕捉。这是 SO 格式请求吗?如果不是,我不确定你为什么喜欢删除它。
  • 我改进了答案。至于标题,它们已经由标签表示。您可以添加例如[jsf][el] 搜索关键字以过滤标签。您不需要像在不存在标签的老式讨论论坛中那样在标题中重复标签。
  • 好的。但是,我仍然不清楚为什么 docs.oracle.com/javaee/6/tutorial/doc/bnahr.html 会花这么多时间来解释,对于 #{},在 JavaServer Faces 技术的情况下,它的控制器可以在生命周期的不同阶段评估表达式,具体取决于关于如何在页面中使用表达式。,而对于 ${},他们解释说 JavaServer Faces 实现评估表达式 ${sessionScope.cart.total},对其进行转换,然后通过返回值到标签处理程序。
  • <fmt:xxx> 是一个标签处理程序,而不是一个 UI 组件。 Taghandlers 在视图构建期间运行,因此默认情况下已经在视图构建期间评估 EL。我承认 Java EE 教程中的这个解释/示例具有误导性,因为它与立即/延迟评估无关。在该特定示例中使用 #{} 时会发生完全相同的效果。还要进一步注意<fmt:xxx> taglib 本身在Facelets 中不受支持,而仅在 JSP 中。
猜你喜欢
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多