Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5 (Tiger-Release)
Buch: Java ist auch eine Insel
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.4 Java Server Pages in Tomcat und Eclipse
    gp 17.4.1 Download und Installation
    gp 17.4.2 Ablageort für eigene JSP-Seiten
    gp 17.4.3 Web-Applikationen
    gp 17.4.4 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.5.5 Entsprechende XML-Tags
  gp 17.6 Implizite Objekte
  gp 17.7 Was der Browser mit auf den Weg gibt – HttpServletRequest
    gp 17.7.1 Verarbeiten der Header
    gp 17.7.2 Hilfsfunktion im Umgang mit Headern
    gp 17.7.3 Übersicht der Browser-Header
  gp 17.8 Formulardaten
  gp 17.9 Das HttpServletResponse-Objekt
    gp 17.9.1 Automatisches Neuladen
    gp 17.9.2 Seiten umlenken
  gp 17.10 JSP-Direktiven
    gp 17.10.1 page-Direktiven im Überblick
    gp 17.10.2 include-Direktive
    gp 17.10.3 Mit JSPs Bilder generieren
  gp 17.11 Aktionen
    gp 17.11.1 Aktion include
    gp 17.11.2 Aktion forward
    gp 17.11.3 Aktion plugin
  gp 17.12 Beans
    gp 17.12.1 Beans in JSP-Seiten anlegen, Attribute setzen und erfragen
    gp 17.12.2 Der schnelle Zugriff auf Parameter
  gp 17.13 Kleine Kekse: die Klasse Cookies
    gp 17.13.1 Cookies erzeugen und setzen
    gp 17.13.2 Cookies vom Servlet einlesen
    gp 17.13.3 Kleine Helfer für Cookies
    gp 17.13.4 Cookie-Status ändern
    gp 17.13.5 Langlebige Cookies
    gp 17.13.6 Ein Warenkorbsystem
  gp 17.14 Sitzungsverfolgung (Session Tracking)
    gp 17.14.1 Das mit einer Sitzung verbundene Objekt HttpSession
    gp 17.14.2 Werte mit einer Sitzung assoziieren und auslesen
    gp 17.14.3 URL-Rewriting
    gp 17.14.4 Zusätzliche Informationen
  gp 17.15 Tag-Libraries
    gp 17.15.1 Standard Tag Library (JSTL)
    gp 17.15.2 Jakarta Taglibs Project
  gp 17.16 Servlets
    gp 17.16.1 Servlets compilieren
    gp 17.16.2 Wohin mit den Servlets: das classes-Verzeichnis
    gp 17.16.3 Servlets mit dem Sysdeo-Plugin unter Eclipse
    gp 17.16.4 Servlet-Mapping
  gp 17.17 Der Lebenszyklus eines Servlets
    gp 17.17.1 Initialisierung in init()
    gp 17.17.2 Abfragen bei service()
    gp 17.17.3 Mehrere Anfragen beim Servlet und die Thread-Sicherheit
    gp 17.17.4 Das Ende eines Servlets
  gp 17.18 Das HttpServletResponse-Objekt
    gp 17.18.1 Wir generieren eine Web-Seite
    gp 17.18.2 Binärdaten senden
    gp 17.18.3 Komprimierte Daten mit Content-Encoding
    gp 17.18.4 Noch mehr über Header, die der Server setzt
  gp 17.19 Objekte und Dateien per POST verschicken
    gp 17.19.1 Datei-Upload
  gp 17.20 Servlets und Sessions
  gp 17.21 Weiterleiten und Einbinden von Servlet-Inhalten
  gp 17.22 Inter-Servlet-Kommunikation
    gp 17.22.1 Daten zwischen Servlets teilen
  gp 17.23 Internationalisierung
    gp 17.23.1 Die Länderkennung des Anfragers auslesen
    gp 17.23.2 Länderkennung für die Ausgabe setzen
    gp 17.23.3 Westeuropäische Texte senden
  gp 17.24 Tomcat: Spezielles
    gp 17.24.1 Tomcat als Service unter Windows NT ausführen
    gp 17.24.2 Interessante Links zum Thema Servlets/JSP


Galileo Computing

17.2 Vom Client zum Server und wieder zurücdowntop

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 Client  downtop

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-885915
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.


Tabelle 17.1   Wichtigste Methoden seit HTTP 1.1

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.


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. 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 © 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