0

在 JSF 中,会为每个 JSF 页面创建一个视图根。什么时候建的?

它是在每次视图呈现时构造还是依赖于支持 bean 初始化?

4

2 回答 2

3

在 JSF 中,会为每个 JSF 页面创建一个视图根。什么时候建的?

基本上,当 JSF 生命周期ViewHandler#createView()调用ViewDeclarationLanguage#createView(). 这可能在恢复视图阶段发生。但这也可能发生在导航发生的渲染响应阶段。或者当 JSF 需要从给定视图中提取元数据时。当自定义代码显式调用ViewHandler#createView(). JSF 规范中没有任何内容将其限制在特定的时刻。


它是在每次视图呈现时构造还是依赖于支持 bean 初始化?

它不能依赖于 bean 初始化。如果没有视图,JSF 将不知道要初始化哪些 bean,因为这些 bean 是在视图本身中声明的。

于 2015-07-29T07:00:12.250 回答
0

什么时候建的?

它是RESTORE_VIEW在生命周期阶段构建的,即第一次请求页面时,它被表示为UIViewRoot

它是在每次视图呈现时构造还是依赖于支持 bean 初始化?

它是在页面呈现之前构建的。虽然您通常会UIViewRoot为每个页面请求获取一个新对象,但您可以重用来自先前视图呈现的相同对象,并且 JSF 规范支持这一点。从规范:

[期间RESTORE_VIEW] 检查FacesContext当前请求的实例。如果它已经包含一个UIViewRoot

将 this 的语言环境设置为此请求的 方法UIViewRoot返回的值。在此阶段不要采取进一步行动,然后返回。在恢复视图阶段实现之前,已经安装在 FacesContext 中的存在表明该阶段应该假定视图已经通过其他方式恢复。getRequestLocale()ExternalContextUIViewRoot

在 backing bean 中,你真的没有什么可以做的UIViewRoot,更确切地说,aPhaseListener或 aViewHandler更适合这种干扰

有关的:

于 2015-07-29T04:44:39.947 回答