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

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

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()
    {

    }
}

2 ответа

Решение

Когда следует использовать событие f:viewAction или preRenderView для инициализации данных для стихов страницы, используя аннотацию @PostConstruct?

Использовать <f:viewAction> когда вы хотите выполнить метод до отображения HTML. Это особенно полезно, если вы хотите выполнять действия на основе значений модели, установленных <f:viewParam> во время фазы обновления значений модели. А именно, они не доступны на данный момент @PostConstruct пробеги. В JSF 2.0/2.1 этот тег не существует, и вы должны использовать preRenderView обходной путь.

Если базовым компонентом является @RequestScoped, эффективно ли они делают то же самое? (и так, тогда выбор за разработчиком? (@PostConstruct кажется "чище").

Нет, они точно не делают то же самое. @PostConstruct намеревается выполнять действия непосредственно после построения компонента и установки всех внедренных зависимостей и управляемых свойств, таких как @EJB, @Inject, @ManagedProperty и т. д. А именно, внедренные зависимости недоступны внутри конструктора бина. Таким образом, он будет запускаться только один раз для представления, сеанса или приложения, когда bean-компонент является видом, сеансом или приложением. <f:viewAction> по умолчанию вызывается только при первоначальном запросе GET, но может через onPostback="true" Атрибут должен быть настроен на вызовы обратной передачи. preRenderView событие вызывается при каждом запросе HTTP (да, это также включает запросы ajax!).

Подведены итоги, использовать @PostConstruct если вы хотите выполнить действия с внедренными зависимостями и управляемыми свойствами, которые установлены @EJB, @Inject, @ManagedProperty и т. д. во время строительства бобов. использование <f:viewAction> если вы также хотите выполнить действия со свойствами, установленными <f:viewParam>, Если вы все еще на JSF 2.0/2.1, используйте preRenderView вместо <f:viewAction>, Вы можете при необходимости добавить проверку на FacesContext#isPostback() выполнить preRenderView действие только по первому запросу.

Смотрите также:

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

Другие вопросы по тегам