Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 17 Servlets und Java Server Pages
gp 17.1 Dynamische Web-Seiten und Servlets
gp 17.1.1 Was sind Servlets?
gp 17.1.2 Was sind Java Server Pages?
gp 17.1.3 Vorteil von JSP/Servlets gegenüber CGI-Programmen
gp 17.2 Vom Client zum Server und wieder zurück
gp 17.2.1 Der bittende Client
gp 17.2.2 Was erzeugt ein Web-Server für eine Antwort?
gp 17.2.3 Wer oder was ist MIME?
gp 17.3 Servlets und Java Server Pages entwickeln und testen
gp 17.3.1 Servlet-Container
gp 17.3.2 Web-Server mit Servlet-Funktionalität
gp 17.3.3 Tomcat
gp 17.4 Java Server Pages in Tomcat und Eclipse
gp 17.4.1 Erster Ablageort für eigene JSP-Seiten
gp 17.4.2 Das Sysdeo-Plugin
gp 17.5 Skript-Elemente
gp 17.5.1 Scriptlets
gp 17.5.2 Ausdrücke
gp 17.5.3 Deklarationen
gp 17.5.4 Kommentare und Quoting
gp 17.6 Web-Applikationen
gp 17.7 Implizite Objekte
gp 17.8 Entsprechende XML-Tags
gp 17.9 Was der Browser mit auf den Weg gibt - HttpServletRequest
gp 17.9.1 Verarbeiten der Header
gp 17.9.2 Hilfsfunktion im Umgang mit Headern
gp 17.9.3 Übersicht der Browser-Header
gp 17.10 Formulardaten
gp 17.11 Das HttpServletResponse-Objekt
gp 17.11.1 Automatisches Neuladen
gp 17.11.2 Seiten umlenken
gp 17.12 JSP-Direktiven
gp 17.12.1 page-Direktiven im Überblick
gp 17.12.2 include-Direktive
gp 17.13 Aktionen
gp 17.13.1 Aktion include
gp 17.13.2 Aktion forward
gp 17.13.3 Aktion plugin
gp 17.14 Beans
gp 17.14.1 Beans in JSP-Seiten anlegen, Attribute setzen und erfragen
gp 17.14.2 Der schnelle Zugriff auf Parameter
gp 17.15 Kleine Kekse: die Klasse Cookies
gp 17.15.1 Cookies erzeugen und setzen
gp 17.15.2 Cookies vom Servlet einlesen
gp 17.15.3 Kleine Helfer für Cookies
gp 17.15.4 Cookie-Status ändern
gp 17.15.5 Langlebige Cookies
gp 17.15.6 Ein Warenkorbsystem
gp 17.16 Sitzungsverfolgung (Session Tracking)
gp 17.16.1 Das mit einer Sitzung verbundene Objekt HttpSession
gp 17.16.2 Werte mit einer Sitzung assoziieren und auslesen
gp 17.16.3 URL-Rewriting
gp 17.16.4 Zusätzliche Informationen
gp 17.17 Tag-Libraries
gp 17.17.1 Standard Tag Library (JSTL)
gp 17.18 Servlets
gp 17.18.1 Servlets compilieren
gp 17.18.2 Wohin mit den Servlets: das classes-Verzeichnis
gp 17.18.3 Servlets mit dem Sysdeo-Plugin unter Eclipse
gp 17.18.4 Servlet-Mapping
gp 17.19 Der Lebenszyklus eines Servlets
gp 17.19.1 Initialisierung in init()
gp 17.19.2 Abfragen bei service()
gp 17.19.3 Mehrere Anfragen beim Servlet und die Thread-Sicherheit
gp 17.19.4 Das Ende eines Servlets
gp 17.20 Das HttpServletResponse-Objekt
gp 17.20.1 Wir generieren eine Web-Seite
gp 17.20.2 Binärdaten senden
gp 17.20.3 Komprimierte Daten mit Content-Encoding
gp 17.20.4 Noch mehr über Header, die der Server setzt
gp 17.21 Objekte und Dateien per POST verschicken
gp 17.21.1 Datei-Upload
gp 17.22 Servlets und Sessions
gp 17.23 Weiterleiten und Einbinden von Servlet-Inhalten
gp 17.24 Inter-Servlet-Kommunikation
gp 17.24.1 Daten zwischen Servlets teilen
gp 17.25 Internationalisierung
gp 17.25.1 Die Länderkennung des Anfragers auslesen
gp 17.25.2 Länderkennung für die Ausgabe setzen
gp 17.25.3 Westeuropäische Texte senden
gp 17.26 Tomcat: Spezielles
gp 17.26.1 Tomcat als Service unter Windows NT ausführen
gp 17.26.2 MIME-Types mit Tomcat verbinden
gp 17.26.3 Servlets beim Start laden
gp 17.27 Ein Servlet generiert WAP-Seiten für das Handy
gp 17.27.1 Ein WAP-Handy simulieren
gp 17.27.2 Übersicht der wichtigsten Tags
gp 17.27.3 Der Gateway
gp 17.27.4 WML-Seiten aufbauen
gp 17.27.5 Interessante Links zum Thema Servlets/JSP


