Grundlagen
Die JavaServer Pages Technologie (kurz JSP) ermöglicht uns das einfache Generieren einer dynamischen HTML-Seite (oder auch XML-Seite). Hierbei wird HTML- und Java-Code direkt gemischt und ist somit mit PHP vergleichbar.
JavaServer Pages haben in der Regel die Dateiendung .jsp
und enthalten ganz normalen HTML-Code sowie einige
Code-Blöcke, welche Java-Code enthalten. Durch die Code-Blöcke können dynamische Ausgaben, Abfragen und vieles
mehr durchgeführt werden. Das hieraus resultierende Konzept ermöglicht also das Mischen von HTML- und Java-Code. Dies ist
auf Grund des MVC-Konzepts nicht immer erwünscht, stellt jedoch eine leichte Methode zur Erstellung einer Seite dar.
Innerhalb einer JavaServer Page können prinzipiell alle Klassen der Java-Packages verwendet werden. Zudem können über sogenannte Standardvariablen Objekte verschiedener Servlet-Klassen und -Interfaces abgerufen werden.
Die Technologie JavaServer Pages wurde bereits Ende der 90er-Jahre eingesetzt und gehört somit zu den älteren Technologien für serverseitige Programmierung. Auf Grund der immer größer werdenden Ablösung durch andere Technologien und der Verwendung von Frameworks (wie z. B. JavaServer Faces) wird JSP immer seltener eingesetzt und gilt seit Java EE Version 6 als veraltet (engl. deprecated). Daher ist es nicht zu empfehlen, JSP für neue Projekte zu verwenden. Wir bieten auf dieser Webseite jedoch auch Tutorials zu vielen anderen serverseitigen Technologien an.
Erstes Beispiel
Um eine bessere Vorstellung von JSP zu bekommen, erstellen wir als erstes ein einfaches JSP-Beispiel. Wir haben, wie auch im Servlet-Tutorial, die Entwicklungsumgebung NetBeans sowie den Apache Tomcat Webserver, der Teil des XAMPP-Softwarepakets ist, verwendet, um die Beispiele dieses Tutorials zu erstellen. Falls Sie bisher noch keine IDE und keinen Webserver installiert haben, würden wir Ihnen empfehlen, NetBeans zu verwenden, da Sie dadurch den nachfolgenden Schritten genauer folgen können.
Nach dem Start der Entwicklungsumgebung NetBeans müssen wir ein neues Projekt anlegen. Im Dialog zur Projektstellung wählen wir die Kategorie „Java Web“ und den Projekttyp „Web Application“. Als nächstes müssen wir noch den Projektnamen und -speicherort sowie anschließend den Server (in diesem Fall den Apache Tomcat) und die Version (i. d. R. Java EE 6) auswählen. Bei der Einbindung von Frameworks müssen wir nichts auswählen.
Das nun erstellte Projekt enthält bereits eine JSP-Datei: index.jsp
. Diese Datei wurde automatisch generiert und
liegt im Wurzelverzeichnis des Web-Projekts. Die generierte JavaServer Page enthält zwar bereits ein HTML-Grundgerüst und eine
page
-Direktive (dazu mehr im Thema Direktiven), jedoch noch keinen Code-Block. Nun
können Sie die Seite anpassen und folgenden Java-Code einfügen: <%= (new java.util.Date()).toString() %>
.
Wenn Sie das Projekt nun ausführen, werden Sie feststellen, dass auf der Seite das aktuelle Datum und die aktuelle Uhrzeit
angezeigt wird. Wenn Sie die Seite im Browser erneut laden, aktualisiert sich auch das Datum bzw. die Uhrzeit. Sie haben hiermit
nun Ihre erste dynamische Webseite mittels JSP erstellt.
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Erste Seite - JavaServer Pages Code-Beispiel</title> <meta charset="utf-8" /> <meta name="robots" content="noindex,nofollow" /> <meta name="publisher" content="Homepage-Webhilfe" /> </head> <body> Serverzeit: <%= (new java.util.Date()).toString() %> </body> </html>
Syntax
Prinzipiell enthalten JavaServer Pages ganz normalen HTML- oder XML-Code. Um dort nun dynamische Inhalte sowie Java-Code zu platzieren, werden spezielle Tags oder XML-Elemente verwendet. Hierbei kann eine grobe Unterteilung zwischen Skriptelementen (oft auch als Skripttag oder Code-Block bezeichnet), Direktiven und Aktionen getroffen werden. Auf die Direktiven und Aktionen gehen wir in den nächsten Themen genauer ein.
In Java gibt es drei unterschiedliche Skriptelemente, welche sich im öffnenden Tag unterscheiden. Der schließende Tag der
Elemente ist immer %>
. Das einfachste Skriptelement beginnt mit dem Skripttag <%
. Zwischen
<%
und %>
kann Java-Code angegeben werden. Dieser Code wird an der Stelle ausgeführt, wo Sie
ihn platzieren. Dieser Syntax wird oftmals auch als Skriptlet bezeichnet. Hierzu ein kurzes Beispiel:
<% for (int i = 0; i < 10; i++) out.println(i + "<br />"); %>
Wenn Sie globale Variablen oder Methoden definieren möchten, so müssen Sie den Starttag durch <%!
ersetzen. Dies könnte wie folgt aussehen:
<%! private double berechneKreisUmfang(double dRadius) { return 2 * Math.PI * dRadius; } %>
Um einen Wert (Konstante, Variable oder Rückgabewert einer Funktion) auszugeben, könnten wir die Funktion out.print()
aufrufen und dieser den auszugebenen Wert übergeben. Zu bevorzugen ist jedoch der Skripttag <%=
. Letztendlich
wird hier ebenfalls die print()
-Funktion aufgerufen, jedoch ist dadurch unser Code kürzer und leichter zu lesen.
<%= (new java.util.Date()).toString() %>
Wenn Sie innerhalb Ihrer JSP einen Kommentar platzieren möchten, so können Sie die Tags <%--
und
--%>
verwenden. Der Unterschied des JSP-Kommentars im Vergleich zu einem einfachen HTML-Code ist, dass der
JSP-Kommentar nur serverseitig existiert und somit nicht an den Browser geschickt wird. Je nach Verwendungszweck ist daher
entweder der JSP- oder der HTML-Kommentar zu bevorzugen.
<%-- Dies ist serverseitiger Kommentar! --%>
Standardvariablen
Wie bereits weiter oben erwähnt können wir innerhalb einer JSP auf Standardvariablen in Form von Objekten zugreifen, die es uns ermöglichen, Informationen abzufragen oder die „Antwort“ anzupassen. Einige dieser Objekte kommen Ihnen vielleicht vom Servlet-Tutorial bekannt vor:
Variable | Klasse / Interface | Beschreibung |
---|---|---|
request | HttpServletRequest | Objekt zum Abrufen von Anfrage-Informationen |
response | HttpServletResponse | Objekt zum Anpassen der Antwort |
out | JspWriter | Objekt für den Ausgabe-Stream |
session | HttpSession | Objekt der HTTP-Session |
page | Object | Objekt der Seite selbst |
pageContext | PageContext | Objekt für erweiterte Zugriffe auf die Seite bzw. dessen Daten |
exception | Throwable | Objekt für Ausnahmefehler-Informationen (für Fehlerseiten) |
application | ServletContext | Objekt der Webserver-Anwendung |
config | ServletConfig | Objekt zur Konfiguration |
Funktionsweise
Die Funktionsweise von JavaServer Pages lässt sich am besten mit einer Schritt-Für-Schritt-Folge erklären:
- Als erstes schickt der Webbrowser des Besuchers eine Anfrage an den Webserver.
- Der Webserver empfängt die Anfrage (engl. request) und speichert die Anfrage-Informationen.
- Nun stellt der Webserver fest, dass es sich bei der angefragten Ressource um eine JavaServer Page handelt (dies wird mittels der Dateiendung festgestellt).
- Da es sich um eine JavaServer Page handelt, muss die Seite durch einen JSP-Compiler übersetzt werden. Dabei wird die JSP lediglich in ein ganz normales HTTP-Servlet umgewandelt.
- Im nächsten Schritt wird das HTTP-Servlet durch den Java-Compiler übersetzt und somit in eine
.class
-Datei umgewandelt. Diese Datei wird für eine evtl. erneute Nutzung gespeichert (dazu gleich mehr). - Der generierte Java-Bytecode, welcher das Servlet repräsentiert, wird nun vom Servlet-Container ausgeführt.
- Durch das Servlet, welches vom Servlet-Container ausgeführt wurde, wird als nächstes eine HTTP-Antwort (engl. response) generiert. Diese enthält i. d. R. einen HTTP-Header sowie eine HTML-Seite, welche für den Browser statisch erscheint.
- Die erzeugte Antwort wird zurück an den Browser geschickt.
Der Java-Bytecode des vom JSP-Compiler erzeugten Servlets wird gespeichert. Dadurch muss es bei einer erneuten Anfrage nicht erneut kompiliert werden, sondern kann direkt ausgeführt werden. Um zu erkennen, ob sich die JSP-Datei in der Zwischenzeit geändert hat, wird das Änderungsdatum der Datei geprüft. Wurde eine Änderung erkannt, so wird wieder eine Kompilierung ausgeführt.