Как избежать вызова метода preRenderView в запросе ajax?

Мне нужно вызвать метод в поддержку бина, пока страница загружается. Я достиг этого используя

<f:event listener="#{managedBean.onLoad}" type="preRenderView">

Но всякий раз, когда на странице делается запрос ajax, этот метод вызывается снова. Мне это не нужно в моем требовании. Как избежать вызова этого метода в запросе ajax?

1 ответ

Решение

preRenderView Событие просто вызывается при каждом запросе перед отображением представления. Ajax-запрос также является запросом, который отображает представление. Так что поведение вполне ожидаемо.

У вас есть в основном 2 варианта:

  1. Заменить его на @PostConstruct метод на @ViewScoped боб.

    @ManagedBean
    @ViewScoped
    public class ManagedBean {
    
        @PostConstruct
        public void onLoad() {
            // ...
        }
    
    }
    

    Это вызывается только тогда, когда компонент создается впервые. Экземпляр bean-объекта в области представления живет до тех пор, пока вы взаимодействуете с одним и тем же представлением через обратные передачи, ajax или нет.


  2. Выполните проверку внутри метода слушателя, если текущий запрос является ajax-запросом.

    @ManagedBean
    // Any scope.
    public class ManagedBean {
    
        public void onLoad() {
            if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) { 
                return; // Skip ajax requests.
            }
    
            // ...
        }
    
    }
    

    Или, если вы на самом деле заинтересованы в пропуске постбэков вместо конкретных запросов ajax, сделайте это:

            if (FacesContext.getCurrentInstance().isPostback()) { 
                return; // Skip postback requests.
            }
    
Другие вопросы по тегам