Когда использовать f: viewAction / preRenderView против PostConstruct?
когда следует использовать f:viewAction
или preRenderView
событие для инициализации данных для страницы по сравнению с использованием @PostConstruct
аннотации? Является ли разумным использовать один или другой на основе типа области действия бэк-Бина, например, если бэк-бин @RequestScoped
, тогда бы выбор использования f:viewAction
или preRenderView
over @PostConstruct
чтобы инициализировать ваш бэк-бин перед рендерингом представления, не имеет значения, поскольку эти два приведут к одному и тому же эффекту?
f: viewAction или предварительный просмотр
<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
и т. д. А именно, введенные зависимости недоступны внутри конструктора компонента. Таким образом, это будет выполняться только один раз для каждого представления, сеанса или приложения, когда компонент является представлением, сеансом или приложением. Элемент<f:viewAction>
по умолчанию вызывается только при первоначальном запросе GET, но может черезonPostback="true"
атрибут должен быть настроен для вызова при запросах обратной передачи. ЭлементpreRenderView
событие вызывается при каждом HTTP-запросе (да, это также включает в себя AJAX-запросы!).обобщить, использовать
@PostConstruct
Если вы хотите выполнить действия над введенными зависимостями и управляемыми свойствами, которые задаются@EJB
,@Inject
,@ManagedProperty
, etc во время конструкции фасоли. Используйте<f:viewAction>
Если вы и хотите выполнить действия над свойствами, заданными<f:viewParam>
. Если вы все еще на JSF 2.0/2.1, используйтеpreRenderView
вместо<f:viewAction>
. Вы можете при необходимости добавить чек наFacesContext#isPostback()
для выполненияpreRenderView
действие по первоначальному запросу только.Читайте также: