Когда использовать f: viewAction/preRenderView и PostConstruct?

Когда следует использовать событие f:viewAction или preRenderView для инициализации данных для страницы в сравнении с аннотацией @PostConstruct? Является ли обоснование использовать тот или иной вариант в зависимости от типа области поддержки bean, например. Если поддержка bean равна @RequestScoped, тогда выбор использования f:viewAction или preRenderView поверх @PostConstruct для инициализации вашей резервной копии bean до того, как представление будет неактуальным, так как они приведут к тому же эффект?

f: viewAction или preRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

или

@PostConstruct

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}

Ответ 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 только для начального запроса.

См. также:

Ответ 2

Вам нужно инициализировать управляемые свойства bean? → Затем используйте @ PostConstruct В противном случае вам нужно работать с параметрами, переданными из другого представления? → Затем используйте " preRenderView"