Wann sollte das Ereignis f: viewAction oder preRenderView verwendet werden, um Daten für Seitenverse mithilfe der Annotation @PostConstruct zu initialisieren?
Verwenden <f:viewAction>
Sie die Option, wenn Sie eine Methode ausführen möchten, bevor der HTML-Code gerendert wird. Dies ist besonders nützlich, wenn Sie Aktionen ausführen möchten, die auf Modellwerten basieren, die <f:viewParam>
während der Phase der Aktualisierung der Modellwerte festgelegt wurden. Sie sind nämlich zum Zeitpunkt der Ausführung nicht verfügbar @PostConstruct
. In JSF 2.0 / 2.1 war dieses Tag nicht vorhanden und Sie müssen die preRenderView
Problemumgehung verwenden.
Wenn die Backing Bean @RequestScoped ist, machen sie dann genau das Gleiche? (und dann liegt es an der Wahl des Entwicklers? (@PostConstruct scheint "sauberer" zu sein).
Nein, sie machen definitiv nicht das Gleiche. Die @PostConstruct
intented wird Aktionen auszuführen direkt nach Bean Konstruktion und Einstellung aller injizierten Abhängigkeiten und verwalteten Eigenschaften wie @EJB
, @Inject
, @ManagedProperty
usw. sind nämlich die injizierten Abhängigkeiten innerhalb der Bohne Konstruktor nicht zur Verfügung. Dies wird daher nur einmal pro Ansicht, Sitzung oder Anwendung ausgeführt, wenn die Bean einen Gültigkeitsbereich für Ansicht, Sitzung oder Anwendung hat. Das <f:viewAction>
wird standardmäßig nur bei der ersten GET-Anforderung aufgerufen, kann jedoch über das onPostback="true"
Attribut so konfiguriert werden, dass es auch bei Postback-Anforderungen aufgerufen wird. Das preRenderView
Ereignis wird bei jeder HTTP-Anfrage aufgerufen (ja, dies schließt auch Ajax-Anfragen ein!).
Zusammengefasst, Verwendung , @PostConstruct
wenn Sie auf injiziert Abhängigkeiten und verwalteten Eigenschaften , um Aktionen wollen , die durch gesetzt sind @EJB
, @Inject
, @ManagedProperty
usw während des Baus der Bohne. Verwenden <f:viewAction>
Sie diese Option, wenn Sie auch Aktionen für Eigenschaften ausführen möchten, die von festgelegt wurden <f:viewParam>
. Wenn Sie noch mit JSF 2.0 / 2.1 arbeiten, verwenden Sie preRenderView
anstelle von <f:viewAction>
. Sie können bei Bedarf ein Häkchen hinzufügen FacesContext#isPostback()
, um die preRenderView
Aktion nur auf erste Anfrage auszuführen .
Siehe auch: