【发布时间】:2012-02-06 03:49:41
【问题描述】:
我在 JSF2 中编程,NetBeans 创建了许多带有 #{} 的页面,其中包含一个表达式。但是有时在网上我发现 ${} 是为了同样的事情!
有什么不同吗?它们是什么?
【问题讨论】:
我在 JSF2 中编程,NetBeans 创建了许多带有 #{} 的页面,其中包含一个表达式。但是有时在网上我发现 ${} 是为了同样的事情!
有什么不同吗?它们是什么?
【问题讨论】:
Google 搜索“Java Server Faces 美元英镑”得到以下结果,来自 JBoss Expression Language FAQ:
为什么有些表达式以英镑开头,而有些则以美元符号开头?
对于 EL 规范本身,没有区别。由使用 EL 的技术来决定它的含义。对于 JSP 和 JSF,以井号开头的表达式表示 延迟 评估,而美元符号表示 立即 评估。这一切都与在请求处理期间实际评估表达式的时间有关。 JSF 组件中使用井号是因为我们希望表达式由 JSF 生命周期而不是由 JSP 或 Facelets 引擎评估。
【讨论】:
#{} 用于延迟表达式(已解决
取决于页面的生命周期),可用于阅读或
写入或写入 bean 或进行 方法调用。${} 是 立即解决 的表达式,只要它们是
遇到了就解决了。它们是只读的。您可以在这里阅读更多内容:http://docs.oracle.com/javaee/6/tutorial/doc/bnahr.html
【讨论】:
Java 文档给出如下解释:
${customer.name}
#{customer.name}
前者使用立即评估语法,而后者使用延迟评估语法。第一个表达式访问 name 属性,获取其值,将值添加到响应中,并在页面上呈现。第二个表达式也会发生同样的情况。但是,如果使用此标记的技术允许,标记处理程序可以将此表达式的计算推迟到页面生命周期的稍后时间。
在 JavaServer Faces 技术的情况下,后一个标记的表达式会立即被计算在页面的初始请求期间。在这种情况下,此表达式充当右值表达式。在回发请求期间,此表达式可用于通过用户输入设置名称属性的值。在这种情况下,表达式充当左值表达式。
在此处阅读更多信息:value expressions
【讨论】:
JSF EL 使用哈希 (#),而 JSP EL 使用美元符号 ($) 在 jsf1.2 中两种语法是统一的
【讨论】:
这是个好问题!我遇到过一次,和你一样,在寻找答案时遇到了很多麻烦......直到我偶然发现了这篇documentation:
统一 EL 的一个关键特性是它支持表达式的立即和延迟计算。立即评估意味着 JSP 引擎评估表达式并在页面首次呈现时立即返回结果。延迟评估意味着使用表达式语言的技术可以在页面生命周期的稍后时间使用它自己的机制来评估表达式,只要它适合这样做。立即计算的那些表达式使用 ${} 语法,该语法是由 JSP 2.0 表达式语言引入的。延迟评估的表达式使用 JavaServer Faces 技术引入的 #{} 语法。
【讨论】: