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

StackOverflow https://stackoverflow.com/questions/427272

  •  06-07-2019
  •  | 
  •  

Вопрос

Я читал в документах 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top