Galileo Computing

17.2 Vom Client zum Server und wieder zurückdowntop

Bevor wir den Fokus auf Server-generierte Web-Seiten lenken, wollen wir den Weg der Anfrage einmal genauer verfolgen.


Galileo Computing

17.2.1 Der bittende Clientdowntop

Richtet der Web-Browser oder eine Applikation (wie wir dies schon im Netzwerkkapitel gesehen haben) eine Anfrage an den Web-Server, so schickt er eine Kennung mit der Anfrageart (auch Methode oder Kommando genannt) zusammen mit der angeforderten URI (eine URL ohne Host, Port und Formularinhalt) und der Versionsnummer des zu nutzenden Protokolls zum Server. Die Anfrage (engl. request) kann zum Beispiel so aussehen:

GET /index.html HTTP/1.0

Hier wird vom Server, mit dem eine Verbindung besteht, das Dokument index.html angefordert. Wer die Reaktion des Servers auf diese Anfrage sehen möchte, der kann sich mittels telnet mit dem Server verbinden und das Kommando GET abschicken:

$ telnet www.spielge.de 80
GET /index.html HTTP/1.0

Nach zweimaligem Bestätigen finden wir in dem Ausgabefenster von Telnet die Reaktion des Servers, die zu Beginn wie folgt aussieht:

HTTP/1.0 200 OK
Date: Wed, 05 Nov 2003 11:35:22 GMT
Server: Apache/1.3.26 (Unix) mod_fastcgi/2.2.12
Cache-Control: max-age=120
Expires: Wed, 05 Nov 2003 11:36:41 GMT
P3P: policyref=">http://www.spiegel.de/w3c/p3p.xml";, CP="NOI DSP CURa ADMa DEVa TAIi
 PSAi PSDi OUR STP IND UNI COM NAV INT STA PRE"
Content-Type: text/html; charset=iso-8859-15
Via: 1.1 127.0.0.1
X-Cache: MISS from 127.0.0.1
X-Cache: MISS from lnxc-029.srv.mediaways.net
Connection: close
<!-- Vignette StoryServer 5.0 
... -->

Die GET-Anfrage ist die häufigste Methode. Da sie oft mit POST verwechselt wird, wollen wir den Unterschied noch einmal herausarbeiten.

GET

GET ist eine Anfrage für eine normale Web-Seite, die etwa durch Verfolgen eines Links oder Eintrags in der Browserzeile für die URL gestartet wird. GET wird auch manchmal verwendet, wenn Daten über Formulare an den Server geschickt werden. In diesem Fall werden die Daten URL-kodiert an die URL angehängt. Die so übertragenen Daten können jedoch nicht beliebig lang sein und sind durch das System begrenzt; die Maximalgröße ist unterschiedlich, liegt jedoch in der Regel bei etwa zwei Kilobyte. Das schränkt GET-Anfragen für Parameter ein. Herkömmliche CGI-Programme kommen an die Daten über eine Umgebungsvariable. Genau diese sind längenbeschränkt und lassen Daten nicht unendlich groß werden.


