【问题标题】:When ViewRoot is created in JSF?什么时候在 JSF 中创建 ViewRoot?
【发布时间】:2015-07-28 07:59:32
【问题描述】:

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

它是在每次视图渲染时构造还是依赖于后台bean初始化?

【问题讨论】:

    标签: jsf viewroot


    【解决方案1】:

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

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


    是在每次视图渲染的时候构造还是依赖于backing bean初始化?

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

    【讨论】:

      【解决方案2】:

      什么时候建的?

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

      它是在每次视图渲染时构造还是依赖于后台bean初始化?

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

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

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

      在 backing bean 中你真的没有什么可以做的,改变 UIViewRoot,相反,PhaseListenerViewHandler 更适合这种干扰

      相关:

      【讨论】:

      • 恢复视图阶段确实会创建视图,但视图并不总是在恢复视图阶段创建。
      猜你喜欢
      • 2018-11-26
      • 2012-03-25
      • 2011-01-04
      • 2019-06-13
      • 2014-02-07
      • 1970-01-01
      • 2011-01-11
      • 2014-12-08
      • 1970-01-01
      相关资源
      最近更新 更多