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

Rom*_*man 13 jsf el

我前段时间读过"核心JSF"的不同之处,但现在我找不到那个地方了.

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

Bal*_*usC 25

总之清晰的语言:${expression}不只是得到,而#{expression}能做到既获得设置.这是因为${expression}只评估一次(立即),而#{expression}对每次访问(延迟)进行评估.

在JSP 2.0或Facelets 1.x上的JSF中,当你把这样的东西作为页面的第一个表达式

${bean.property}
Run Code Online (Sandbox Code Playgroud)

bean请求作用域托管bean 在哪里,你什么都看不到.但如果bean是一个会话范围的托管bean并且之前已经创建过,那么您将看到正在打印的属性值.如果#{bean.xxx}在同一页面之前创建了请求范围的托管bean,则这也适用.

如果您改为作为页面的第一个表达式

#{bean.property}
Run Code Online (Sandbox Code Playgroud)

那么EL将测试if是否bean为null,如果是,那么它将设置(创建)一个新的.如果在bean构造期间设置了属性,那么您将看到此表达式显示的属性.

这一切都是强制性的,以获得其他JSF UIInput组件,如<h:inputText>工作.提交表单时,#{expression}将在bean中设置值.


Boz*_*zho 9

来自JavaEE教程:

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