jsf中#{expr}和$ {expr}之间有什么区别?有什么情况我们应该选择$ {expr}吗?

时间:2009-12-04 15:35:20

标签: jsf el

前段时间我读过“核心JSF”的差异,但现在我找不到那个地方。

然而,我不记得在jsf中我们应该使用$ {expr}的情况。所以我只是好奇有什么区别(在板栗中)以及是否有在JSF应用程序中使用$ {expr}的情况?

2 个答案:

答案 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)

来自JavaEE tutorial

立即计算使用$ {}语法的所有表达式。这些表达式只能在模板文本中使用,或者作为可以接受运行时表达式的JSP标记属性的值使用。 [...] 立即计算表达式始终是只读值表达式。上面显示的表达式只能从购物车bean获得总价;它无法设定总价。
延迟评估表达式采用#{expr}形式,可以在页面生命周期的其他阶段进行评估,这是由使用表达式的任何技术定义的。对于JavaServer Faces技术,其控制器可以根据表达式在页面中的使用方式,在生命周期的不同阶段评估表达式。