Когда использовать 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"