Когда использовать f: viewAction / preRenderView против PostConstruct? - PullRequest
87 голосов
/ 23 марта 2012

Когда следует использовать событие 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 ]

112 голосов
/ 23 марта 2012

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

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

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

Нет, они точно не делают то же самое. @PostConstruct предназначен для выполнения действий напрямую после построения bean-компонента и установки всех внедренных зависимостей и управляемых свойств, таких как @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 только для первоначального запроса.

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

1 голос
/ 31 июля 2015

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

...