EL语法中#{...}和$ {...}之间有什么区别

时间:2011-08-26 19:02:49

标签: jsf java-ee el

我的问题很简单,你可以看到。

EL语法中#{...}${...}之间有什么区别?

4 个答案:

答案 0 :(得分:15)

简单地说,${}只能get,而#{}可以get a set价值。

在遗留JSP的JSF中,必须使用#{}语法来触发托管bean的自动创建并将请求参数设置为模型值。如果您在JSF页面中使用了${bean.value},那么如果它不在范围内,则不会自动创建名为bean的托管bean。此外,如果在输入组件中使用该值提交表单,则不会设置托管bean属性value

在Facelets上的JSF中,${}被重新解释为#{},因此它们的行为完全相同。

另见:

答案 1 :(得分:6)

${...}的结果是值,而#{...}的结果是绑定。这种绑定可以一遍又一遍地执行。

EL区分两种绑定;值绑定和方法绑定。值绑定只是一般方法绑定的便利,因为它通过单个表达式表示getter和setter。

在某种程度上,${...}可以与通过表达式将值传递给方法进行比较:

foo(bar.kaz());

在运行时,bar.kaz()被评估,foo只接收返回的值。 foo方法对bar.kaz()一无所知,不能在以后再次进行评估。

#{...}可以与将lambda传递给方法或旧的匿名内部类进行比较:

foo(new IntegerReturn() { public int execute() {
    bar.kaz();
});

在这里,foo得到一个IntegerReturn,它可以在它想要的时候调用它。

答案 2 :(得分:3)

source

开始
  

考虑这两个值表达式:

${book.quantity}
#{book.quantity}
     

第一个使用立即评估语法,而第二个使用延迟评估语法。第一个表达式访问quantity属性,获取其值,并将值添加到响应并在页面上呈现。如果在初始请求期间评估第二个表达式,则会发生相同的情况。在这种情况下,两个表达式都是rvalue表达式。

答案 3 :(得分:1)