Как узнать, нахожусь ли я в обратной передаче? - PullRequest
18 голосов
/ 09 января 2009

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

Ответы [ 3 ]

42 голосов
/ 11 марта 2011

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

Зависит от версии 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();
}
6 голосов
/ 09 января 2009

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

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

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

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

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

2 голосов
/ 11 марта 2011

для JSF1.2

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