Когда использовать 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действие по первоначальному запросу только.Читайте также: