Коли використовувати f: viewAction / preRenderView проти PostConstruct?


95

Коли слід використовувати подію f:viewActionor 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()
    {

    }
}

Відповіді:


117

Коли слід використовувати подію f: viewAction або preRenderView для ініціалізації даних для віршів сторінки за допомогою анотації @PostConstruct?

Використовуйте, <f:viewAction>коли ви хочете виконати метод до того, як буде відображений HTML. Це особливо корисно, якщо ви хочете виконувати дії на основі значень моделі, встановлених на <f:viewParam>етапі оновлення значень моделі. А саме, вони недоступні на момент @PostConstructбігу. У JSF 2.0 / 2.1 цього тегу не існувало, і вам доведеться використовувати preRenderViewобхідний шлях.

Якщо допоміжний бін @RequestScoped, чи ефективно вони роблять те саме? (а отже, це залежить від вибору розробника? (@PostConstruct здається «чистішим»).

Ні, вони точно не роблять ефективно одне і те ж. @PostConstructЄ intented для виконання дій безпосередньо після будівництва бін і установки всіх інжектованих залежностей і керованих властивостей , таких як @EJB, @Inject, @ManagedPropertyі т.д. А саме, ін'ецірованние залежності не доступні всередині конструктора компонента. Таким чином, це буде виконуватися лише один раз на перегляд, сеанс або програму, коли компонент перегляду, сеансу чи програми. За <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дії лише за початковим запитом.

Дивитися також:


Дякую. Вибачте, я відредагував своє оригінальне запитання, поки ви писали відповідь ...
BestPractices

Я згадав сферу дії bean, оскільки @PostConstruct викликався б лише один раз, якби компонент був SessionScoped (на момент першого створення компонента), але preRenderView викликався б кожного разу, коли здійснювався доступ до сторінки. Або я це неправильно зрозумів?
BestPractices

Так, це правильно. Подія перегляду попереднього візуалізації викликається на фазі дії виклику. Конструкція post викликається після побудови Bean. Бін із масштабом сеансу не створюється для кожного запиту HTTP.
BalusC

Мені було цікаво, що мій метод викликається під час запитів ajax. дзвінок isPostBack () врятував день !!
jacosta

1

Вам потрібно ініціалізувати властивості керованого компонента? -> Потім, використовуйте @ PostConstruct В іншому випадку, чи потрібно вам працювати з параметрами, переданими з іншого подання? -> Потім використовуйте " preRenderView "

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.