我的问题很简单,你可以看到。
EL语法中#{...}
和${...}
之间有什么区别?
答案 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)
考虑这两个值表达式:
${book.quantity} #{book.quantity}
第一个使用立即评估语法,而第二个使用延迟评估语法。第一个表达式访问quantity属性,获取其值,并将值添加到响应并在页面上呈现。如果在初始请求期间评估第二个表达式,则会发生相同的情况。在这种情况下,两个表达式都是rvalue表达式。
答案 3 :(得分:1)