Wann sollte man das Ereignis f:viewAction
Oder preRenderView
verwenden, um Daten für eine Seite zu initialisieren, anstatt die Annotation @PostConstruct
Zu verwenden? Ist das Grundprinzip, das eine oder das andere zu verwenden, auf der Art des Umfangs der Stützbohne, z. Wenn die Backing-Bean @RequestScoped
Ist, ist die Wahl, f:viewAction
Oder preRenderView
anstelle von @PostConstruct
Zu verwenden, um die Backing-Bean vor dem Rendern der Ansicht zu initialisieren, irrelevant wie würden die beiden den gleichen effekt ergeben?
f: viewAction oder preRenderView
<f:metadata>
<f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
<f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>
oder
@ PostConstruct
public class MyBean
{
@PostConstruct
public void initialize()
{
}
}
Wann sollte man das Ereignis f: viewAction oder preRenderView verwenden, um Daten für Seitenverse mit der Annotation @PostConstruct zu initialisieren?
Verwenden Sie <f:viewAction>
, Wenn Sie eine Methode ausführen möchten, bevor der HTML-Code gerendert wird. Dies ist besonders nützlich, wenn Sie Aktionen basierend auf Modellwerten ausführen möchten, die mit <f:viewParam>
Während der Aktualisierungsphase der Modellwerte festgelegt wurden. Sie sind nämlich im Moment der Ausführung von @PostConstruct
Nicht verfügbar. In JSF 2.0/2.1 gab es dieses Tag nicht und Sie müssen die Problemumgehung preRenderView
verwenden.
Wenn die Backing-Bean @RequestScoped ist, machen sie dann genau dasselbe? (Und dann liegt es an den Entwicklern zu entscheiden? (@PostConstruct scheint "sauberer" zu sein.)
Nein, sie machen definitiv nicht das Gleiche. Der @PostConstruct
Soll Aktionen direkt ausführen, nachdem Bean alle injizierten Abhängigkeiten und verwalteten Eigenschaften wie @EJB
, @Inject
, @ManagedProperty
Usw. Die injizierten Abhängigkeiten sind nämlich im Konstruktor der Bean nicht verfügbar. Dies wird daher nur einmal pro Ansicht, Sitzung oder Anwendung ausgeführt, wenn die Bean einen Ansichts-, Sitzungs- oder Anwendungsbereich hat. Das <f:viewAction>
Wird standardmäßig nur bei der ersten GET-Anforderung aufgerufen, kann jedoch über das Attribut onPostback="true"
So konfiguriert werden, dass es auch bei Postback-Anforderungen aufgerufen wird. Das Ereignis preRenderView
wird bei jeder HTTP-Anforderung aufgerufen (ja, dies schließt auch Ajax-Anforderungen ein!).
Zusammengefasst, verwenden Sie @PostConstruct
, Wenn Sie Aktionen für injizierte Abhängigkeiten und verwaltete Eigenschaften ausführen möchten, die durch @EJB
, @Inject
, @ManagedProperty
Usw. während der Bean-Erstellung festgelegt werden . Verwenden Sie <f:viewAction>
, Wenn Sie auch Aktionen für Eigenschaften ausführen möchten, die mit <f:viewParam>
Festgelegt wurden. Wenn Sie immer noch mit JSF 2.0/2.1 arbeiten, verwenden Sie preRenderView
anstelle von <f:viewAction>
. Sie können bei Bedarf ein Häkchen bei FacesContext#isPostback()
setzen, um die Aktion preRenderView
nur bei der ersten Anforderung auszuführen.
Müssen Sie die Eigenschaften der verwalteten Bean initialisieren? -> Verwenden Sie dann @ PostConstruct Müssen Sie ansonsten mit Parametern arbeiten, die von einer anderen Ansicht übergeben wurden? -> Dann benutze "preRenderView"