$ {}和#{}之间有什么区别?

时间:2012-01-09 16:02:48

标签: jsf-2 el

我在JSF2中进行编程,netbeans创建了许多包含表达式#{}的页面。

然而,有时在网络上我发现${}同样的事情!

有什么不同吗?它们是什么?

Google会忽略字符#$,因此难以搜索。

5 个答案:

答案 0 :(得分:81)

#{}用于延迟表达式(延迟表达式根据页面的生命周期进行解析),可用于读取或写入bean或进行方法调用。 $ {}是立即解决的表达式,一旦遇到它们就会被解析。它们是只读的。 您可以在此处阅读更多内容:http://docs.oracle.com/javaee/6/tutorial/doc/bnahr.html

答案 1 :(得分:9)

谷歌搜索“Java Server Faces dollar pound”从JBoss Expression Language FAQ中得到以下结果:

  

为什么有些表达式以pound开头而其他表达式以美元符号开头?

     

对于EL规范本身,没有区别。这取决于使用EL来决定它意味着什么的技术。对于JSP和JSF,以井号开头的表达式意味着延迟评估,而美元符号表示立即评估。这一切都与在请求处理期间实际评估表达式有关。井号在JSF组件中使用,因为我们希望表达式由JSF生命周期而不是JSP或Facelets引擎进行评估。

答案 2 :(得分:8)

这是一个很好的问题!我曾经面对过一次和你一样,在找到答案时遇到了很多麻烦......直到我偶然发现documentation这一段:

  

统一EL的一个关键特性是它支持表达式的即时和延迟评估。立即评估意味着JSP引擎评估表达式并在首次呈现页面时立即返回结果。延迟评估意味着使用表达式语言的技术可以使用自己的机制在页面生命周期的某个时间稍后评估表达式,只要适当的话。那些立即计算的表达式使用$ {}语法,该语法是随JSP 2.0表达式语言引入的。延迟评估的表达式使用#{}语法,该语法是由JavaServer Faces技术引入的。

答案 3 :(得分:5)

Java文档提供了以下说明:

  

$ {customer.name}
#{customer.name}

  前者使用立即评估语法,而后者使用延迟评估语法。第一个表达式访问name属性,获取其值,将值添加到响应中,并在页面上呈现。第二个表达式也会发生同样的情况。但是,如果使用此标记的技术允许,标记处理程序可以将此表达式的评估推迟到页面生命周期的稍后时间。

对于JavaServer Faces技术,后一个标记的表达式是在初始页面请求期间立即评估。在这种情况下,此表达式充当右值表达式。在回发请求期间,此表达式可用于使用用户输入设置name属性的值。在这种情况下,表达式充当左值表达式。

在此处阅读更多内容:value expressions

答案 4 :(得分:4)

JSF EL使用散列(#),其中JSP EL使用美元符号($) 在jsf1.2中,两种语法都是统一的