Kiedy używać f: viewAction / preRenderView, a kiedy PostConstruct?

96

Kiedy należy użyć zdarzenia f:viewActionlub preRenderViewdo zainicjowania danych strony, a kiedy @PostConstructadnotacji? Czy uzasadnienie użyć jednego lub drugiego na podstawie rodzaju zakresu podkład fasoli np Jeżeli fasola podkładowa jest @RequestScoped, wtedy wybór użyciem f:viewActionlub preRenderViewnad @PostConstructzainicjować swój podkład fasoli przed renderowania widoku być nieistotne, ponieważ dwa będą wywołać ten sam efekt?

f: viewAction lub preRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

lub

@PostConstruct

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}
Najlepsze praktyki
źródło

Odpowiedzi:

119

Kiedy należy użyć zdarzenia f: viewAction lub preRenderView do zainicjowania danych dla wersetów strony przy użyciu adnotacji @PostConstruct?

Użyj, <f:viewAction>gdy chcesz wykonać metodę przed renderowaniem kodu HTML. Jest to szczególnie przydatne, jeśli chcesz wykonywać akcje na podstawie wartości modelu ustawionych przez <f:viewParam>podczas fazy aktualizacji wartości modelu. Mianowicie nie są one w tej chwili dostępne @PostConstruct. W JSF 2.0 / 2.1 ten tag nie istniał i musisz zastosować preRenderViewobejście.

Jeśli fasola zapasowa to @RequestScoped, czy skutecznie robią dokładnie to samo? (a więc to zależy od wyboru programisty? (@PostConstruct wydaje się „czystszy”).

Nie, zdecydowanie nie robią skutecznie tego samego. @PostConstructJest odnie do wykonywania czynności bezpośrednio po zakończeniu budowy fasoli i ustawienie wszystkich wstrzyknięto zależnościami i zarządzanych nieruchomości, takich jak @EJB, @Inject, @ManagedProperty, itd. Mianowicie, wstrzyknięte zależności nie są dostępne wewnątrz konstruktora fasoli. Będzie to zatem działać tylko raz na widok, sesję lub aplikację, gdy komponent bean jest objęty zakresem widoku, sesji lub aplikacji. Jest <f:viewAction>on domyślnie wywoływany tylko przy początkowym żądaniu GET, ale można onPostback="true"go skonfigurować tak, aby był wywoływany również w przypadku żądań ogłaszania zwrotnego. preRenderViewZdarzenie jest wywoływane na każde żądanie HTTP (tak, to także ajax żądania!).

Podsumowując, zastosowanie @PostConstruct, jeśli chcesz wykonywać działania na wstrzyknięto zależności i zarządzanych nieruchomości, które są określone przez @EJB, @Inject, @ManagedPropertyitp trakcie budowy fasoli. Użyj, <f:viewAction>jeśli chcesz również wykonywać akcje na właściwościach ustawionych przez <f:viewParam>. Jeśli nadal korzystasz z JSF 2.0 / 2.1, użyj preRenderViewzamiast <f:viewAction>. W razie potrzeby możesz dodać zaznaczenie, FacesContext#isPostback()aby wykonać preRenderViewakcję tylko na początkowe żądanie.

Zobacz też:

BalusC
źródło
Dzięki. Przepraszam, że zredagowałem moje oryginalne pytanie podczas pisania odpowiedzi ...
BestPractices
Wspomniałem o zakresie bean, ponieważ @PostConstruct byłby wywoływany tylko raz, gdyby fasola była SessionScoped (w momencie pierwszego tworzenia fasoli), ale preRenderView byłby wywoływany za każdym razem, gdy uzyskuje się dostęp do strony. A może źle to zrozumiałem?
BestPractices
Tak, to jest poprawne. Zdarzenie widoku przed renderowaniem jest wywoływane w fazie akcji wywołania. Konstrukcja post jest wywoływana po skonstruowaniu beana. Komponent bean o zasięgu sesji nie jest konstruowany dla każdego żądania HTTP.
BalusC
Zastanawiałem się, że moja metoda jest wywoływana podczas żądań Ajax. połączenie isPostBack () zostało zapisane dnia !!
jacosta
Ze względu na kompletność powinniśmy wspomnieć o Omnifaces@Param : „W przypadku parametrów żądania HTTP jest w zasadzie tak <f:viewParam>, jak , ale z główną różnicą jest to, że wstrzyknięty parametr jest bezpośrednio dostępny podczas @PostConstruct, umożliwiając znacznie łatwiejszy sposób przetwarzania bez potrzeby a <f:event type="preRenderView">lub <f:viewAction>w widok."
Jens Piegsa
1

Czy musisz zainicjować właściwości zarządzanego ziarna fasoli? -> Następnie użyj @ PostConstruct W przeciwnym razie, czy potrzebujesz pracować z parametrami przekazanymi z innego widoku? -> Następnie użyj „ preRenderView

Val Martinez
źródło