Beispiel Eine abgeschickte URL http://server/servlet?parameter1=wert1&;parameter2=wert2

POST

Auch POST überträgt Daten an den Server. Doch POST wird vom Browser nur für Formulare innerhalb von <form> mit der Anweisung method="post" verwendet. Die Daten werden nicht einfach an die URL angehängt, sondern in einem Datenstrom übermittelt. Zuerst wird dazu der HTTP-Server kontaktiert und mit Header-Informationen versorgt. Zum Beispiel steht die Länge der Daten im Request-Header Content-length. Danach werden die Daten gesendet, die CGI-Programmen in einem Datenstrom zur Verfügung stehen. Im Gegensatz zu GET gibt es bei POST keine Begrenzung des Informationsumfangs. Diese Methode wird auch meistens zur Übermittlung von Login-Daten verwendet, da bei der GET-Methode das Passwort unkodiert in der Browserzeile zu sehen wäre.

Andere Anfrage-Methoden

Die anderen Methoden werden nicht so häufig eingesetzt. Die HEAD-Methode fragt nach den Headern einer Web-Seite, ohne die Datei selbst zu übertragen. So lässt sich zum Beispiel das Datum der Änderung beziehen und dann feststellen, ob die Datei schon im Cache ist. Aus Sicherheitsgründen werden bei den meisten am Markt angebotenen Servern die Anfragemethoden PUT und DELETE nicht angeboten, da mit ihnen direkt auf den Server geschrieben werden kann.


Methode Beschreibung
GET Fordert die Web-Seite an
HEAD Fordert lediglich den Header einer Web-Seite an
PUT Anfrage, eine Web-Seite zu speichern
POST Anhang zu einer benannten Ressource (zum Beispiel eine Web-Seite)
DELETE Fordert zum Löschen einer Web-Seite auf
TRACE Der Client erhält seine gesendeten Informationen zurück.

Tabelle 17.1 Wichtigste Methoden seit HTTP 1.1


Galileo Computing

17.2.2 Was erzeugt ein Web-Server für eine Antwort?downtop

Beantwortet ein Web-Server eine Client-Anfrage (so genanntes Response), so schickt er das Ergebnis in einer ganz besonderen Form zurück. Diese ist wieder ASCII-basiert und erinnert an die Anfrage:

HTTP/1.1 200 OK
Content-Type: text/plain
Mein erstes Textdokument.

Diese Ausgabe besteht aus einer Statuszeile, einem oder mehreren Antwort-Headern, einer Leerzeile und dem Dokument selbst. Die Statuszeile gliedert sich in drei Bereiche. Zuerst zeigt die Information dem Browser die Version des HTTP-Protokolls an. Dann folgt eine Ganzzahl, die den Statuscode kodiert. Dieser ist in der Header-Beschreibung der RFC bei http://www.w3. org/Protocols beschrieben. Dann folgt eine kurze Textanzeige, die den Statuscode menschenlesbar macht. Einer der wohl am besten bekannten Statuscodes ist 404. Dieser zeigt an, dass die angeforderte Datei auf dem Server nicht existiert.

Das Servlet erzeugt automatisch die erste und zweite Zeile mit dem Header. Auf diese können wir Einfluss nehmen. Um ordentliche HTML-Seiten zu erstellen, wollen wir zuerst den Content-Type ändern. Danach lernen wir weitere Header kennen und unterschiedliche Statuscodes. Wir werden zudem sehen, dass unterschiedliche Header oft andere Statuscodes bedingen.


Galileo Computing

17.2.3 Wer oder was ist MIME?toptop

