Как узнать, нахожусь ли я в обратной передаче?
Вопрос
Я читал в документах JSF, что ResponseStateManager
имеет isPostBack ()
. Как (и где) я могу получить экземпляр ResponseStateManager
?
Решение
Как узнать, что я нахожусь в обратной передаче?
Зависит от версии 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();
}
Другие советы
Действительно, до jsf1.2 isPostBack был получен через requestScope текущего экземпляра. FaceContext .
Начиная с JSF1.2, ResponseStateManager (вспомогательный класс для StateManager, который знает конкретную технологию рендеринга, используемую для генерации ответа, одноэлементный абстрактный класс , предоставленный RenderKit.)
На этапе восстановления представления жизненного цикла ViewHandler получает ResponseStateManager объект , чтобы проверить, является ли запрос обратной передачей или первоначальным запросом.
Если запрос является обратной передачей, вызывается метод RestoreView ViewHandler. Этот метод использует объект theResponseStateManager для повторного построения дерева компонентов и восстановления состояния. После того, как дерево построено и состояние восстановлено, экземпляр 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);
}