Коли використовувати 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.