Wenn eine Seite vom Server zum Browser geschickt wird, dann erkennt der Anfrager wie von Zauberhand den Typ der verschickten Datei und kann sie passend anzeigen. Woher weiß also der Browser, dass eine HTML-Datei anders darzustellen ist als eine Grafik oder eine Word-Datei mit der Endung .doc, für das ein externes Anzeigeprogramm gestartet werden muss? Der Hinweis auf den Datentyp kommt vom Server mit einer Mitteilung, die sich MIME nennt. MIME ist ursprünglich für E-Mails entwickelt worden, um binäre Dateien zu versenden, doch MIME hat für das Web mittlerweile eine größere Bedeutung bekommen. MIME geht in Bezug auf elektronische Nachrichten durch E-Mails noch etwas weiter, als es im Protokoll HTTP genutzt wird, denn bei der Kommunikation im Web werden lediglich einige zentrale Teile benutzt.

Möchte der Web-Server dem Client den passenden MIME-Typ senden, muss er erst einmal herausfinden, welchen Typ die Datei besitzt. Dazu kann er zwei Taktiken verfolgen. Er kann in die Datei hineinsehen, die ersten Bytes untersuchen und seine Prognose abgeben oder einfach über die Dateiendung gehen. Letzteres wird sehr oft bei den Implementierungen von Web-Servern angewendet. Wenn wir Servlets programmieren, dann spielen wir selbst Server und müssen den MIME-Typ eigenständig angeben.

Wenn die Datei zum Client kommt, geht das Spielchen »wer -mit wem?« weiter, denn der Client muss nun aufgrund des MIME-Typs das passende Anzeigeprogramm finden. In der Regel kann der Browser die Daten direkt anzeigen, wenn es etwa eine HTML-Seite, Textseite oder Grafik ist. Sonst greift meistens ein ActiveX-Control (Microsoft) oder ein Plugin (Netscape) ein. Wenn er diesen MIME-Typ nicht mitgeschickt bekommt (was bei Servlets allerdings nicht passieren kann, da hier bei fehlender Programmierangabe immer ein Standardwert mitgeschickt wird), muss er genauso raten wie der Server.1 Doch bleiben wir bei dem Servlet-Fall, dass der Typ immer mitgeschickt wird. Wie sieht dieser dann aus?

Beispiele für MIME-Typen

Jeder MIME-Typ besteht aus zwei Hälften: einer Kategorie und einem Datentyp. Wichtige Kategorien sind text, audio, image, video, application. Wir wollen einige Beispiele aufführen:

gp text/html
Dies ist der Standardtyp für Web-Seiten. Ein Servlet, welches HTML-Seiten generiert, sollte diesen Typ immer setzen. So kann der Browser sofort HTML interpretieren und die Seite aufbauen.
gp text/plain
Hierbei handelt es sich um eine Textdatei, die nicht vom Browser interpretiert wird. Auch wenn der Text ein HTML-Text ist, baut der Server daraus keine HTML-Seite auf. Typischerweise verbindet der Server normale Textdateien mit dem Typ plain.
gp image
Die Datentypen für Grafikformate. Beispiel: image/gif, image/jpeg für GIF und JPEG
gp audio
Sound-Dateien, zum Beispiel audio/basic oder audio/x-wav
gp video
Darstellbare Bewegbilder wie video/mgep oder video/quicktime
gp application
Dazu zählen in der Regel Binärdateien, die von anderen Programmen gelesen oder ausgeführt werden, etwa application/pdf für eine PDF-Datei, application/msword für ein Microsoft Word-Dokument oder application/vnd.ms-excel für ein Excel-Dokument.
gp multipart
Anzeige, dass der Datenstrom unterschiedliche Teile beinhaltet. Oft bei E-Mails, die einen Text und einen Datenanteil für den Anhang besitzen. Beispiel: multipart/mixed, multipart/news.

Mittlerweile gibt es unzählige MIME-Typen, und es ist nicht sicher, dass diese immer vom Browser unterstützt werden. Im Zweifelsfall hilft nur ein Blick in die Zuordnungstabelle des Browsers. Unter ftp://ftp.isi.edu/in-notes/iana/assignments/media-types lässt sich in Erfahrung bringen, wo welcher MIME-Typ genau definiert ist.






1 Der Microsoft Internet Explorer nutzt dazu eine Betriebssystemmethode mit dem Namen FindMimeFromData(). Mehr Informationen zu dieser Thematik findet der Leser auf den Microsoft-Seiten.





Copyright (c) Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de