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

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

Читайте также:

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