我在JSF2中编程,NetBeans创建了许多#{}
包含表达式的页面。但是有时在网上我发现${}
了同样的事情!
有什么区别吗?这些是什么?
Answers:
#{}
用于延迟表达式(根据页面的生命周期解析它们),可用于从Bean读取或写入Bean或进行方法调用。${}
是立即解决的表达式,一旦遇到它们就将被解决。它们是只读的。您可以在此处了解更多信息:http : //docs.oracle.com/javaee/6/tutorial/doc/bnahr.html
通过JBoss Expression Language FAQ进行的Google搜索“ Java Server Faces美元汇率”给出了以下结果:
为什么有些表达式以英镑开头,而另一些表达式以美元符号开头?
对于EL规范本身,没有区别。取决于使用EL的技术来决定其含义。对于JSP和JSF而言,以英镑符号开头的表达式均表示递延评估,而以美元符号表示立即评估。这与何时在请求处理期间实际评估表达式有关。在JSF组件中使用井号,因为我们希望表达式由JSF生命周期而不是JSP或Facelets引擎评估。
这是个好问题!我曾经面对过一次,就像您一样,在寻找答案时遇到了很多麻烦……直到我偶然发现了这本文档:
统一EL的一个关键特性是它支持立即和延迟的表达式评估。立即评估是指JSP引擎评估表达式并在首次呈现页面时立即返回结果。递延评估意味着使用表达语言的技术可以在页面生命周期中的某个适当时候使用它自己的机制来评估表达。立即求值的那些表达式将使用$ {}语法,该语法是JSP 2.0表达式语言引入的。延迟计算的表达式使用JavaServer Faces技术引入的#{}语法。
Java文档提供了以下解释:
$ {customer.name}
#{customer.name}
前者使用立即评估语法,而后者使用延迟评估语法。第一个表达式访问name属性,获取其值,将该值添加到响应中,并在页面上呈现。第二个表达式也可能发生相同的情况。但是,如果使用此标签的技术允许,标签处理程序可以将该表达式的求值推迟到页面生命周期的稍后时间。
对于JavaServer Faces技术,将在初始请求页面期间立即评估后一个标记的表达式。在这种情况下,此表达式充当右值表达式。在回发请求期间,此表达式可用于通过用户输入来设置name属性的值。在这种情况下,该表达式充当左值表达式。
在这里阅读更多:值表达式