你可以看到,我的问题很简单。
在EL语法中#{...}
和${...}
有什么区别?
简单地说,${}
只能做一个get
,而#{}
可以做一个get
和的set
。
在遗留JSP上的JSF中,必须使用#{}
语法来触发托管bean的自动创建,并将请求参数设置为模型值。如果在JSF页面中使用${bean.value}
,那么如果名称为bean
的托管bean不在作用域中,则不会自动创建它。此外,如果表单在输入组件中使用该值提交,则不会设置托管bean属性value
。
在JSF on Facelets中,${}
被重新解释为#{}
,因此它们的行为完全相同。
参见:
- JSP EL、JSF EL和统一EL的区别
${...}
的结果是一个值,#{...}
的结果是一个绑定。这个绑定可以一次又一次地执行。
EL区分两种类型的绑定;一个值绑定和一个方法绑定。值绑定只是为通用方法绑定提供了方便,因为它通过单个表达式表示getter和setter。
在某种程度上,${...}
可以与通过表达式将值传递给方法进行比较:
foo(bar.kaz());
在运行时,bar.kaz()
被求值,foo只接收返回值。foo方法对bar.kaz()
一无所知,不能在以后的时间再次执行计算。
#{...}
可以与将lambda传递给方法或旧的匿名内部类进行比较:
foo(new IntegerReturn() { public int execute() {
bar.kaz();
});
在这里,foo得到一个IntegerReturn
,它可以在它想要的时间调用它想要的次数。
右起
考虑以下两个值表达式:
${book.quantity} #{book.quantity}
第一个使用立即求值语法,而第二个使用延迟求值语法。第一个表达式访问quantity属性,获取其值,然后将值添加到响应中并呈现在页面上。如果第二个表达式在初始请求期间求值,则会发生同样的事情。在本例中,两个表达式都是右值表达式。
看看Sun的这两篇很棒的文章:
Web层与Java EE 5: JSP 2.1技术的新特性总结
统一表达语言