前段时间我读过“核心JSF”的差异,但现在我找不到那个地方。
然而,我不记得在jsf中我们应该使用$ {expr}的情况。所以我只是好奇有什么区别(在板栗中)以及是否有在JSF应用程序中使用$ {expr}的情况?
答案 0 :(得分:25)
要用清晰的语言进行总结:${expression}
仅获取,而#{expression}
可以同时执行获取和设置。这是因为${expression}
仅评估一次(立即),而#{expression}
评估每次访问(延迟)。
在JSP 2.0或Facelets 1.x上的JSF中,当你把这样的东西作为页面的第一个表达式时
${bean.property}
其中bean
是请求范围的托管bean,您将看到 nothing 。但是,如果bean
是会话范围的托管bean并且之前已经创建过,那么您将看到正在打印的属性值。如果请求作用域托管bean是在#{bean.xxx}
之前在同一页面中创建的,那么这也适用。
如果您改为作为页面的第一个表达
#{bean.property}
然后EL会测试bean
是否为空,如果是,那么它将设置(创建)一个新的。如果在bean构造期间设置了属性,那么您将看到此表达式显示的属性。
这一切都是强制性的,以便让其他JSF UIInput
组件(例如<h:inputText>
)起作用。提交表单时,#{expression}
将设置 bean中的值。
答案 1 :(得分:9)
立即计算使用$ {}语法的所有表达式。这些表达式只能在模板文本中使用,或者作为可以接受运行时表达式的JSP标记属性的值使用。 [...] 立即计算表达式始终是只读值表达式。上面显示的表达式只能从购物车bean获得总价;它无法设定总价。
延迟评估表达式采用#{expr}形式,可以在页面生命周期的其他阶段进行评估,这是由使用表达式的任何技术定义的。对于JavaServer Faces技术,其控制器可以根据表达式在页面中的使用方式,在生命周期的不同阶段评估表达式。