在 JSF 中,会为每个 JSF 页面创建一个视图根。什么时候建的?
它是在每次视图呈现时构造还是依赖于支持 bean 初始化?
在 JSF 中,会为每个 JSF 页面创建一个视图根。什么时候建的?
基本上,当 JSF 生命周期ViewHandler#createView()
调用ViewDeclarationLanguage#createView()
. 这可能在恢复视图阶段发生。但这也可能发生在导航发生的渲染响应阶段。或者当 JSF 需要从给定视图中提取元数据时。当自定义代码显式调用ViewHandler#createView()
. JSF 规范中没有任何内容将其限制在特定的时刻。
它是在每次视图呈现时构造还是依赖于支持 bean 初始化?
它不能依赖于 bean 初始化。如果没有视图,JSF 将不知道要初始化哪些 bean,因为这些 bean 是在视图本身中声明的。
什么时候建的?
它是RESTORE_VIEW
在生命周期阶段构建的,即第一次请求页面时,它被表示为UIViewRoot
它是在每次视图呈现时构造还是依赖于支持 bean 初始化?
它是在页面呈现之前构建的。虽然您通常会UIViewRoot
为每个页面请求获取一个新对象,但您可以重用来自先前视图呈现的相同对象,并且 JSF 规范支持这一点。从规范:
[期间
RESTORE_VIEW
] 检查FacesContext
当前请求的实例。如果它已经包含一个UIViewRoot
:将 this 的语言环境设置为此请求的 方法
UIViewRoot
返回的值。在此阶段不要采取进一步行动,然后返回。在恢复视图阶段实现之前,已经安装在 FacesContext 中的存在表明该阶段应该假定视图已经通过其他方式恢复。getRequestLocale()
ExternalContext
UIViewRoot
在 backing bean 中,你真的没有什么可以做的UIViewRoot
,更确切地说,aPhaseListener
或 aViewHandler
更适合这种干扰
有关的: