![]() |
||||||||||||||||
|
HTTP-spezische Eigenschaften eines Servlet sind in einem speziell dafür entworfene Package implementiert. In Tab. 13-5 und Tab. 13-6 sind die Interfaces und Klassen dieses Packages aufgelistet. |
||||||||||||||||
|
||||||||||||||||
|
Tab. 13.5: Interfaces des Packages javax.servlet.http |
||||||||||||||||
|
||||||||||||||||
|
Tab. 13.6: Klassen des Packages javax.servlet.http Klasse HTTPServlet Viele Daten werden im Internet mit Hilfe des HTTP-Protokolls übertragen. Die Klasse javax.servlet.http.HttpServlet erweitert die Klasse javax.servlet.GenericServlet, damit HTTP-spezifische Anfragen bearbeitet werden können. Sie stellt damit eine Standardimplementierung des Interfaces javax.servlet.Servlet dar. Programmierer von Servlets müssen diese Klasse erweitern. Die Syntax für eine solche Erweiterung lautet:
public class meinHTTPServlet extends HttpServlet Die Standardimplementierung der Klasse javax.servlet.http.HttpServlet erkennt die Standardmethoden von HTTP/1.1 (bspw. GET, PUT oder POST) [rfc2068] und ruft die jeweils zugehörige do-Methode (doGet(), doPut() oder doPost()) auf. Die wichtigsten Methoden des HTTP-Protokolls sind in Tab. 13-7 aufgeführt |
||||||||||||||||
|
||||||||||||||||
|
Tab. 13.7: Die wichtigsten HTTP-Methoden So behandelt bspw. die doGet-Methode der Klasse HTTPServlet solche Anfragen, die mit Hilfe der HTTP-Methode GET gestellt werden. Die doPost-Methode muss überschrieben werden, wenn die HTTP-Anfrage POST bearbeitet werden soll. Ein HTTP-Servlet bearbeitet Client-Anfragen mit Hilfe der service-Methode. Diese Methode dient in der Regel nur als Kommando-Container und wird nur in Ausnahmefällen überschrieben. Sie leitet jede ankommende Anfrage gemäß der HTTP_Methode an die entsprechende HttpServlet-Spezialmethode weiter, also bspw. GET_Anfragen an die doGet-Methode und POST_Anfragen an die doPost-Methode. Im Folgenden sind die Methoden der Klasse HttpServlet aufgelistet, die von der service-Methode an die entsprechenden HTTP-Methoden weiterleitet werden.
Ist das Servlet initialisiert, so können HTTP-Anfragen beantwortet werden. Wie jede Interface HTTPServletRequest Das Interface HttpServletRequest erweitert das Interface ServletRequest und erlaubt darüber hinaus den Zugriff auf die HTTP_spezifischen Eigenschaften von Anfragen eines Clients, die an einen Server gesendet werden. Klassen, die dieses Interface implementieren, können bspw. auf Client-Informationen zugreifen, wie bspw. auf die Bezeichnung der vom Client gesendeten Parameter, das vom Client verwendete Protokoll, den Namen der Client-Maschine oder den Namen des Servers, der die Anfrage empfängt. Der Zugriff auf eine Client-Anfrage kann folgendermaßen erfolgen:
Eine der Schlüsselmethoden der Klasse
String parameter = request.getParameter(String name); Dieser Aufruf liefert dann den Parameter zurück, der durch name gekennzeichnet ist. Derartige Parameter werden im HTML-Code festgelegt. Als Beispiel dient folgender Code:
String Nachname = request.getParameter ("name"); Eine Alternative dazu ist die Aufzählung sämtlicher Parameternamen:
Enumeration names = request.getParameterNames(); Zum Auslesen von HTTP-Anfrageparametern stehen u. a. die folgenden Methoden der Klassen javax.servlet.http.HttpServletRequest und javax.servlet.ServletRequest zur Verfügung:
Zum Interface HTTPServletRequest Interface HTTPServletResponse Das Interface Ein HttpServletResponse-Objekt bietet zwei Möglichkeiten, Daten an den Client zu senden:
Das Schließen des
public class EinfachesServlet extends HttpServlet { // Verwende die HTTP-Methode GET, um eine einfache Webseite public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out; // lege den Datentyp des Inhalts der Antwort fest // Schreibe die Antwort als Text // Schließen des Writer-Objekts, damit der Server erkennt, } // Die doPost-Methode ruft die doGet-Methode auf doGet(request, response) } } Eine einfache HTTP-Antwort beginnt im Unterschied zu einer HTTP-Anfrage mit der Version des unterstützten Protokolls, gefolgt von einem Status-Code und einem Kommentar zum Status-Code:
HTTP/Versionsnummer Status-Code Reason-Phrase Ein Beispiel für eine derartige Antwort ist im Folgenden angegeben.
HTTP/1.0 200 OK Die Versionsnummer gibt an, in welcher Version das HTTP-Protokoll läuft (Version 1.0 oder Version 1.1). Der Status-Code einer Antwort ist ein ganzzahliger Wert, der aus drei Ziffern besteht. Die erste Ziffer ist die wichtigste, da sie die Antwortkategorie identifiziert:
Der sog. Reason-Nachrichtsteil ist ein Beschreibungstext des Status-Codes. Für die Ausgabe der Ergebnisse (sog. Response) wird ein
ServletOutputStream out = response.getOutputStream(); Alle Daten, die in diesen Stream geschrieben werden, werden automatisch an den Client weitergeleitet (bspw. HTML-Code). Aufgrund dieses Mechanismus kann das Ergebnisdokument dynamisch erzeugt werden. Ein Servlet muss immer mit Hilfe der Methode setStatus() einen HTTP-StatusCode zurückgeben, um bspw. dem Client den Erfolg einer Abfrage mitzuteilen. Verläuft die Ausführung des Servlets ordnungsgemäß, kann man mit der response.setStatus(Statuscode)-Methode den Statuscode auf den Wert SC_OK setzen. Status-Codes sind in Tab. 13-8 aufgeführt. Die Methode setStatus kann zusätzlich zum Status-Code eine Statusmeldung entsprechend der HTTP-Spezifikationen zurückliefern:
setStatus(Statuscode, Statusmeldung); Tab. 13-8 listet die wichtigsten Status-Code-Variablen der Klasse javax.servlet.http.ServletResponse auf. |
|
|
Tab. 13.8: Variablen von HTTP-Status-Codes Zur Erläuterung und Auflistung weiterer HTTP-Status-Codes sei an dieser Stelle auf die Literatur verwiesen [rfc1945, rfc2068]. Zusätzlich zu den oben angegebenen Methoden enthält diese Klasse die folgenden Methoden:
HTTP-Sessions Ein Problem von HTTP ist, dass das Protokoll zustandslos ist. Hierdurch ist es schwierig, eine Kommunikation zu etablieren, die Anfragen und Antworten in mehreren Schritten ausführen. Mittels des sog. Session Tracking kann ein Servlet eine eingehende Anfrage mit einem Client assoziieren, wodurch sich eine Sitzung über mehrere Anfragen und Antworten hinaus ausdehnen kann. Die hierzu notwendigen Schritte sind:
Sitzungen können aufrechterhalten werden, indem Cookies verwendet werden, bzw. indem URLs weitergeleitet werden (Rewriting URLs). Die URL-Weiterleitung ist allerdings gegenüber Cookies unkomfortabel und bedeutet meist für den Programmierer von Servlets zusätzlichen Programmieraufwand. Die Weiterleitung wird daher nur verwendet, wenn Sitzungsinformationen notwendig sind und keine Cookies zur Verfügung stehen. Als Beispiel hierfür wird die Seite Das Interface HttpSession-Interface wird von Diensten implementiert, die eine dauerhafte Verbindung zwischen einem HTTP-Client und einem HTTP-Server aufrechterhalten wollen. Diese Verbindung wird über mehrere Anfragen und Antworten hinweg aufrechterhalten. Das folgende Beispiel stellt das Setzen und die Speicherung der Werte der Sitzung dar.
// Erhalten des Session-Objekts. Eine HttpSession-Implementierung stellt den Server-Aspekt bezüglich der Session dar. Ein Server betrachtet eine Sitzung solange als neu, bis ein Client an der Session teilnimmt. Solange sich kein Client bei einer Session angemeldet hat, liefert die isNew-Methode den Wert true. Der Wert true ist daher wie folgt zu verstehen:
Die Verarbeitung einer Sitzung ist eine Aufgabe des Programmierers. Der folgende Code leitet den Client zu einer neuen Adresse um, falls die Sitzung neu ist: response.sendRedirect(URLderNeuenSeite); } Der Wert URLderNeueSeite bezeichnet hierbei die neue Adresse, zu der der Client automatisch umgeleitet wird, falls die Sitzung neu ist. Zu den Methoden des Interfaces HTTPSession gehören unter anderem:
Cookies Ein Cookie ist ein Cookies [RFC 2109] sind Objekte, die Informationen beliebiger Art über den Client aufnehmen können und diese auf der lokalen Festplatte des Clients abspeichern. Wird dieselbe HTML-Seite bzw. das Servlet, für das ein Cookie-Objekt gespeichert wurde, nochmals aufgerufen, so wird das Cookie wieder an den Webserver zurückgeliefert und kann dort von einem CGI-Programm oder von einem Servlet ausgewertet werden. Durch dieses Konzept lassen sich benutzerspezifische Daten eines Clients abspeichern und beim erneuten Besuch einer Webseite wieder abrufen. Ein Cookie wird durch die Instantiierung der Klasse javax.servlet.http.Cookie erzeugt. Der Konstruktor dieser Klasse benötigt zwei Argumente, den Namen des Cookie-Objekts und dessen Wert.
public Cookie(String name, String wert) Nachdem ein Cookie-Objekt erzeugt wurde, können beliebige Parameter über die Methoden der Klasse Cookie festgelegt werden. Zu diesen Methoden gehören unter anderem:
Sind alle Eigenschaften der generierten Cookies festgelegt, so kann dieses durch Aufruf der Nachfolgende Anfragen enthalten aufgrund des erzeugten Cookie-Objekts weniger Daten. Sie enthalten dazu die Session-ID. Im Folgenden wird der Einsatz von Cookies anhand eines Beispiels verdeutlicht. Im ersten Schritt wird ein Cookie-Objekt mit dem Namen DasCookie und mit dem Wert MeineID erzeugt. Dafür wird folgender Code benötigt:
Cookie meinCookie = new Cookie("DasCookie", MeineID); Cookie-Attribute können anschließend eingefügt werden, bspw. ein Kommentar zum Cookie-Objekt bzw. das Setzen der Versionsnummer.
meinCookie.setComment("Dies ist ein Beispiel"); Das Senden des Cookie-Objekts an den Client erfolgt durch das Anhängen dieses Objekts an die Antwort.
response.addCookie(getBook); Die Variable response stellt hier die Antwort des Servlets dar. Ein Cookie-Objekt kann mit Hilfe der getCookies()-Methode gelesen werden. Da im Voraus nicht bekannt ist, wie viele Cookies die Anfrage beinhaltet, muss hier ein Array verwendet werden.
Cookie[] cookies = request.getCookies(); Werte von Cookies werden mit Hilfe der Methoden der Klasse Cookie gelesen. Das oben erzeugte Cookie-Objekt wird zunächst gesucht und gelöscht. Das Löschen eines Cookies erfolgt durch das Setzen seiner maximalen Lebensdauer auf den Wert 0.
for(i=0; i < cookies.length; i++) { Cookie thisCookie = cookie[i]; // Loesche das Cookie-Objekt } } |
|
|