Versuchen zu verstehen, sofort = "wahre" Überspringen von Eingaben, wenn es nicht sollte
Gerade als ich dachte, hatte ich sofort verstanden... *seufz*
Betrachten Sie die folgende JSF-Seite:
<h:inputText value="#{testBean.text}" required="true" />
<h:commandButton actionListener="#{testBean.doFoo}" value="Do Foo" />
<h:commandButton immediate="true" actionListener="#{testBean.doBar}" value="Do Bar" /><br />
<h:outputText value="#{testBean.didSomething}" />
Und diesen backing-bean:
public class TestBean {
private String didSomething = "Nothing done yet";
//+ getter
public void doFoo() {
didSomething = "Did foo!";
}
public void doBar() {
didSomething = "Did bar!";
}
Vom alle habe ich gelesen, sofort würde ich erwarten, dass die folgenden:
- Wenn Sie versuchen zu tun foo, bieten aber keine einen Wert für das Eingabefeld, wird die Aktion nie ausgeführt, weil während
processValidationsPhase
tritt ein Fehler auf, wodurch die Seite neu gerendert, direkt nach dieser phase mit einer Fehlermeldung. Der Wert derdidSomething
bleibt unverändert. (Dies funktioniert wie erwartet) - Wenn Sie versuchen zu tun-bar, während die Bereitstellung nicht ein Wert für das Eingabefeld, wird die Aktion ausgeführt, während
applyRequestValuesPhase
wegen der unmittelbaren Attribut. Die variabledidSomething
geändert wird. (Dies funktioniert wie erwartet)
Auf, was als Nächstes passiert, diese Beschreibung Staaten:
"Ein null-Wert zurück (als Ergebnisse der action-Methode) bewirkt die Verarbeitung weiter zu als normale, sprich nicht-unmittelbaren Komponenten sind validiert, dann update-Modell ausgeführt wird (wenn keine Validierung Fehler aufgetreten sind). Für einen action-listener-Methode, die void zurückgibt, ist es notwendig, rufen facesContext.renderResponse(); wenn der normale Fluss ist nicht erwünscht."
Aus dieser hatte ich die Idee, dass die Verarbeitung wird normal fortgesetzt. (wie meine action Methode weder zurück, ein Ergebnis noch Kraft renderResponse()
), was den gleichen Fehler bei der überprüfung. Einzige Unterschied wäre, dass es vorkommt nach Einstellung didSomething
. Allerdings bedeutet dies nicht passieren. Stattdessen fühlt es sich wie die Seite noch überspringt alle restlichen Phasen mit dem input-Feld nicht berührt werden. Es neu gerendert, ohne Fehlermeldung.
Kann mir jemand erklären, wo mein Verständnis von, wie dieses arbeitet nicht in Ordnung ist?
InformationsquelleAutor der Frage Louise | 2012-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
immediate="true"
auf die Schaltfläche, wird die Aktion in der Tat aufgerufen, während apply request values-phase und die restlichen Phasen werden übersprungen. Das ist auch der einzige Punkt, der dieses Attribut: Prozess (Dekodieren, validieren, aktualisieren und invoke) die Komponente sofort beim auftragen request values-phase.Alle Eingänge, die nicht haben
immediate="true"
eh ignoriert werden. Nur Eingänge, die habenimmediate="true"
auch verarbeitet, aber das passiert auch bei zutreffen request-values-phase. Warum sollten die verbleibenden Phasen aufgerufen werden, wenn alles schon stattgefunden hat, in der apply-request-values-phase?In der Debug-JSF-lifecycle Artikel finden Sie die folgende Zusammenfassung soll aufklären, Wann (nicht) Nutzung der
immediate"true"
:Siehe auch:
InformationsquelleAutor der Antwort BalusC