在JSF中创建ViewRoot时?

时间:2015-07-28 07:59:33

标签: jsf viewroot

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

每当视图呈现或依赖于支持bean初始化时,它是否构造?

2 个答案:

答案 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,而PhaseListenerViewHandler更适合这种干扰

相关: