2010-11-18 3 views
3

의는 매우 간단 복합 구성 요소를 보자 : 그것을 위해JSF 2.0 : JSF 빈은 렌더링되지 않은 구성 요소에서 사용될 때 왜 생성됩니까?

<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 때문에) 구성 요소가 여전히 렌더링 결코 극복 그러나, 빈이 인스턴스화 않는다는 것입니다. 이는 네이티브 JSF 컴포넌트 (h:panelGroup, h:inputHidden, 뭐든간에) 내부에서 bean 속성을 사용할 때 항상 발생합니다.

왜 그렇습니까?

답변

6

구성 요소 (및 모든 바인드 된 Bean)는보기 빌드 중 작성됩니다. 렌더링 된 속성은 뷰 렌더링 시간 동안 만 평가됩니다. JSF에서 항상 그렇게 작동했습니다.

빈이 건설 중에 값 비싼 일을하고 있다면 비싼 작업을 렌더링 된 속성에서 재사용하는 일부 조건에 의존하도록 제안 할 것입니다.

+0

감사합니다. BalusC, 나는 그것이 근본적이지만 정확히 무엇인지는 알지 못했습니다. 구성 요소와 콩을 사용하지 않을 때 생성하는 것이 좋지 않습니까? –

+0

그래서이 문제를 해결할 수있는 유일한 방법은 복합 구성 요소 대신 UIComponents를 사용하는 것입니다. –

+0

방금 ​​해킹을 시도했습니다. 내용을 초기화할지 여부에 따라 0-1 요소가있는 ui : repeat를 사용하십시오. 컨텐츠를 생성해서는 안되는 경우 빈리스트를 리턴하고 컨텐츠가 작성되고 렌더링 될 때리스트 내에 하나의 더미 엘리먼트 (무엇이든)를 리턴하는 메소드를 생성했다. 그것은 구성 요소 트리를 조금 비싸지 만 적어도 기본적인 경우에는 작동해야합니다. –