Подтвердить что ты не робот

Как узнать, есть ли я в обратной передаче?

Я читал в документах JSF, что ResponseStateManager имеет isPostBack(). Как (и где) я могу иметь экземпляр ResponseStateManager?

4b9b3361

Ответ 1

Как узнать, есть ли я в обратной передаче?

Зависит от версии JSF.

В JSF 1.0/1.1 отсутствует метод ResponseStateManager#isPostback(). проверьте, присутствует ли параметр javax.faces.ViewState на карте параметров запроса, доступный ExternalContext#getRequestParameterMap().

public static boolean isPostback() {
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    return externalContext.getRequestParameterMap().contains("javax.faces.ViewState");
}

В JSF 1.2 действительно используйте ResponseStateManager#isPostback(), который, в свою очередь, фактически проверяет наличие параметра javax.faces.ViewState на карте параметров запроса.

public static boolean isPostback() {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getRenderKit().getResponseStateManager().isPostback(context);
}

В JSF 2.0 вместо FacesContext#isPostback(), который под обложками фактически делегирует ResponseStateManager#isPostback().

public static boolean isPostback() {
    return FacesContext.getCurrentInstance().isPostback();
}

Ответ 2

Действительно, перед jsf1.2 isPostBack был получен с помощью requestScope текущего экземпляра FaceContext.

Так как JSF1.2, ResponseStateManager (вспомогательный класс для StateManager, который знает конкретную технологию рендеринга, используемую для генерации ответа, абстрактного класса singleton, сгенерированный RenderKit.)

Во время фазы просмотра восстановления жизненного цикла ViewHandler извлекает объект ResponseStateManager, чтобы проверить, является ли запрос обратной записью или начальным запрос.

Если запрос представляет собой обратную передачу, вызывается метод rerestoreView для ViewHandler. Этот метод использует объектResponseStateManager для повторной сборки дерева компонентов и состояния восстановления. После того, как дерево будет построено и состояние будет восстановлено, экземплярViewHandler не понадобится, пока не появится фаза ответа рендеринга.

Эта статья, упомянутая выше (Создание и использование настраиваемого набора рендеринга) иллюстрирует, как реализовать/получить ResponseStateManager через RenderKit (определенный обработчик тега, реализующий тег, который отображает компонент).
Может быть, этого достаточно, чтобы вы могли получить свой собственный ResponseStateManager в своем контексте?

Ответ 3

Для JSF1.2

public static boolean isPostback(){
    FacesContext context = FacesContext.getCurrentInstance();
    return context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM);
}