Как сохранить состояние при расширении UIComponentBase - PullRequest
5 голосов
/ 23 февраля 2012

Я создаю составной компонент, который обернет данные для реализации очень простой подкачки страниц.Мне нужно сохранить состояние (номер текущей страницы) между запросами ajax.

Я попытался создать поля в своем FacesComponent, но обнаружил, что они стираются в течение жизненного цикла JSF:

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

    private int currentPageNumber;
    ...

Я не могу найти краткое руководство, чтобы сделать это где-нибудь!Как сохранить состояние между запросами при создании составного компонента?

1 Ответ

10 голосов
/ 23 февраля 2012

Использование 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.


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

...