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()
    {

    }
}

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ż:


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 ”

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.