WWW & Servlets
Fachgruppe Softwaretechnik, Uwe Poborski
Dieses Dokument geht bei seinen Ausführungen und besonders bei den Beispielen davon aus, daß
- als Betriebssystem Windows95, Windows98 oder Windows NT,
- der Internet-Explorer von Microsoft in der Version 5,
- das Java-Developer-Kit (JDK) in der Version 1.2,
- das Java-Servlet-Developer-Kit (JSDK) in der Version 2.0 installiert sind.
Das WWW (World Wide Web) ist ein globales Hypertextsystem, in dem Computer-Dokumente
mit Hilfe von Hyperlinks, speziell markierter Objekte wie Zeichenketten oder Grafiken, verknüpft sind.
Wie andere Informationsdienste des Internet basiert das WWW auf der Client/Server-Architektur,
einem Anforderungs/Antwort-Kommunikationsprinzip. Damit kommunizieren im WWW nach festen Regeln,
dem Protokoll HTTP, ein Client, der sogenannte Browser,
und ein WWW-Server, der die Daten und Dokumente,
meist im HTML-Format zu Verfügung stellt.
Zur eindeutigen Identifizierung von Dokumenten im Internet werden Uniform Resource Locator
verwendet, die im wesentlichen aus drei Informationen gebildet werden:
- Die Zugriffsmethode für den Transport,
- den Namen des Rechners mit den Dokumenten,
- den genauen Verzeichnispfad des Dokuments.
Die Form, die die Struktur eines URL bilden sieht allgemein so aus:
- Zugriffsmethode://Rechnername[:Portnummer]/Pfad/Datei
Die Portnummer gibt einen Software-Port an, den der Server-Rechner für verschiedene
Internet-Dienste bzw. Zugriffsmethoden benutzt. Folgende Möglichkeiten für Zugriffsmethoden
und Standard-Ports existieren:
- http://Rechnername[:80]/Pfad/Datei
- gopher://Rechnername[:70]/[Typ[Position]]
- ftp://[Benutzername[:Passwort]@]Rechnername[:Port]/Pfad/Datei
- file:[//Rechnername]/Pfad/Datei, wenn Rechnername angegeben wie ftp
- telnet, news, mailto
Das HyperText Transfer Protocol bildet die Regeln, nach denen sich der
Informationsaustausch im Web vollzieht, wobei der Austausch von Dokumenten und Daten auf
folgenden Schritten basiert:
- Aufbau der Verbindung zwischen Client und Server mittels des URL
- Anforderung des Dokuments oder der Daten durch den Browser des URL
- Übertragung der Daten oder des Dokuments durch den Server;
das Datenformat wird ebenfalls übermittelt
- Abbruch der Verbindung durch den Server nach Abschluss der Übertragung
- Der Browser lädt die empfangenen Daten
und stellt sie, je nach Datenformat, selber oder durch einen Viewer lokal auf dem Client-Rechner dar.
Die HyperText Markup Language bezeichnet ein System von Anweisungen
zur Strukturierung von Hypertextdokumeneten. Sie ist als Sprache eine spezielle Ausprägung der SGML
(Sandard Generalized Markup Language) dazu gedacht, Dokumente und Daten
über Rechnergrenzen hinweg auszutauschen. Sie beschreibt die Dokumente nicht in ihrem exakten Layout,
sondern beschreibt ihre konzeptionelle Struktur in einem HTML-Dokument, das grundsätzlich eine ASCII-Textdatei ist.
Für die konkrete Darstellung ist ein Browser, das Client-Programm des lokalen Rechners verantwortlich.
Beide Sprachen legen durch eine DTD(document type definition) fest,
wie die Strukturdefinitionen notiert und verwendet werden; ohne diese Strukturelemente stellt der Browser
die Datei als fortlaufenden Text dar. Da diese Elemente Textstellen markieren, um sie von den übrigen abzuheben,
heissen sie Tags (engl. Tag: Marke). Steuerelemente haben einen Namen und werden in spitzen Klammern notiert:
leere Tags: <Elementname>
Container-Tags: <Elementname> </Elementname>
Attribut: <Elementname> Attribut1="Wert1" Attribut2="Wert2" ... AttributN="WertN" </Elementname>
Im Zusammenhang mit Servlets interessiert hier besonders das FORM-Steuerelement
und das darin verschachelte INPUT-Steuerelement:
<FORM [NAME="Name"][ACTION="URL"] [METHOD="Methode"] [ENCTYPE="Typ"]>
<INPUT TYPE="Typ" NAME="Name" VALUE="Wert"></INPUT>
</FORM>
Der Begriff des Formulars wird hier im weitesten Sinne für alles verwendet,
was durch Eingabefelder oder Schalter realisiert werden kann. Es werden ein- oder mehrzeilige Texfelder,
Ankreuzfelder(check box) und Schalter(button) angeboten.
Inhalt
HTML beschreibt ein Dokument nicht in seinem exakten Layout, sondern beschreibt ihre
konzeptionelle Struktur. Ein Programm auf einem lokalen Rechner, der Browser, interpretiert den Inhalt eines
HTML-Dokuments und stellt dieses formatiert auf dem Bildschirm dar.
Das FORM-Steuerelement fordert im allgemeinen einen Benutzer auf bestimmte Eingaben zu tätigen
oder Auswahlen zu treffen um dann abschliessend die Daten durch Betätigen eines Versende-Schalters zu übermitteln.
Beispiel :
Hier wird das FORM-Tag begonnen:
<FORM NAME="NurEinSchalterFormular" ACTION="#Beispiel1" METHOD="POST">
Das unverzichtbare Element SUBMIT-Schalter kann so notiert werden:
<INPUT TYPE="SUBMIT" NAME="InputSubmitButton" VALUE="Sende Formular an Server">
Hier wird das FORM-Tag beendet:
</FORM>
Das einfachste Formular stellt sich dann so dar:
Bei Betätigen des Schalters "Sende Formular an Server" wird das Formular an die im ACTION-Attribut
angegebene URL gesendet. Im Beispiel ist ein Anker im selben Dokument angeben,
zu dem verzweigt wird. Gibt man kein ACTION-Attribut an, so wird die aktuelle Seite geladen.
Durch Formulare ist es relativ einfach ein Dokument zu gestalten, das interaktiv dem Benutzer die Navigation und
Informationssuche erleichtern soll.
weiteres Beispiel:
Hier wird das FORM-Tag begonnen:
<FORM NAME="ResetSchalterFormular" ACTION="#Beispiel2" METHOD="POST">
Ein Element zur TEXT-Eingabe wird so notiert:
<INPUT TYPE="TEXT" NAME="InputResetTEXT" VALUE="ANFANGSWERT">
Das Element RESET-Schalter wird so notiert:
<INPUT TYPE="RESET" NAME="InputResetButton" VALUE="Setze Wert auf "ANFANGSWERT"">
Hier wird das FORM-Tag beendet:
</FORM>
Dieses Formular stellt sich dann so dar:
Bei Betätigen des Schalters "Setze Wert auf Anfangswert" wird das Formular an die im ACTION-Attribut
angegebene URL gesendet. Dieses Beispiel zeigt die Wirkung des RESET-Schalters.
Die Kombination der in den Beispielen gezeigten Elemente und weiterer möglicher INPUT-Tags läßt
Formulare beliebiger Gestaltung und die Anzeige durch den Browser zu.
Allerdings fehlt zur Funktionalität die Auswertung der eingebenen Daten.
Bei Betätigung des SUBMIT-Schalters durch den Benutzer werden die zu den INPUT-Tags
gehörenden VALUE-Attribute gefüllt bzw. überschrieben und an die im ACTION-Attribut angegebene
URL gesendet. Dabei wird die Versendungsform durch das METHOD-Attribut
des FORM-Steuerelements in GET, die Daten werden an den URL angehängt,
und POST, die Daten werden extra an den Server versendet, unterschieden.
Standardmäßig ist die GET-Methode voreingstellt, die POST-Methode ist aber bei größeren
Datenmengen besser geeignet, da es bei GET zu unkontrollierbaren Übertragungsverlusten kommen kann.
Die Übertragung wird nach den Regeln des Protokolls HTTP vorgenommen.
Inhalt
Der WWW-Server ist zuständig für die Lokalisierung des über den URL
referenzierten Dokumentes einer eingehenden Anforderungen eines Browsers in
HTTP. Nach erfolgreichem Auffinden und Prüfen der Rechte des Dokuments sendet der
Server dieses und die zugehörigen Daten (Grafiken, etc) an den Browser zu Darstellung. Bei interaktiven
Anwendungen, wie sie über Formulare ermöglicht werden, reicht diese statische Konzept nicht aus.
Vielmehr bedarf es der Möglichkeit, das der Server ein Programm ausführt, das die gewünschten Daten
berechnet und zur Verfügung stellt. Diese Programme heißen gateway bzw. script.
Diese Programme werden vom WWW-Serverprogramm ausgeführt, akzeptieren Befehle des Servers
und geben Daten in einer Form wieder, die vom Server als HTML-Daten
an den Client weitergereicht werden. Der Mechanismus der Zusammenarbeit zwischen gateway
und WWW-Serverprogramm wird als CGI(Common Gateway Interface) bezeichnet.
Grundsätzlich lassen sich solche gateways in jeder, auf dem Server-Rechner lauffähigen
Programmier- oder Scriptsprache implementieren, im Zusammenhang mit Servlets kommt allerdings nur
Java in Frage, da das Konzept der Servlets eng mit dessen Möglichkeiten verknüpft ist.
Inhalt
Um die Vorgehensweise bei der Anwendung der Programmiersprache Java im Zusammenhang mit dem WWW zu erläutern,
werden zunächst die Möglichkeiten dargestellt, ein HTML-Dokument mit dynamischen Elementen
zu bereichern. Als erstes ist der Source-Code des Programms zu erstellen oder zu besorgen und mit Hilfe eines
Java-Compilers in Byte-Code zu übersetzen oder dieser Byte-Code zu besorgen. Gewöhnlich enden Source-Code Dateien
in ".java" und Byte-Code Datein in ".class". Der Byte-Code enthält maschinenunabhängige
Instruktionen für eine "virtuelle Maschine", die Java-VM. Um mit Hilfe eines HTML-Browsers
das Programm auszuführen, muß einerseits der Browser dazu fähig sein, in dem er eine Java-VM startet,
andererseits das auszuführende Programm als Applet geschrieben worden sein.
Der Begriff Applet stammt von "eingebetteten Applikationen" und bezeichnet somit
Java-Programme, die in HTML-Dokumente eingebettet sind. Die Einbettung erfolgt
über den APPLET-Container, dessen Syntax lautet:
<APPLET
[CODEBASE="Appletverzeichnis"]
CODE="Applet-Byte-Code-Name"
[ALT=""][NAME=""]
WIDTH="Breite in Pixeln"
HEIGHT="Höhe in Pixeln"
[ALIGN=""][VSPACE=""][HSPACE=""]>
[<PARAM NAME="P1" VALUE="W1">]
[..................................]
[<PARAM NAME="Pn" VALUE="Wn">]
</APPLET>
Findet der Browser ein solches APPLET-Tag, startet er die Java-VM,
lädt mittels des Class-Loaders die Klasse des Applets und evtl. andere von dort referenzierte
Klassen, prüft den Byte-Code auf Korrektheit, initialisiert Variablen mit Standardwerten und führt die
Methode init der Applet-Klasse aus. Ohne auf die sprachspezifischen Gegebenheiten von Java
einzugehen, gilt für eine Applet-Klasse folgendes Schema:
public class DasApplet extends java.applet.Applet {
// diverse Variablen mit Sichtbarkeiten
// zu ueberschreibende Methoden von java.applet.Applet
public void init(){
// initialisieren der diversen Variablen
// wird ausgefuehrt, wenn der Browser die Seite das erste Mal laedt
}
public void start(){
// wird nach init() und jedesmal, wenn der Browser die Seite neu laedt aufgerufen
}
public void stop(){
// wird vor destroy() und jedesmal, wenn der Browser die Seite verlaeßt aufgerufen
}
public void destroy(){
// wird aufgerufen, wenn das Applet-Objekt geloescht wird
}
public void paint(Graphics G){
// wird zum Zeichnen in den durch G gegebenen Graphik-Kontext aufgerufen
}
}
Um die evtl. übergebenen Parameter aus den PARAM-Attributen auszuwerten, kann die Applet-Klasse
über die geerbte Methode getParameter("PARAM NAME") von java.applet.Applet auf die Werte zugreifen.
Zum Beispiel kann einer Variable "S" in der init-Methode
public void init(){
// initialisieren der diversen Variablen
// wird ausgefuehrt, wenn der Browser die Seite das erste Mal laedt
String S = getParameter("AppletParameter");
// S enthaelt die Zeichenkette "Wert"
}
der Wert "Wert" zugewiesen werden, wenn als APPLET-Tag
im HTML-Dokument angegeben wurde
<APPLET CODE="DasApplet.class">
<PARAM NAME="AppletParameter" VALUE="Wert">
Der WWW-Browser stellt für Applets eine komplette Infrastruktur mit
Fenstern, Graphik-Kontext und Ereignisverarbeitung zur Verfügung, erzeugt für jedes Applet ein
Objekt und ruft dessen Initialisierungsroutine auf. Aus Sicherheitsgründen bestehen aber für Applets
schwerwiegende Einschränkungen, was verhindert, sie als gateways zu benutzen:
- Applets können das Dateisystem eines Hosts(Client), auf dem der
Browser läuft,
nicht lesen oder schreiben
- Applets können nur mit dem Server, von dem sie geladen wurden
kommunizieren
und keine Verbindung zu andern Servern aufbauen
- Applets können auf dem Host keine Programme starten
Hier nun ein Beispiel-Applet, das mit
<APPLET CODE="AppletKlasse.class"
WIDTH="150" HEIGHT="250">
<PARAM NAME="Breite" VALUE="150">
<PARAM NAME="Hoehe" VALUE="250">
</APPLET>
eingebettet werden kann.
AppletKlasse Source-Code
in einem anderen Fenster
Inhalt
Ein Servlet ist für den WWW-Server, was ein Applet
für den Browser ist, kann darüber hinaus aber als gateway
benutzt werden. Die Architektur eines Servlets-Programms folgt dabei einem solchen Schema:
public class DasServlet extends javax.servlet.http.HttpServlet {
// diverse Variablen mit Sichtbarkeiten
// zu ueberschreibende Methoden von javax.servlet.http.HttpServlet
public void doPost(HttpServletRequest Anfrage, HttpServletResponse Antwort){
// Das Anfrage-Objekt beinhaltet die Parameter, die der Client uebergibt
// und einen Eingabe Stream, der ebenfalls das Servlet mit Daten versorgen kann.
// Um Informationen an den Client zurueckzuliefern,
// schreibt man in den Ausgabe Stream des Antwort-Objects.
}
// evtl. zu ueberschreibende Methoden von javax.servlet.http.GenericServlet
public void init(ServletConfig config{
// initialisieren der diversen Variablen
// wird einmal ausgefuehrt, wenn der Server ein Object der Servlet-Klasse
// das erste Mal laedt
}
public void service(ServletRequest Anfrage, ServletResponse Antwort){
// (!wegen Multithreading muss diese Methode mitunter synchronisiert werden!)
//
// fuehrt eine Anfrage des Client aus.
// leitet die Bearbeitung an spezifische Methoden des HTTPServlets, hier doPost(...)
}
public void destroy(){
// wird einmal aufgerufen, wenn das Servlet-Objekt geloescht wird und alle services beendet sind
}
}
Nachdem der WWW-Server das Servlet geladen und initialisiert hat, kann dieses
Anfragen des Client mit der service Methode bearbeiten. Die Aufforderung des Browsers
an den Server läßt sich mit einem FORM-Steuerelement der Art
<FORM ACTION="http://HOSTNAME:PORTNUMMER/servlets/SERVLETNAME" METHOD="POST">
</FORM>
bewerkstelligen, wobei der WWW-Server das Servlet names SERVLETNAME.class mit der
Pfadangabe des URL sucht. Vorausgestzt der Server unterstuetzt Servlets führt er das
Programm aus.
Da Servlets alsgateways auf dem Server-Rechner weitere Sicherheitsmassnahmen erfordern
oder einfach kein solcher WWW-Server zur Verfügung steht, gibt es eine Applikation
die das Ausführen von Servlets übernehmen kann.
Das Programm servletrunner benötigt eben jene Parameter, die ein WWW-Server
braucht um gateways zu finden:
- die PORTNUMMER, aus dem URL des ACTION-Attribut des
aufrufenden Dokuments: sinnvolle Nummern sind größer als 1024
- das PfadZuServlets-Verzeichnis, in dem die Servlets zu finden sind: Es wird das "/servlets"-Verzeichnis
auf diese Angabe umgeleitet
- beispielsweise: servletrunner -d PfadZuServlets -p PORTNUMMER
- servletrunner ? zeigt die Liste verfügbarer Optionen/Parameter
Erhält der Server eine Anfrage an ein laufendes Servlet, wird die Methode service ausgeführt, die
in der Klasse javax.servlet.http.HttpServlet die Anfrageparameter an die Methode doPost(HttpServletRequest Anfrage, HttpServletResponse Antwort) weiterleitet, davon
ausgehend, daß als METHOD-Attribut "POST" angegeben wurde. Wurde dieses Methode im speziellen Servlet
nicht überschrieben, erhält der Browser als Antwort lediglich eine "BAD REQUEST" Fehlermeldung.
Eine Implementierung der doPost(HttpServletRequest Anfrage, HttpServletResponse Antwort) Methode
bietet mit den Parametern
der Klasse HttpServletRequest, die Möglichkeit mittels
- Anfrage.getReader() Daten, die im Textformat erwartet werden,
- Anfrage.getInputStream() binäre Daten,
die der Client sendet, zu lesen
und mit den Parametern
der Klasse HttpServletResponse, die Möglichkeit mittels
- Anwort.getWriter() Daten, die im Textformat zu versenden sind,
- Antwort.getOutputStream() binäre Daten,
an den Client zurückzusenden.
Dabei sollte vorher allerdings der Typs des Inhalts, der gesendet werden soll mit
- Antwort.setContentType("text/html")
bestimmt werden und nach Fertigstellung des Inhalts der Writer bzw. der OutputStream
geschlossen werden, damit der Server das Ende der Sendung erkennt und mit der Übertragung beginnt.
Unabhängig von dem gewählten METHOD-Attribut, das die Auswahl der verschiedenen, überschriebenen
do...-Methoden steuert, können mit
- Anfrage.getParameterValues() die Werte
und
- Anfrage.getParameterNames() die Namen
der Parameter abgefragt werden.
Die doPost-Methode läßt sich damit wie folgt zusammensetzen:
public void doPost(HttpServletRequest Anfrage, HttpServletResponse Antwort){
// Das Anfrage-Objekt beinhaltet die Parameter, die der Client uebergibt
// und einen Eingabe Stream, der ebenfalls das Servlet mit Daten versorgen kann.
// Benutzung, um Parameter auszulesen
bearbeiteAnfrage(Anfrage);
// Um Informationen an den Client zurueckzuliefern,
// schreibt man in den Ausgabe Stream des Antwort-Objects.
// Benutzung, um HTML-Dokument zu generieren
bearbeiteAntwort(Antwort);
}
protected void bearbeiteAnfrage(HttpServletRequest Anfrage){
String[] Paras = Anfrage.getParameterValues("PARA");
String Para = Paras[0];
// Initialisieren weiterer Variablen
}
protected void bearbeiteAntwort(HttpServletResponse Antwort){
Antwort.setContentType("text/html");
PrintWriter Schreiber = Antwort.getWriter();
Schreiber.println("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n");
Schreiber.println("<html>\n");
// Generieren des Kopfs
generierenHTMLKopf(Schreiber);
// Generieren des Koerpers
generierenHTMLKoerper(Schreiber);
// evtl. Generieren anderer Komponenten
// gen...(Schreiber);
Schreiber.println("</html>\n");
Schreiber.close();
}
private void generierenHTMLKopf(PrintWriter Schreiber){
Schreiber.println("<HEAD>");
// ...
Schreiber.println("</HEAD>");
}
private void generierenHTMLKoerper(PrintWriter Schreiber){
Schreiber.println("<BODY>");
// ...
Schreiber.println("</BODY>");
}
Hier nun ein Beispiel-Servet
FlugSuchServlet
in einem anderen Fenster, dessen Service mit
<FORM NAME=VerbSuch ACTION="http://localhost:8889/servlet/FluSuServlet" METHOD=POST>
<INPUT TYPE = HIDDEN NAME = Pfad VALUE = Pfad_zu_Dateien >
Abflug : <INPUT TYPE = TEXT NAME = Abflug>
Ankunft : <INPUT TYPE = TEXT NAME = Ankunft>
Datum (TT.MM.YYYY) : <INPUT TYPE = TEXT NAME = Datum>
<INPUT TYPE = RADIO NAME = Anfrage VALUE = Zeit CHECKED> min. Zeit</INPUT>
<INPUT TYPE = RADIO NAME = Anfrage VALUE = Preis>min. Preis</INPUT>
<INPUT TYPE = SUBMIT VALUE = "Suchen..."></INPUT>
<INPUT TYPE = RESET VALUE = "Eingabe löschen"></INPUT>
</FORM>
Servlet Source-Code
angefordert werden kann, wenn servletrunner mit
servletrunner -d /flusu -p 8889
gestartet wurde.
Inhalt
- Schader, M.; Schmidt-Thieme, L.: Java: Einführung in die objektorientierte Programmierung
Springer, 1998 ISBN 3-540-63770-2
- Koch-Steinheimer, Peter: HTML - Veröffentlichen im Internet
Internat. Thomson Publ., 1997 ISBN 3-8266-0328-1
Servlets bei Sun
Inhalt