Как узнать, нахожусь ли я в постбеке?

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


person Pier Luigi    schedule 09.01.2009    source источник
comment
Я вижу из вашего комментария, что вы нашли практическое решение, и это здорово. Вы можете опубликовать его здесь как ответ, и я проголосую за него;)   -  person VonC    schedule 09.01.2009


Ответы (3)


Как узнать, нахожусь ли я в постбэке?

Зависит от версии 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();
}
person BalusC    schedule 10.03.2011
comment
Текущий экземпляр FacesContext доступен в области EL через #{facesContext}, поэтому это должно делать: #{facesContext.postback}. - person BalusC; 12.06.2012

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

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

На этапе восстановления представления жизненного цикла ViewHandler извлекает объект ResponseStateManager, чтобы проверить, является ли запрос обратным запросом или первоначальным запросом.

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

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

person VonC    schedule 09.01.2009
comment
спасибо за вашу полноту (я проголосовал за вас). Мне нужен был более практичный совет, где я могу получить экземпляр ResponseStateManager, который использует моя реализация: позже я обнаружил, что просто могу получить доступ к RenderKit из FacesContext и использовать getResponseStateManager() - person Pier Luigi; 09.01.2009

Для JSF1.2

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