13

我前段时间读过关于“Core JSF”的不同之处,但现在我找不到那个地方了。

尽管如此,我不记得有一个关于我们应该在 jsf 中使用 ${expr} 的情况的词。所以我只是好奇有什么区别(栗子)以及是否有在 JSF 应用程序中使用 ${expr} 的情况?

4

2 回答 2

25

用清晰的语言总结一下:${expression}does only get,while getset#{expression}都可以。这是因为仅评估一次(立即),而每次访问都评估(延迟)。${expression}#{expression}

在 JSP 2.0 或 Facelets 1.x 上的 JSF 中,当您将这样的内容作为页面的第一个表达式时

${bean.property}

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

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

#{bean.property}

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

这一切都是为了让其他 JSFUIInput组件<h:inputText>正常工作所必需的。当您提交表单时,#{expression}将在 bean 中设置值。

于 2009-12-04T16:03:05.117 回答
9

来自JavaEE 教程

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