JSF 2.0: Почему создается bean-компонент JSF, когда он используется в компоненте, который не отображается? - PullRequest
3 голосов
/ 18 ноября 2010

Давайте создадим чрезвычайно простой составной компонент:

<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}" />

Что происходит, так это то, что компонент никогда не отображается и компонент никогда не инициируется, как можно было бы предположить.

Однако, если мы изменим компонент следующим образом:

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

Что происходитзаключается в том, что компонент по-прежнему не визуализируется (поскольку атрибут rendered равен false), однако, bean-компонент действительно создается.Это происходит всегда, когда мы используем свойство bean-компонента внутри некоторого собственного компонента JSF (h:panelGroup, h:inputHidden, что угодно).

Почему это так?

1 Ответ

6 голосов
/ 18 ноября 2010

Компоненты (и все связанные bean-компоненты) создаются во время сборки представления.Отрисованный атрибут оценивается только во время просмотра.В JSF это всегда срабатывало.

Если бин выполняет дорогостоящую работу во время построения, я бы посоветовал разрешить этой дорогой работе зависеть от некоторого условия, которое вы затем повторно используете в отображаемом атрибуте.

...