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

我使用JSF2进行编程,netbeans使用#{}创build了许多包含expression式的页面。

不过有时在网上我发现了同样的事情!

有什么区别? 他们是什么?

谷歌忽略了字符#$所以它很难search。

#{}用于延迟expression式(延迟expression式根据页面的生命周期进行parsing),可用于读取或写入或发送到bean或进行方法调用。 $ {}是即时parsing的expression式,只要遇到问题,它们就会被parsing。 它们是只读的。 你可以阅读更多: http :

从“JBossexpression式语言常见问答”中search“Java Server Faces dollar pound”的结果如下:

为什么有些expression式是以磅开始的,其他的则以美元符号开始?

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

这是个好问题! 我曾遇到过像你这样的人,在find答案的时候遇到了很多麻烦,直到我偶然发现了这个文档 :

统一EL的一个关键特征是它支持对expression式的即时和延期评估。 即时评估意味着JSP引擎会评估expression式并在第一次渲染页面时立即返回结果。 延迟评估意味着使用expression式语言的技术可以在页面生命周期的某个时间使用自己的机制来评估expression式,只要这样做是合适的。 那些被立即评估的expression式使用$ {}语法,它是用JSP 2.0expression式语言引入的。 评估被推迟的expression式使用由JavaServer Faces技术引入的#{}语法。

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

Java文档给出了以下解释:

$ {customer.name}
#{顾客姓名}

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

在JavaServer Faces技术的情况下,后一个标签的expression式在页面的初始请求期间被立即求值。 在这种情况下,该expression式用作右值expression式。 在回发请求期间,这个expression式可以用来设置用户input的name属性的值。 在这种情况下,该expression式用作左值expression式。

在这里阅读更多: 值expression式