2010-05-07 9 views
5

Ich habe eine JSF-Seite mit einem Formular hat einen outputtext drin. Der Wert der outputtext-Komponente wird von einer Backing-Bean (oder verwalteten Bean) aufgerufen. Ich weiß, wenn ich es als # {MyBean.myString} Jsf es umbenennen und ruft getMyString() -Methode. Allerdings ist die seltsame Sache, wenn ich einen Breakpoint auf die Getter-Methode dieser Komponente gesetzt habe, sehe ich, dass es zweimal aufgerufen wird, während die Seite gerendert wird. Der Ausgabetext befindet sich in einer h: -Form und ist die einzige Komponente, die an eine Hintergrundbean bindet. Ich meine, es ist so seltsam, dass jsf den Wert bekommen sollte, wenn es zuerst zur Getter-Methode kommt, aber es muss zweimal zur Getter-Methode gehen. Können Sie erklären, was der Grund für dieses Verhalten in jsf ist?Zwischen einer JSF-Seite und einer verwalteten Bean, warum die Getter-Methode zweimal aufgerufen wird

Jede Hilfe würde geschätzt, Die besten Wünsche, Baris

Antwort

16

Der Getter, wie der Name schon selbst beschreibt, ist nur dort mit dem reinen Zweck abrufen die Daten. JSF speichert diese Daten nicht zwischen. Es wird es bei Bedarf anrufen. Die Kosten für das Aufrufen eines Getters sind in der Praxis null - es sei denn, Sie tun etwas mehr als das Zurückgeben der Daten, z. Immer wenn die DB die DB trifft, sollte sie aus dem Getter heraus bewegt werden oder in eine Lazy Loading umgewandelt werden.

Im Falle eines Sendens eines Formulars wird der erste get-Aufruf normalerweise während der Validierungsphase ausgelöst, um zu prüfen, ob ein Anfangswert vorhanden ist, damit JSF das Ereignis der Wertänderung verarbeiten kann. Der zweite Aufruf wird normalerweise während der Renderantwortphase ausgelöst, um den Modellwert in der Ansicht anzuzeigen.

Sie können auch this article nützlich finden, um mehr über den JSF-Lebenszyklus zu erfahren. Möglicherweise finden Sie this answer nützlich, um mehr über Möglichkeiten zu erfahren, Vorverarbeitung/Initialisierung in einer Backing-Bean zu tun.

+0

Vielen Dank. BTW Ich finde es wert zu erwähnen, dass ich nicht meine Form submit, aber ich meine die erste Phase der Anfrage, wenn die Seite zum ersten Mal gerendert wird. Während dieses Prozesses wurde der Komponentenwert (die Getter-Methode) zweimal aufgerufen. Ich denke jedoch, wenn die Getter-Methode das erste Mal erreicht wird, muss sie den Wert der Variablen erhalten, nicht wahr? Ich werde die Artikel lesen, die Sie gepostet haben, und wenn Sie weitere Ideen dazu haben, würde ich mich freuen, wenn Sie mit mir teilen. Nochmals vielen Dank, Baris – Javatar

+1

Dann haben Sie diese Eigenschaft zweimal in der Ansicht gebunden. Fügen Sie der Getter-Methode 'Thread.dumpStack()' hinzu, um mehr über den Aufruf-Stack zu erfahren, damit Sie herausfinden können, woher er stammt. – BalusC

Verwandte Themen