14 JavaServer Pages und Servlets
»Lebensfreude entsteht durch Frieden, der nicht statisch, sondern dynamisch ist.«
– Henry Miller (1891–1980)
14.1 Dynamisch generierte Webseiten
In der ersten Generation von Internet-Seiten war jede Seite statisch auf dem Webserver abgelegt. Unterschiedliche Clients (im Allgemeinen Browser) erfragten die Seite und stellten sie dar. Dies reichte jedoch für viele Anwendungen nicht aus und schränkte die Interaktionsfähigkeit ein. Es gibt mehrere gute Gründe für dynamische Webseiten, bei denen HTML erst auf Anfrage generiert wird:
- Die Seite ist von Benutzereingaben abhängig. Wenn ein Kunde sich beispielsweise für ein Produkt und dessen Preis interessiert hat, wäre es kaum möglich, für jedes Produkt eine aktuelle statische Webseite bereitzustellen. Zudem sieht ja jede Seite anders aus, und so gäbe es sehr viele Seiten. Wenn sich die Produktbeschreibung ändert, müsste der Benutzer immer eine aktuelle Seite sehen. In diesem Fall ist es günstig, die Webseiten bei Bedarf zu erzeugen. Für Einkaufssysteme kommt eine weitere Eigenschaft hinzu: Der Benutzer bewegt sich über mehrere Seiten und verwaltet einen Warenkorb, der anwachsen oder schrumpfen kann.
- Web-2.0-Seiten zeichnen sich besonders durch Beteiligung der Mitglieder aus, die Content hinzufügen und verändern. Beispiele sind Blogs, Wikis wie Wikipedia oder soziale Netzwerke. Nach jeder Sekunde kann der Inhalt einer Webseite nach dem Neuladen ganz anders aussehen.
Ist der Web-Inhalt dynamisch, kann bei einer Browser-Anfrage der Webserver keine statische Webseite zurückliefern, sondern muss irgendwie auf der Serverseite ein Programm laufen lassen, das dynamisch HTML generiert. Die Interaktion des Webservers, der ja alle Browser-Anfragen annimmt, mit dem Serverprogramm basiert auf speziellen Schnittstellen, wobei die älteste das Common Gateway Interface (kurz CGI) ist. Aufgrund von Dateiendungen oder speziellen Pfaden weiß der Server, dass es sich um keine statische Webseite handelt, sondern gibt die Aufforderung zum Aufbau von HTML an ein externes Programm weiter, das zum Beispiel aus Datenbanken Produktbeschreibungen holt, dann HTML generiert und es zum Webserver gibt, der das HTML wiederum zum Client schickt.
Serverseitig gibt es mittlerweile eine ganze Reihe von Programmiersprachen, wobei PHP zu den populärsten zählt. Vereinfacht ausgedrückt passiert Folgendes: Bekommt ein Webserver wie Apache oder IIS eine Anfrage an eine Datei, die auf .php endet, so wird die Verarbeitung an den PHP-Interpreter weitergeleitet. Der liest die PHP-Datei ein, interpretiert sie, was zu HTML führt, und schickt sie zurück zum Browser, der die Webseite darstellt. Von Microsoft gibt es eine vergleichbare Technologie, die ASP (Active Server Pages) bzw. ASP.NET (Active Server Pages .NET) genannt wird. Während PHP eine eigene, an C angelehnte Programmiersprache ist, lassen sich bei ASP.NET die .NET-Sprachen wie VB.NET oder C# nutzen. Doch was ist mit Java?
14.1.1 Was sind Servlets?
Servlets sind Java-Programme, die in einem besonders präparierten Java-Webserver ausgeführt werden. Die Besonderheit daran ist zunächst, dass ein Webserver in Java realisiert werden muss; eine andere Besonderheit ist die, dass die Java-Programme als Klassen vom Java-Webserver geladen und dort auch verwaltet und mit einer besonderen Servlet-Schnittstelle angesprochen werden. Daher heißt ein Java-Webserver, der Servlets lädt und verwaltet, auch Servlet-Container. Servlets sind somit ein wenig mit Applets vergleichbar. Ein Applet ist ein Java-Programm auf der Clientseite (im Browser), während ein Servlet ein Programm auf der Serverseite (im Server) ist. Der Browser ist der Applet-Container, während der Java-Webserver mit Servlet-Schnittstelle einen Servlet-Container darstellt.
Performant? |
Einem modernen Webserver kommt die Aufgabe zu, statischen Content (CSS-, JavaScript-, Grafik-Dateien) zu liefern und auch dynamische Webseiten zu generieren. Die Java-Webserver der aktuellen Generation sind schnell genug, um für mittelgroße Seiten auch die traditionellen Webserver wie Apache oder IIS zu ersetzen. Sollte es eine sehr hoch frequentierte Seite sein, so bleiben die etablierten Webserver bestehen und werden so konfiguriert, sodass sie die dynamisch ausführbaren Serverprogramme etwa an einen Servlet-Container weiterreichen. |
Die Servlet-API
Das Paket java.net deklariert Klassen für die Clientseite, also für die Seite, die eine Anfrage an den Webserver stellt. Für Servlets der Serverseite ist das Paket javax.servlet reserviert, was jedoch kein Teil der Java SE ist, doch dazu später mehr.
Um eine Vorstellung davon zu bekommen, wie ein Servlet programmiert ist, werfen wir einen Blick auf ein einfaches Servlet:
Listing 14.1: com/tutego/web/servlet/SchnarchServlet.java
package com.tutego.web.servlet;
import java.io.IOException;
import javax.servlet.http.*;
public class SchnarchServlet extends HttpServlet
{
@Override
protected void doGet( HttpServletRequest req, HttpServletResponse res )
throws IOException
{
res.getWriter().println( "'Chr! Schnarch! Razong! Chr! Chr! Rapüh!'" );
res.getWriter().println( "(Disneys beste Comics, Band 5, S. 218)" );
}
}
Ein Servlet erweitert eine besondere Oberklasse und realisiert eine doGet()-Methode. Die Methode ruft der Servlet-Container immer dann auf, wenn der Client eine Standard-Anfrage über HTTP stellt. Die Implementierung der doGet()-Methode schreibt in einen besonderen Ausgabestrom, der für die Daten bestimmt ist, die zum Client gelangen.
14.1.2 Was sind JavaServer Pages?
Servlets sind Server-Programme, die Webseiten erstellen, indem sie mit println() oder Ähnlichem HTML-Code in den Ausgabestrom schreiben. Ändert sich das Erscheinungsbild, dann muss das Java-Programm umgebaut werden, was aufwändig und fehlerträchtig ist. In der Regel ist der Programmierer auch nicht der Designer, und dieser möchte mit Webseiten-Erstellungsprogrammen wie DreamWeaver oder Microsoft FrontPage arbeiten. In vielen dynamischen Programmen stecken oft nur ein oder zwei Zeilen Dynamik, der Rest ist statischer HTML-Code.
Eine JSP (JavaServer Page) geht das Problem genau umgekehrt an. Wo ein Servlet eine Java-Klasse ist, die sich um die Ausgabe des HTML-Codes kümmert, ist eine JSP eine HTML-Seite mit eingebettetem Java-Code:
Listing 14.2: date.jsp
<html><body>
Hallo Nutzer. Wir haben heute
<%= new java.util.Date() %>.
</body></html>
Selbst eine normale Webseite ohne eingebettete JSP-Kommandos ist eine JSP.
Nun kann der Designer die Visualisierung der Informationen noch nachträglich anpassen, denn Visualisierung und Logik sind getrennt. Wie wäre es, wenn wir einem HTML-Designer einen Quellcode eines Servlets geben und ihn bitten, eine neue Spalte einzufügen?
Der JSP-Compiler
JSP-Skripte werden vom Server automatisch in Servlets übersetzt. Der Server weiß JSP von normalen HTML-Seiten zu unterscheiden, transformiert mithilfe eines JSP-Übersetzers aus der JSP ein Servlet und ruft die bekannten Servlet-Methoden auf, um die Ausgabe zu erzeugen. Der Übersetzungsvorgang von JSP in ein Servlet muss nur einmal getätigt werden – danach benutzt der Servlet-Container direkt die übersetzte Klasse.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.