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

95

Wann sollte man das Ereignis f:viewActionoder verwenden preRenderView, um Daten für eine Seite zu initialisieren, anstatt die @PostConstructAnmerkung zu verwenden? Ist der Grund eine oder die andere Basis zu verwenden , von der Art des Umfangs der Backing Bean zB Wenn der Backing Bean ist @RequestScoped, würde dann die Wahl der Verwendung f:viewActionoder preRenderViewüber @PostConstructIhren Backing Bean initialisiert vor dem Rendern die Ansicht irrelevant sein , da die beide würde in den gleichen Effekt führen?

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

    }
}
Empfohlene Vorgehensweise
quelle

Antworten:

117

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 preRenderViewProblemumgehung 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 @PostConstructintented wird Aktionen auszuführen direkt nach Bean Konstruktion und Einstellung aller injizierten Abhängigkeiten und verwalteten Eigenschaften wie @EJB, @Inject, @ManagedPropertyusw. 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 preRenderViewEreignis wird bei jeder HTTP-Anfrage aufgerufen (ja, dies schließt auch Ajax-Anfragen ein!).

Zusammengefasst, Verwendung , @PostConstructwenn Sie auf injiziert Abhängigkeiten und verwalteten Eigenschaften , um Aktionen wollen , die durch gesetzt sind @EJB, @Inject, @ManagedPropertyusw 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 preRenderViewanstelle von <f:viewAction>. Sie können bei Bedarf ein Häkchen hinzufügen FacesContext#isPostback(), um die preRenderViewAktion nur auf erste Anfrage auszuführen .

Siehe auch:

BalusC
quelle
Vielen Dank. Entschuldigung, ich habe meine ursprüngliche Frage bearbeitet, während Sie die Antwort geschrieben haben ...
BestPractices
Ich habe den Bean-Bereich erwähnt, da @PostConstruct nur einmal aufgerufen wird, wenn die Bean SessionScoped ist (zum Zeitpunkt der ersten Erstellung der Bean), preRenderView jedoch bei jedem Zugriff auf die Seite aufgerufen wird. Oder habe ich das falsch verstanden?
BestPractices
Ja das ist richtig. Das Ereignis vor der Renderansicht wird beim Aufrufen der Aktionsphase aufgerufen. Das Post-Konstrukt wird nach der Bean-Konstruktion aufgerufen. Eine Bean mit Sitzungsbereich wird nicht bei jeder HTTP-Anforderung erstellt.
BalusC
Ich fragte mich, ob meine Methode bei Ajax-Anfragen aufgerufen wurde. Der Aufruf von isPostBack () hat den Tag gerettet !!
Jacosta
1

Müssen Sie die Eigenschaften der verwalteten Bean initialisieren? -> Verwenden Sie dann @ PostConstruct. Andernfalls müssen Sie mit Parametern arbeiten, die aus einer anderen Ansicht übergeben wurden. -> Dann benutze " preRenderView "

Val Martinez
quelle