Фаза слушателя слушается только если не постбэк - PullRequest
3 голосов
/ 16 марта 2012

По сути, мне нужно вызвать метод после фазы RENDER_RESPONSE. Я попробовал это:

<f:phaseListener type="com.examples.MyPhaseListener"/>

Вышеуказанный слушатель все время слушает даже вызовы ajax. Я пытался

rendered="#{!facesContext.postback}" 

но это не применимо здесь, я думаю. Поэтому я попробовал это, как упомянуто в этом сообщении Можно ли отключить прослушиватель f: event type = "preRenderView" при обратной передаче? :

public void beforePhase(PhaseEvent pe) {
 if (!FacesContext.getCurrentInstance().isPostback()) {
          //do nothing
      }
}

public void afterPhase(PhaseEvent pe) {
      if (!FacesContext.getCurrentInstance().isPostback()) {
           if (pe.getPhaseId() == PhaseId.RENDER_RESPONSE) {
               //call a method
            }
      }
}

Это работает, но есть ли другой способ отключить прослушиватель после первоначального ответа? Я также попробовал preRenderComponent, но он вызывается перед фазой RENDER_RESPONSE, и похоже, что он не отображает ответ, пока метод не вышел из стека (в основном он не асинхронный). Поэтому я чувствую, что SystemEvents, такие как preRenderView и preRenderComponent, не имеют большого преимущества по сравнению с вызовом их в PostConstruct.

1 Ответ

3 голосов
/ 16 марта 2012

Нет другого способа достичь функциональных требований.A Filter, в котором вы выполняете работу после , вызов chain.doFilter(request, response) также должен работать, но это не дает вам доступа к контексту лиц (хотя многие специфические данные JSF также доступныстандартный сервлет API).

Что касается вашего слушателя фазы, если вам нужно, чтобы он прослушивал ответ рендеринга только , то добавьте

public PhaseId getPhaseId() {
    return PhaseId.RENDER_RESPONSE;
}

не нужно проверять текущую фазу в методах слушателя.

public void afterPhase(PhaseEvent event) {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
   }
}

В следующем JSF 2.2, кстати, будет новый тег, который понимает isPostback(), <f:viewAction>:

<f:viewAction action="#{bean.action}" onPostback="false" />

Однако он запускается только во время фазы действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...