Inhalt | Abbildung | Source | SCWCD | |||
|< | < | > | >| | Generated by CoCoDiL |
Eine JSP Seite durchläuft folgende 7 Phasen
Phase | Beschreibung |
Übersetzung | Die JSP Seite wird geparst und es wird daraus eine Java-Datei mit dem entsprechenden Servlet erzeugt |
Kompilieren | Die erzeugte Datei wird compiliert |
Klasse einladen | Die compilierte Klasse wird eingeladen |
Instantiierung | Es wird eine Instanz eines Servlets erzeugt |
jspInit() | Diese Methode ermoeglicht die Initialisierung des Objekts |
_jspService() | Diese Methode wird für jede Anfrage ausgeführt |
jspDestroy() | Diese Methode wird aufgerufen, bevor der Container die Instanz dieses Servlet zerstört |
Die Übersetzung
Zunächst wird überprüft, ob sich die JSP seit der letzten Übersetzung geändert hat. Falls ja finden einige Überprüfungen statt, und es werden die Direktiven ausgewertet. Das Ergebnis ist eine Datei mit Java Code. Der Name der Klasse ist abhängig vom verwendeten Container.
Kompilieren
Die erzeugte Java Klasse wird mit einem normalen Java Compiler compiliert.
Laden und Instantiieren
Die geladene Instanz sollte (falls Http verwendet wird) das folgende Interface HttpJspPage erfüllen:
Die Methode jspInit()
Diese Methode wird direkt nach der Instaniierung, auf jedenfall vor der ersten Anfrage ausgeführt. Man kann diese Methode als Skriplet in die JSP Seite deklarieren.
Beachte man ist nicht gezwungen, diese Methode zu deklarieren. Sie existiert schon in der Basisklasse.
Die Methode jspDestroy()
Diese Methode wird aufgerufen, wenn der Container entschlossen hat, das entsprechende Servlet auszuladen. Auch diese Methode muss nur dann deklariert werden, wenn man sie wirklich benötigt.
Die Methode _jspService()
Diese Methode wird automatisch bei jeder Anfrage aufgerufen. Diese Methode wird bei der Übersetzung der JSP in das Servlet automatisch generiert. Es führt zu einem Fehler wenn der Programmierer versucht diese Methode zu deklarieren.
Mit Hilfe der include Direktive kann man den Inhalt einer anderen Seite (statisch oder wieder eine JSP) einbinden. Es wird nicht nur die aktuelle Seite, sondern auch die eingebundenen Seiten in ein einziges Servlet übersetzt. Die Menge an Seiten die in ein einziges Servlet übersetzt werden, wird Translation Unit genannt.
Für eine Translation Unit gilt einige Regeln:
Beachte einige Besonderheiten:
Beispiel:
Das Beispiel ergibt kein Fehler obwohl die Deklaration von pi erst nach der Benutzung erfolgt.
Dieses Beispiel scheitert in der Zeil String s = s1+s2;. Das Problem liegt nicht in der Varialbe s1, da diese in einer Deklaration ist, und in eine Instanzvariable übersetzt wird. Das Problem liegt in der lokalen Variablen s2, die zu spät deklariert und definiert wird.
Man sollte darauf achten dass bei Schleifen, immer in Skriplets immer die Klammern gesetzt werden, auch dann wenn man scheinbar nur eine Anweisung hat.
Siehe z.B folgenden JSP-Code:
Dies wird folgendermassen übersetzt:
Der Anwendername wird auch angegeben, wenn isUserLoggedIn den Wert false hat.
So wäre es richtig:
Inhalt | Abbildung | Source | SCWCD | |||
|< | < | > | >| | Generated by CoCoDiL |