2009-06-03 2 views
0

내 관리 빈 :를 ForEach 및 Facelets의

public List<String> getLiQuickNav(){ 

    System.out.println("I'm here..."); 

    List<String> l = new ArrayList<String>(); 
    l.add("toto"); 
    l.add("tata"); 
    l.add("titi"); 
    return l; 
} 

내 대해 forEach :

<c:forEach var="categorie" items="#{mainControleur.liQuickNav}"> 
    <h:outputLabel value="${categorie}"/> 
</c:forEach> 

내 출력 스트림 : 내가 여기
내가 여기
...
나는 여기에 ...
나는 여기에있다 ...

"getLiQuickNav()"는 ForEach에서 4 회 호출합니다. 그러나 나는 단지 "getLiQuickNav()"를 한 번 호출하는 것을 wan't하지 않습니다 ... 어떻게 한 번 호출해야합니까?

보너스 질문 : "getLiQuickNav()"는 (는) 3 시간 동안 'tata, titi, toto'만 가져 오는 이유는 무엇입니까?

감사의

답변

3

당신은 getLiQuickNav()가 호출되는 횟수 제어 할 수 없습니다 -이 호출 사이에 재건되지 않도록 목록을 캐싱 고려합니다.

private List<String> l; 

public List<String> getLiQuickNav() 
{ 
    if (l == null) 
    { 
      System.out.println("I'm here..."); 

      l = new ArrayList<String>(); 
      l.add("toto"); 
      l.add("tata"); 
      l.add("titi"); 
    } 
    return l; 
} 

뿐만 아니라 당신은 <ui:repeat/>보다는 <c:forEach/>를 사용한다. 이유에 대해서는 blog 항목을 참조하십시오.

+0

나는 위와 같은 것이 일반적으로 좋은 습관이라고 생각하지 않습니다. 3 가지 항목으로 무언가를 초기화 할 이유가 없습니다. 생성자 또는 정적 블록에서 목록을 구성합니다. – GreenieMeanie

+0

@GreenieMeanie - 이것은 분명히 간단한 예제입니다. 실제 목록 데이터는 개체 구성이나 정적 블록 초기화 (예 : 데이터베이스와 같은 일부 외부 소스에서 가져온 경우)에서 사용할 수 없습니다. 대답은 getLiQuickNav()를 호출 할 때마다 목록을 구성해서는 안된다는 것을 설명하기위한 것입니다. – mtpettyp

2

당신은 게터의 모든 시간을 상태를 다시 초기화하고

대답. 이는 접근자를 의미하며 상태를 초기화하는 방법이 아닙니다. getLiQuickNav에서 목록을 작성하지 말고 생성자 또는 설정자에서 작성하십시오.

당신이 목록을 초기화 getLiQuickNav() 전화를 처음으로,이 목록에 대한 참조가 대회 3 이상 (.liQuickNav) 다음 getLiQuickNav()가 호출 표현식을 평가하는 범위에 반환 저장됩니다

보너스 목록의 각 항목에 대한 시간.

언제든지 같은 목록을 반환하면 한 번 호출되어야합니다. 당신은 매번 새로운 것을 돌려주고 있습니다.

2

Getter 's in Java (모든 상황에서 Faces Managed Beans에 포함)는 아무 것도 생성해서는 안되며 값을 반환해야합니다. 목록을 작성한 후 반환하십시오.