PreRenderView постепенно вызывается при каждой обратной передаче
У меня проблема с порядком и количеством казней.f:event type="preRenderView"
Во время поиска я нашел, как обычно, ответы от BalusC вэтот а такжеэтот пост, связанный с моей проблемой - все же он оставляет мне два вопроса:
Когда я ставлю одинf:event type="preRenderView"
в файле шаблона (для управления общими задачами, такими как проверки состояния пользователя, которые применяются ко всем моим представлениям) и другимf:event type="preRenderView"
в каждом представлении (для обработки определенных инициализаций представления) мне интересно, почему метод слушателя из представления вызывается раньше, чем метод из шаблона.
Когда я ставлю весь после
ui:define
как предложено, он вызывается дважды после перенаправления на эту страницу со страницы входа в систему, но когда я ставлю его на один уровень выше послеui:composition
он вызывается только один раз.
Обновление: пример
Следующий пример демонстрирует поведение выше:
Это файл шаблонаtemplate_test.xhtml
, содержащий слушателя дляpreRenderView
событие, вызывающее общий метод в обработчике для всех представлений:
Это файл просмотраtest.xhtml
, содержащий также слушателя дляpreRenderView
событие, вызывающее определенный метод представления в обработчике и перенаправление командной кнопки через метод обработчика:
Это класс обработчикаTestHandler.java
содержащий 3 метода:
package test;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class TestHandler implements Serializable {
private static final long serialVersionUID = -2785693292020668741L;
public void initCommon() {
System.out.println("Common init called.");
}
public void initIndividual() {
System.out.println("Init for individual page called.");
}
public String redirect() {
return "test/test.xhtml?faces-redirect=true";
}
}
Вот что я вижу в своем журнале tomcat, когда запрашиваю тестовую страницу:
Init for individual page called.
Common init called.
Init for individual page called.
Это показывает нет. 1, что обработчик события из представления вызывается перед тем из шаблона и no. 2, обработчик события из представления вызывается дважды.
Это также показывает третью точкуПоэтому я включил кнопку с перенаправлением на ту же страницу), показывающую, что происходит, если страница запрашивается перенаправлением - отдельная страница вызывается еще больше раз:
Init for individual page called.
Common init called.
Init for individual page called.
Init for individual page called.
Оба нет. 2 и 3 можно предотвратить, поместив весь раздел метаданных надui:define
или добавив фиктивный параметр в представлениеРаздел метаданных, который не включен в URL:
Может кто-нибудь сказать мне причину этих случаев?