我仍然不清楚JSF immediate evaluation
和deferred evaluation
的使用,主要是因为在线示例几乎从未使用前一种方法。
我已经看到了相当数量的JSF示例,包括http://docs.oracle.com/javaee/6/tutorial/doc/中包含的那些示例,并且我有点困惑的事实是,我几乎只看到#{}
而不是${}
的示例,即使我们所做的只是读取bean属性。
从我对这两种用法的理解来看,${}
只能用于读取bean属性,不能用于写入。我还没有找到关于immediate
和deferred
评估在JSF生命周期方面的确切区别的清晰解释,以及它们对读取bean属性有什么不同。
如果每个人都使用#{}
来读取bean属性,你会建议什么时候使用${}
呢?
所以,总结一下:
- 为什么当读取 bean属性时,每个人似乎都更喜欢
#{}
而不是${}
? - 你建议什么时候用
${}
代替#{}
? - 你能给我一个例子,在哪里使用
${}
会有不同的结果从使用#{}
(你能解释为什么结果是不同的)?
在Facelets中,${}
被视为#{}
,因此在技术上没有区别,它总是被延迟。
在JSP 2.0及更早版本中,当托管bean还不在作用域中时,${}
不会自动创建托管bean。因此,只有在您能够保证同一个托管bean上的#{}
在组件树中的之前的某个地方被使用,并且还考虑到视图构建时间与视图呈现时间生命周期时,您才能使用它。在所有JSP版本中,${}
都不能设置模型中JSF输入组件的提交值。总而言之,混合它们可能会让初学者感到困惑,长期使用甚至会让你自己感到困惑,因此不建议使用。
参见:
- JSP EL、JSF EL和统一EL的区别