Как узнать, что я в postback?

Я читал в документах 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();
}

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

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

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

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

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


для JSF1.2

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