Как избежать вызова метода preRenderView в запросе ajax?
Мне нужно вызвать метод в поддержку бина, пока страница загружается. Я достиг этого используя
<f:event listener="#{managedBean.onLoad}" type="preRenderView">
Но всякий раз, когда на странице делается запрос ajax, этот метод вызывается снова. Мне это не нужно в моем требовании. Как избежать вызова этого метода в запросе ajax?
1 ответ
preRenderView
Событие просто вызывается при каждом запросе перед отображением представления. Ajax-запрос также является запросом, который отображает представление. Так что поведение вполне ожидаемо.
У вас есть в основном 2 варианта:
Заменить его на
@PostConstruct
метод на@ViewScoped
боб.@ManagedBean @ViewScoped public class ManagedBean { @PostConstruct public void onLoad() { // ... } }
Это вызывается только тогда, когда компонент создается впервые. Экземпляр bean-объекта в области представления живет до тех пор, пока вы взаимодействуете с одним и тем же представлением через обратные передачи, ajax или нет.
Выполните проверку внутри метода слушателя, если текущий запрос является 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. }