2011-11-27 3 views
0

요청 범위가 지정된 bean은 다른 많은 요청 bean & 비즈니스 로직에서 데이터를 수집합니다. 이 bean은 페이지의 EL 표현식을 통해 사용되지만이 요청 전에 범위가 지정된 bean이 페이지에서 사용될 수 있기 때문에 수집 된 데이터를 사용하여 디렉토리를 빌드해야합니다 (모든 콜렉션은 끝났지 만 bean 특성이 페이지에서 사용됨).Bean의 메소드가 JSF 페이지에서 사용되기 전에 실행하십시오.

모든 콜렉션 후이 빈에서 디렉토리 빌드를 실행하려면 어떻게해야합니까? <f:event>을 사용하지 않고 페이지의 EL 표현식을 통해 사용되기 전에 어떻게해야합니까? 나는 그것을 한 번만 만들어야합니다.

@ManagedBean(name="namesDirectory") 
@RequestScoped 
public class NamesDirectory { 

    public void addForPersonNameRetrieval(Integer id) { // this is used to collect the data in bean 
      peopleNamesMap.put(id,null); 
      ....... 
    } 

    public void buildDirectory(){ // used, when all collection is over, to build the diirectory  
      ....... 
    } 

    public String getPersonName(Integer id) { // used in the JSF page through EL expressions 
     name = peopleNamesMap.get(id); 
    } 

} 

여기 buildDirectory() 모든 모음의 끝에서하지만 당신은 몇 가지 옵션을 가지고있다

+0

@Udo가 단 한 번만 제작 한 것보다 더 아름다운 해결책이 없을까요? –

+0

아래의 패턴은 단지 하나의 재건을 야기합니다. –

+0

예 우도, 나는 그것을 가지고 있습니다. & +1 - 그 답을 찾으십시오! 그러나 어쩌면 어떤 종류의 이벤트 청취자를 통한 솔루션이 있는지 궁금 해서요. 단계 청취자에 대해 알지는 못했지만 그들의 이름에서 생각해 보면 이러한 목적이 다소 의미있는 것인지 궁금합니다. 그렇지 않으면 솔루션이 완벽합니다. –

답변

2

는 JSF 페이지에 getPersonName()를 사용하기 전에 실행해야합니다. 모든 삽입 후 또는 모든 검색 전에 디렉토리를 다시 작성할 수 있지만 이로 인해 불필요한 다시 빌드가 발생할 수 있습니다. 필요하고 호출 할 때 당신은 디렉토리를 다시 작성 수 :

  • 이 플래그 requiresRebuild를 추가하고 true에 기본.
  • trueaddForPersonaNameRetrieval으로 설정하십시오.
  • falsebuildDirectory으로 설정하십시오.
  • buildDirectorygetPersonName (으)로 호출하면 다시 작성해야합니다.
관련 문제