Ответ 1
Когда нужно использовать событие f: viewAction или preRenderView для инициализации данных для стихов страницы с помощью аннотации @PostConstruct?
Используйте <f:viewAction>
, если вы хотите выполнить метод до того, как HTML будет визуализирован. Это особенно полезно, если вы хотите выполнять действия на основе значений модели, установленных <f:viewParam>
во время фазы значений модели обновления. А именно, они недоступны в момент запуска @PostConstruct
. В JSF 2.0/2.1 этот тег не существует, и вы должны использовать обходное решение preRenderView
.
Если поддержка bean равна @RequestScoped, эффективно ли они делают то же самое? (а значит, это выбор разработчика? (@PostConstruct кажется "чище" ).
Нет, они определенно не делают то же самое. @PostConstruct
намерен выполнять действия непосредственно после bean построения и настройки всех вложенных зависимостей и управляемых свойств, таких как @EJB
, @Inject
, @ManagedProperty
и т.д. А именно, вложенные зависимости недоступны внутри bean конструктор. Таким образом, это будет выполняться только один раз для каждого вида, сеанса или приложения, если bean - это область просмотра, сеанса или приложения. <f:viewAction>
по умолчанию запускается только при первоначальном запросе GET, но может быть сконфигурирован с помощью атрибута onPostback="true"
для вызова на запросы обратной передачи. Событие preRenderView
вызывается в каждом HTTP-запросе (да, это также включает в себя запросы ajax!).
Подводя итоги, используйте @PostConstruct
, если вы хотите выполнять действия над вложенными зависимостями и управляемыми свойствами, которые устанавливаются @EJB
, @Inject
, @ManagedProperty
и т.д. во время построения bean. Используйте <f:viewAction>
, если вы также хотите выполнять действия над свойствами, заданными <f:viewParam>
. Если вы все еще используете JSF 2.0/2.1, используйте preRenderView
вместо <f:viewAction>
. Вы можете при необходимости добавить проверку FacesContext#isPostback()
для выполнения действия preRenderView
только для начального запроса.