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

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

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

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

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

4b9b3361

Ответ 1

Событие preRenderView запускается только при каждом запросе перед визуализацией представления. Запрос ajax также является запросом, который отображает представление. Таким образом, поведение полностью ожидается.

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

  • Замените его методом @PostConstruct на @ViewScoped bean.

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

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


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

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

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

            if (FacesContext.getCurrentInstance().isPostback()) { 
                return; // Skip postback requests.
            }