Я прочитал в документах JSF, что ResponseStateManager
имеет isPostBack()
метод. Как (и где) я могу получить экземпляр ResponseStateManager
?
Как узнать, нахожусь ли я в постбеке?
Ответы (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();
}
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 в вашем контексте?
Для JSF1.2
public static boolean isPostback(){
FacesContext context = FacesContext.getCurrentInstance();
return context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM);
}