代码之家  ›  专栏  ›  技术社区  ›  Tuukka Mustonen

JSF 2.0:为什么JSF bean在未呈现的组件中使用时会被创建?

  •  3
  • Tuukka Mustonen  · 技术社区  · 14 年前

    让我们有一个非常简单的复合组件:

    <cc:implementation>
        #{testBean.someField}
    </cc:implementation>
    

    豆子:

    public class TestBean {
    
        private boolean someField = false;
        public boolean getSomeField() { return someField; }
    
        @PostConstruct
        public void init() {
            System.out.println("PostConstruct");
        }
    
    }
    

    然后照常打电话,但不要显示出来:

    <codeEditor:test rendered="#{false}" />
    

    所发生的情况是,组件从未呈现,bean也从未像人们想象的那样启动。

    但是,如果我们将组件更改为:

    <cc:implementation>
        <h:outputText value="#{testBean.someField}" />
    </cc:implementation>
    

    发生的情况是组件仍然无法被呈现(因为 rendered 属性是 false )但是,bean确实被实例化了。当我们在一些本地JSF组件中使用bean属性时,总会发生这种情况( h:panelGroup , h:inputHidden ,随便吧)。

    为什么会这样?

    1 回复  |  直到 14 年前
        1
  •  6
  •   BalusC    14 年前

    组件(和所有绑定bean)在视图构建期间创建。渲染属性仅在视图渲染时间期间求值。它在JSF中一直是这样工作的。

    如果bean在构建期间执行一些昂贵的工作,那么我建议让这个昂贵的工作依赖于一些条件,然后在呈现的属性中重用这些条件。

    推荐文章