2012-02-23 3 views
4

매우 간단한 페이징을 구현하기 위해 데이터 테이블을 래핑 할 복합 구성 요소를 만들고 있습니다. 아약스 요청 사이에 상태 (현재 페이지 번호)를 저장해야합니다.UIComponentBase를 확장 할 때 상태를 저장하는 방법

나는 나의 FacesComponent 필드를 생성했지만, 나는 그들이 JSF 라이프 사이클 동안 멸종 발견 :

@FacesComponent(value = "bfTableComponent") 
public class BFTableComponent extends UIComponentBase implements NamingContainer { 

    private int currentPageNumber; 
    ... 

나는이 어디 일에 간결한 가이드를 찾을 것으로 보인다 수 없습니다! 컴포지트 구성 요소를 만들 때 요청간에 상태를 저장하는 방법은 무엇입니까?

답변

9

StateHelper을 사용하십시오. 이 파일은 UIComponent#getStateHelper()에 있습니다.

private enum PropertyKeys { 
    currentPageNumber; 
} 

public void setCurrentPageNumber(int currentPageNumber) { 
    getStateHelper().put(PropertyKeys.currentPageNumber, currentPageNumber); 
} 

public int getCurrentPageNumber() { 
    return (int) getStateHelper().eval(PropertyKeys.currentPageNumber, 0); 
} 

getter에서 기본값 0을 반환합니다. intInteger으로 변경하고 null이 반환 될 기본값을 제거 할 수 있습니다. 구체적인 문제에 관련없는


, 당신은 더 단순화를 위해 또한 단지 대신 NamingContainer을 구현하는 UINamingContainer을 확장 할 수 있습니다. 이렇게하면 UINamingContainer에 의해 이미 올바르게 구현되어 있으므로 재정의 된 getFamily() 메서드를 생략 할 수 있습니다.

+0

"한 번만"초기화 코드를 실행하여 StateHelper에 저장하려는 경우 신속하게 후속 조치를 수행 할 수 있습니다. 그 작업을 수행하기에 적합한 장소는 무엇입니까? BFTableComponent 생성자를 시도했지만 아직 사용 가능한 속성이 없으며 여러 번 실행됩니다. –

+0

정적 데이터입니까? '정적'변수로 만듭니다. 초기화가 복잡하면'static {}'으로 할 수 있습니다. – BalusC

+0

아니, 정적이 아닙니다. 속성 중 하나는 사용자가 초기 페이지를 선택할 수 있다는 것입니다. 정확히 한 번 설정하고 싶습니다. 한 번 초기화 할 장소가 있습니까? –

관련 문제