JSF 2.0 Как создать сохраняющие состояние UIComponents? - PullRequest
3 голосов
/ 03 декабря 2010

Я попробовал просто:

public class UIDemoComponent extends UIComponentBase {

    private String someVariable;  // this gets always cleared, getters/setters omitted

    public UIDemoComponent() {
        super();  // place breakpoint here
    }

    @Override
    public void encodeBegin(FacesContext context) throws IOException {

        HtmlForm form = new HtmlForm();
        form.setStyle("padding: 10px; background-color: blue;");
        getChildren().add(form);

        AjaxBehavior behavior = new AjaxBehavior();
        behavior.setRender(Arrays.asList("@form"));
        form.addClientBehavior("click", behavior);
    }
}

Я зарегистрировал обработчик тега и успешно вставил компонент на страницу. Однако, когда я щелкаю синюю форму, которая отображается, JSF повторно создает компонент (точка останова в конструкторе перехватывается). В результате все переменные экземпляра теряются. Как сохранить данные в компоненты, если они всегда создаются заново?

Я пытался переопределить и проверить механизмы сохранения состояния StateHolder и PartialStateHolder без удачи:

@Override
public Object saveState(FacesContext context) {
    return super.saveState(context);  // breakpoint
}

@Override
public void restoreState(FacesContext context, Object state) {
    super.restoreState(context, state);  // breakpoint
}

JSF выполняет saveState при создании страницы и компонентов, но restoreState никогда не вызывается. На самом деле, когда обрабатывается AJAX-запрос, создается новое условие UIDemoComponent, но метод saveState снова вызывается вместо restoreState.

Как создать такой компонент, сохраняющий состояние (который сохраняет поля экземпляра по запросам AJAX)?

1 Ответ

3 голосов
/ 03 декабря 2010

Похоже, JSF выполняет некоторые предварительные проверки объекта state и вообще не выполняет restoreState, если не введены пользовательские поля.Только после фактической вставки пользовательских значений в объект состояния вызывается restoreState.

Например:

@Override
public Object saveState(FacesContext context) {
    Object[] rtrn = new Object[2];
    rtrn[0] = super.saveState(context);
    rtrn[1] = "dummy";
    return rtrn;
}

После этого вызывается restoreState и можно восстановить поля свойствкак и хотел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...