在JSF中,为每个JSF页面创建了一个视图根。什么时候构建?
每当视图呈现或依赖于支持bean初始化时,它是否构造?
答案 0 :(得分:1)
在JSF中,为每个JSF页面创建了一个视图根。什么时候构建?
基本上,当JSF生命周期调用ViewHandler#createView()
时,它将调用ViewDeclarationLanguage#createView()
。在恢复视图阶段可能会发生这种情况但是,在导航发生时,渲染响应阶段也会发生这种情况。或者当JSF需要从给定视图中提取metadata时。当自定义代码显式调用ViewHandler#createView()
时,它也可能发生。 JSF规范中没有任何内容将其限制在特定时刻。
每当视图呈现或依赖于支持bean初始化时,它是否构造?
它不依赖于bean初始化。如果没有这个视图,JSF就不会知道要初始化哪些bean只是因为那些bean是在视图本身中声明的。
答案 1 :(得分:0)
什么时候构建?
它是在生命周期的RESTORE_VIEW
阶段构建的,即首次请求页面时它被表示为UIViewRoot
的实例
每当视图呈现或依赖于支持bean初始化时,它是否构造?
它是在呈现页面之前构造的。虽然您通常会为每个页面请求获得一个新的UIViewRoot
,但您可以重复使用先前视图呈现中的相同对象,并且JSF规范支持这一点。来自规范:
[在
RESTORE_VIEW
期间]检查当前请求的FacesContext
实例。如果它已包含UIViewRoot
:将此
UIViewRoot
上的区域设置设置为此请求的getRequestLocale()
上ExternalContext
方法返回的值。 在此阶段不采取进一步行动,并返回。在还原视图阶段实施之前,FacesContext中已经安装了UIViewRoot
表示该阶段应该假定视图已经通过其他方式恢复。
你可以在支持bean内做很多事情来改变UIViewRoot
,而PhaseListener
或ViewHandler
更适合这种干扰
相关:强>