【发布时间】:2010-12-23 07:05:38
【问题描述】:
我前段时间读过关于“Core JSF”的不同之处,但现在我找不到那个地方了。
尽管如此,我不记得曾经说过我们应该在 jsf 中使用 ${expr} 的情况。所以我只是好奇有什么区别(栗子)以及是否有在 JSF 应用程序中使用 ${expr} 的情况?
【问题讨论】:
我前段时间读过关于“Core JSF”的不同之处,但现在我找不到那个地方了。
尽管如此,我不记得曾经说过我们应该在 jsf 中使用 ${expr} 的情况。所以我只是好奇有什么区别(栗子)以及是否有在 JSF 应用程序中使用 ${expr} 的情况?
【问题讨论】:
使用 ${} 语法的所有表达式都会立即求值。这些表达式只能在模板文本中使用,或者作为可以接受运行时表达式的 JSP 标记属性的值。 [...] 立即评估表达式始终是只读值表达式。上面显示的表达式只能从 cart bean 中得到总价;它不能设定总价。
延迟评估表达式采用 #{expr} 的形式,并且可以在页面生命周期的其他阶段进行评估,由使用该表达式的任何技术定义。对于 JavaServer Faces 技术,其控制器可以根据表达式在页面中的使用方式在生命周期的不同阶段评估表达式。
【讨论】:
简而言之:${expression} 只能get,而#{expression} 可以同时get 和set。这是因为${expression} 只被评估一次(立即),而#{expression} 在每次访问时被评估(延迟)。
在 JSP 2.0 或 Facelets 1.x 上的 JSF 中,当您将这样的内容作为页面的第一个表达式时
${bean.property}
其中bean 是一个请求范围的托管bean,您将看到什么都没有。但是如果bean 是一个会话范围的托管bean 并且之前已经创建过,那么您将看到正在打印的属性值。如果请求范围的托管 bean 之前由同一页面中的 #{bean.xxx} 创建,这也适用。
如果你改为作为页面的第一个表达式
#{bean.property}
然后 EL 将测试bean 是否为空,如果是,那么它将设置(创建)一个新的。如果该属性是在 bean 构造期间设置的,那么您将看到该表达式正在显示该属性。
这一切都是让 JSF UIInput 组件(例如 <h:inputText>)工作所必需的。当您提交表单时,#{expression} 将设置 bean 中的值。
【讨论】: