2012-02-23 2 views
4

Я создаю составной компонент, который будет обертывать datatable, чтобы реализовать очень простой пейджинг. Мне нужно сохранить состояние (текущий номер страницы) между запросами ajax.Как сохранить состояние при расширении 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); 
} 

Обратите внимание, что я возвращаю значение по умолчанию 0 в поглотителе. Возможно, вы захотите изменить int на Integer и удалить значение по умолчанию, чтобы вернуть null.


Unrelated к конкретной проблеме, вы можете для дополнительной простоты и просто расширить UINamingContainer вместо реализации NamingContainer. Таким образом, вы можете опустить переопределенный метод getFamily(), поскольку он уже правильно реализован UINamingContainer.

+0

Быстрое наблюдение, если я хотел запустить код инициализации «Один раз» и сохранить его в StateHelper, что было бы подходящим местом для этого? Я попробовал конструктор BFTableComponent, но у меня еще не было доступных свойств, и он запускается несколько раз. –

+0

Это статические данные? Сделайте его «статической» переменной. Если инициализация сложна, вы можете сделать это в 'static {}'. – BalusC

+0

Нет, не статично. одним из атрибутов является то, что пользователь может выбрать начальную страницу. Я хочу установить это ровно один раз. Есть ли место для однократной инициализации? –

Смежные вопросы