web-dev-qa-db-de.com

Wann ist f: viewAction / preRenderView im Vergleich zu PostConstruct zu verwenden?

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

    }
}
88
BestPractices

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.

Siehe auch:

113
BalusC

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"

1
Val Martinez