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.