2009-12-04 59 views
11

我以前读过'Core JSF'的差异,但现在我找不到那个地方。

尽管如此,我不记得在jsf中我们应该使用$ {expr}的时候有一个关于case的字。所以我只是好奇,它有什么区别(在板栗里),如果有在JSF应用程序中使用$ {expr}的情况?

回答

23

总结清晰的语言:${expression}只做得到,而#{expression}既可以做得到设置。这是因为${expression}仅评估一次(立即),而#{expression}评估每个访问(延迟)。

在JSF的JSP 2.0或Facelets的1.x中,当你把这样的事情在页面

${bean.property} 

其中bean是一个请求范围内管理bean的第一个表情,你会看到什么。但是如果bean是一个会话范围的托管bean并且之前已经创建,那么您将看到正在打印的属性值。如果请求范围的托管bean是在同一页面中由#{bean.xxx}以前创建的,这也适用。

如果你不是做的页面

#{bean.property} 

的第一个表达式,然后将EL测试,如果bean为空,如果是这样,那么它会设置(创建)一个新的。如果在bean构建期间设置了该属性,那么您将看到该表达式显示的属性。

这一切都必须在其他JSF UIInput部件如<h:inputText>工作得到。当您提交表格时,#{expression}设置为这个bean中的值。

8

JavaEE tutorial

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