我有一个带有表单的jsf页面,其中包含一个outputtext。 outputtext组件的值是从辅助bean(或托管bean)调用的。我知道我把它编码为#{MyBean.myString} Jsf重命名它并调用getMyString()方法。然而,奇怪的是,当我将断点放到此组件的getter方法时,我看到它在页面呈现期间被调用了两次。 outputtext采用h:形式,它是唯一绑定到backingbean的组件。我的意思是,jsf在第一次进入getter方法时应该得到它是如此奇怪,但它需要两次进入getter方法。 你能解释一下jsf中这种行为的原因是什么吗?
任何帮助将不胜感激, 最好的祝愿, 巴里斯
答案 0 :(得分:16)
getter,正如其名称已经自我描述的那样,只是用于检索数据的纯粹目的。 JSF不会缓存此数据。它会在需要时调用它。调用getter的成本实际上是无法实现的 - 除了返回数据之外你做的更多事情,例如每次都按下数据库,这个逻辑应该被移出getter或者变成延迟加载。
在表单提交的情况下,通常在验证阶段触发第一个get调用,以检查是否有任何初始值,以便JSF可以处理值更改事件。第二个调用通常在渲染响应阶段触发,以在视图中显示模型值。
您可能会发现this article也很有用,可以了解有关JSF生命周期的更多信息。您可能会发现this answer对于了解有关在辅助bean中进行预处理/初始化的方法的更多信息非常有用。