Ein JSF-Handler kann Funktionen enthalten, die beim Laden von Seiten automatisch ausgeführt werden.
Mithilfe der JSF-Handlereigenschaften 'onPreRenderFunction', 'onPostRenderFunction' und 'onConstructionFunction' können Sie Funktionen angeben, die an unterschiedlichen Punkten im Lebenszyklus der Seite ausgeführt werden.
Wann diese Funktionen ausgeführt werden, hängt vom Wert der Eigenschaft 'scope' der Seite ab. Wenn der Benutzer eine EGL-gesteuerte Seite zum ersten Mal besucht, wird der JSF-Handler in EGL geladen, der zur Laufzeit von einem Page-Bean dargestellt wird. Wenn der Bereich der Seite auf session (Standardwert) festgelegt wird, bleibt die Bean während der Sitzung des Benutzers aktiv, auch wenn der Benutzer von der Seite aus auf eine andere Seite navigiert. Wenn der Benutzer zur Seite zurückkehrt, ist die Bean weiterhin verfügbar.
Wenn der Bereich der Seite auf request festgelegt ist, bleibt die Bean nicht aktiv, wenn der Benutzer von der Seite aus auf eine andere Seite navigiert. In diesem Fall gehen alle in der Bean gespeicherten Dateien verloren und die Bean muss erneut geladen werden, wenn der Benutzer zur Seite zurückkehrt.
- Die in der Eigenschaft 'onConstructionFunction' angegebene Funktion wird ausgeführt, wenn die Page-Bean geladen wird. Daher wird diese Funktion für auf den Bereich session festgelegte Seiten nur ausgeführt, wenn der Benutzer die Seite das erste Mal besucht.
Diese Funktion wird für auf den Bereich request festgelegte Seiten jedes Mal ausgeführt, wenn der Benutzer die Seite besucht, da die Bean jedes Mal erneut erstellt wird, außer wenn die Seite aufgrund eines JSF-Gültigkeitsfehlers erneut angezeigt wird.
Wenn jedoch die Eigenschaft 'cancelOnPageTransition' des JSF-Handlers auf yes festgelegt ist, wird die Seiten-Bean aus der Sitzung entfernt, wenn der Benutzer auf eine andere Seite wechselt, auch wenn die Eigenschaft scope auf session festgelegt ist. In diesem Fall wird 'onConstructionFunction' erneut ausgeführt, wenn der Benutzer auf die Seite zurückkehrt, da die Seiten-Bean erneut geladen werden muss.
Diese Funktion ist für einmalige Initialisierungstasks nützlich. 'onConstructionFunction' sollte nicht zum Abrufen von Sitzungsvariablen oder anderer Daten verwendet werden, die sich ändern können und nach dem Aktualisieren der Seite erneut geladen werden müssen. Verwenden Sie stattdessen 'onPreRenderFunction'.
Weitere Informationen zu dieser Eigenschaft finden Sie im Kapitel onConstructionFunction.
- Die in der Eigenschaft 'onPreRenderFunction' angegebene Funktion wird von dem Bereich der Seite nicht beeinflusst. Diese Funktion wird jedes Mal ausgeführt, wenn der Server mit der Darstellung der Seite beginnt, unabhängig davon, ob sich die Bean in der Sitzung des Benutzers befunden hat oder nicht. Daher wird 'onPreRenderFunction' ausgeführt, wenn die Seiten-Bean das erste Mal geladen wird, immer wenn die Seite vom Benutzer aktualisiert wird, immer wenn der Benutzer von einer anderen Seite auf diese Seite weitergeleitet wird und immer wenn die Seite aufgrund eines JSF-Gültigkeitsfehlers erneut angezeigt wird.
- Die in der Eigenschaft 'onPostRenderFunction' angegebene Funktion ist mit 'onPreRenderFunction' vergleichbar, wird aber jedes Mal ausgeführt, wenn der Server die Darstellung der Seite fertig gestellt hat. diese Funktion wird ausgeführt, wenn die Seiten-Bean das erste Mal geladen wird, immer wenn die Seite vom Benutzer aktualisiert wird, immer wenn der Benutzer von einer anderen Seite auf diese Seite weitergeleitet wird und immer wenn die Seite aufgrund eines JSF-Gültigkeitsfehlers erneut angezeigt wird.
Wenn Sie mehrere dieser Eigenschaften angeben, beachten Sie Folgendes:
- Die in der Eigenschaft 'onConstructionFunction' angegebene Funktion wird vor der Funktion ausgeführt, die in der Eigenschaft 'onPreRenderFunction' angegeben ist, wenn beide Funktionen definiert sind.
- Wenn für diese Funktionen Parameter akzeptiert werden, müssen die Parameter übereinstimmen. Alternativ können Sie auch Parameter in einer Funktion definieren, aber nicht in einer weiteren.
- Sie können dieselbe Funktion für mehrere dieser Eigenschaften angeben, aber das bedeutet, dass die Funktion mehrmals ausgeführt werden könnte.
Im folgenden Beispiel eines JSF-Handlers wird die Verwendung von zwei dieser Funktionen dargestellt:
- Erstellen Sie in einem EGL-Webprojekt eine neue Webseite mit dem Namen loadTest.jsp.
- Öffnen Sie den JSF-Handler der neuen Seite durch Klicken mit der rechten Maustaste auf die geöffnete Seite im Editor und klicken Sie dann auf 'Seitencode bearbeiten'.
- Ändern Sie den Code im JSF-Handler entsprechend dem folgenden Beispiel:
package jsfhandlers;
handler loadTest type JSFHandler
{onConstructionFunction = onConstruction,
onPreRenderFunction = onPreRender,
scope = session,
view = "loadTest.jsp"}
numberOfLoads int;
messageString string;
function onConstruction()
numberOfLoads = 0;
end
function onPreRender(incomingNumber int)
numberOfLoads = incomingNumber + 1;
messageString = "You have viewed this page "
+ numberOfLoads + " times.";
end
function forwardBack()
forward numberOfLoads to "loadTest";
end
end
- Speichern und schließen Sie den JSF-Handler.
- Fügen Sie auf der Seite 'loadTest.jsp' ein Feld 'Ausgabe' vom Fach 'Erweiterte Faces-Komponenten' in der Palettenansicht hinzu.
- Fügen Sie neben dem Ausgabefeld 'Schaltfläche - Befehl' aus dem Fach 'Erweiterte Faces-Komponenten' in der Palettenansicht hinzu.
- Ziehen Sie messageString von der Sicht 'Seitendaten' direkt auf das Ausgabefeld. Nun wird die Variable im JSF-Handler an das Ausgabefeld auf der Seite gebunden.
- Ziehen Sie forwardBack() von der Sicht 'Seitendaten' direkt auf die Befehlsschaltfläche. Nun wird die Schaltfläche an die Funktion im JSF-Handler gebunden.
- Speichern Sie die Seite und generieren Sie das Projekt.
- Führen Sie die Seite auf einem Server aus.
Wenn Sie die Seite zum ersten Mal ausführen, wird folgende Meldung angezeigt: 'You have viewed this page 1 times.' In diesem Fall wird die in der Eigenschaft
'onConstructionFunction' angegebene Funktion zuerst ausgeführt und die Variable
numberOfLoads auf Null festgelegt. Danach wird die in der Eigenschaft
'onPreRenderFunction' festgelegte Funktion ausgeführt, die Variable auf 1 festgelegt und die Variable der Nachrichtenzeichenfolge auf 'You have viewed this page 1 times.' festgelegt. Jedes folgende Mal, wenn die Seite erneut geladen wird, wird die Variable um Eins erhöht. Dadurch wird angezeigt, dass die Funktion
'onPreRenderFunction' jedes Mal ausgeführt wird, jedoch nicht die Funktion
'onConstructionFunction'.
Wenn Sie das Beispiel ausprobieren, in dem 'scope' auf request festgelegt ist, wird die Variable '1' nicht übersteigen, da die Funktion 'onConstructionFunction' die Variable jedes Mal, wenn Sie die Seite aktualisieren, auf Null festlegt. Speichern Sie Ihre Änderungen im JSF-Handler, führen Sie die Generierung durch und publizieren Sie das Projekt erneut auf dem Server.
Für diese Funktionen gelten die folgenden Einschränkungen:
- Mit den in den Eigenschaften 'onConstructionFunction' und 'onPreRenderFunction' festgelegten Funktionen kann nicht auf den JSF-Komponentenbaum zugegriffen werden, wie in Mit dem Quellenassistent auf den JSF-Komponentenbaum zugreifen beschrieben.
Mit der in der Eigenschaft 'onPostRenderFunction' festgelegten Funktion kann auf den JSF-Komponentenbaum zugegriffen werden. Da diese Funktion jedoch aufgerufen wird, nachdem die Seite zurückgegeben und an den Browser gesendet wurde, sind die Änderungen in der Seite erst dann für den Benutzer sichtbar, wenn die Seite aktualisiert wird.
- Mit den in den Eigenschaften 'onConstructionFunction' und 'onPreRenderFunction' festgelegten Funktionen kann die Fehlernachricht für eine Komponente mit sysLib.setError() nicht festgelegt werden.
Für diese Funktionen kann jedoch 'sysLib.setErrorForComponentID()' verwendet werden.
Mit der in 'onPostRenderFunction' festgelegten Funktion kann 'sysLib.setError()' verwendet werden.
- Für diese Funktionen kann eine Anweisung FORWARD TO URL verwendet werden, aber keine Anweisung FORWARD TO LABEL.
Weitere Informationen finden Sie in den entsprechenden Kapiteln zu diesen Eigenschaften.