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