【发布时间】:2011-11-04 18:43:51
【问题描述】:
如您所见,我的问题很简单。
EL语法中#{...}和${...}有什么区别?
【问题讨论】:
-
@McDowell:是的。我看到完全重复的:-S。我相信在这里我们有很好的答案。但是我不确定是否删除它。
标签: jsf jakarta-ee el
如您所见,我的问题很简单。
EL语法中#{...}和${...}有什么区别?
【问题讨论】:
标签: jsf jakarta-ee el
简单地说,${} 只能做一个get,而#{} 可以做一个get 和一个set 的值。
在旧版 JSP 上的 JSF 中,#{} 语法对于触发托管 bean 的自动创建以及将请求参数设置为模型值是必需的。如果您在 JSF 页面中使用了 ${bean.value},那么如果名称为 bean 的托管 bean 不在范围内,则不会自动创建它。此外,如果表单是在输入组件中使用该值提交的,则不会设置托管 bean 属性value。
在 Facelets 上的 JSF 中,${} 被重新解释为 #{},因此它们的行为完全相同。
【讨论】:
h:inputText 组件的value 属性从id=userNo 从#(延迟)更改为$(立即),并且该应用程序显然工作相同。我错过了什么?
${...} 的结果是一个值,而#{...} 的结果是一个绑定。这种绑定可以反复执行。
EL 区分两种绑定;值绑定和方法绑定。值绑定只是通用方法绑定的一种便利,因为它通过单个表达式同时表示 getter 和 setter。
在某种程度上,${...} 可以与通过表达式将值传递给方法进行比较:
foo(bar.kaz());
在运行时,bar.kaz() 被评估并且 foo 只接收返回的值。 foo 方法对bar.kaz() 一无所知,以后无法再次进行评估。
#{...} 有点类似于将 lambda 传递给方法或旧的匿名内部类:
foo(new IntegerReturn() { public int execute() {
bar.kaz();
});
在这里,foo 获得了一个IntegerReturn,它可以在它想要的时间任意调用它。
【讨论】:
来自source
考虑这两个值表达式:
${book.quantity} #{book.quantity}第一个使用立即评估语法,而第二个使用延迟评估语法。第一个表达式访问数量属性,获取它的值,然后将该值添加到响应中并呈现在页面上。如果在初始请求期间评估第二个表达式,则会发生同样的事情。在这种情况下,两个表达式都是右值表达式。
【讨论】: