Anfrage und Antwort
In Servlets werden uns durch die Funktionen doX()
und service()
Objekte der Interfaces
HttpServletRequest
und HttpServletResponse
bereitgestellt (Übergabe als Methodenparameter). Beide
Interfaces enthalten einige Funktionen zum Abrufen und sogar zum Ändern (nur bei dem Interface HttpServletResponse
)
von Informationen. Dadurch kann z. B. der Inhaltstyp (Header Content-Type
) dynamisch gesetzt werden oder eine
Umleitung durchgeführt werden. In diesem Thema wollen wir uns mit diesen beiden Interfaces genauer beschäftigen.
Anfrage-Informationen
Ein Objekt von HttpServletRequest
ermöglicht das Abrufen verschiedener Informationen, welche zur HTTP-Anfrage
gehören. Der Abruf erfolgt über die sogenannten Zugriffsfunktionen (getX()
). Des Weiteren werden einige
Funktionen vom Interface ServletRequest
geerbt. Dort existieren auch einige solcher Zugriffsfunktionen. Die
folgende Tabelle zeigt die verschiedenen Funktionen zum Abrufen von Anfrage-Informationen:
getCharacterEncoding() | Gibt die Zeichenkodierung zurück. |
---|---|
getContentLength() | Gibt die Länge des Inhalts zurück. |
getContentType() | Gibt den Inhaltstyp zurück. |
getHeader() | Gibt den Wert des angegebenen Header-Felds zurück. |
getMethod() | Gibt die HTTP-Methode zurück. |
getLocalAddr() | Gibt die IP-Adresse des lokalen Geräts zurück. |
getLocalName() | Gibt den Hostnamen des lokalen Geräts zurück. |
getLocalPort() | Gibt den Port des lokalen Geräts zurück. |
getProtocol() | Gibt das angefragte Protokoll zurück. |
getQueryString() | Gibt die Anfrage-Zeichenkette zurück. |
getRemoteAddr() | Gibt die IP-Adresse des entfernten Geräts zurück. |
getRemoteHost() | Gibt den Hostnamen des entfernten Geräts zurück. |
getRemotePort() | Gibt den Port des entfernten Geräts zurück. |
getRequestURI() | Gibt die angefragte URI zurück. |
getServerName() | Gibt den Hostnamen des Servers zurück. |
getServerPort() | Gibt den Port des Servers zurück. |
Hier nun ein Beispiel, in welchem einige Informationen abgerufen und ausgegeben werden:
package de.hwh.bsp.anfrageinfo; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RequestServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Ausgabe als Text-Datei response.setContentType("text/plain;charset=UTF-8"); // Ausgabe durchführen PrintWriter out = response.getWriter(); out.println("lokale IP-Adresse: " + request.getLocalAddr()); out.println("lokaler Hostname: " + request.getLocalName()); out.println("lokaler Port: " + request.getLocalPort()); out.println("HTTP-Methode: " + request.getMethod()); out.println("Protokoll: " + request.getProtocol()); out.println("Query String: " + request.getQueryString()); out.println("IP-Adresse: " + request.getRemoteAddr()); out.println("Hostname: " + request.getRemoteHost()); out.println("Port: " + request.getRemotePort()); out.println("URI: " + request.getRequestURI()); out.println("Servername: " + request.getServerName()); out.println("Serverport: " + request.getServerPort()); out.close(); } }
Übrigens: Die meisten Funktionen geben null
zurück, wenn die angefragte Information (bzw. das angefragte
Header-Feld) nicht vorhanden ist.
Antwort-Informationen
Bei den Antwort-Informationen (Interface HttpServletResponse
) gibt es unterschiedliche Zugriffsfunktionen, wovon
die eine Gruppe die Informationen abrufen (getX()
) und die andere Gruppe die Informationen ändern bzw.
setzen (setX()
). Dies kommt daher, da eine HTTP-Antwort beeinflusst werden kann, wovon die HTTP-Anfrage
vom Client kommt und nicht verändert werden kann. Auch hier haben wir eine Tabelle mit den unterschiedlichen Funktionen zum
Abrufen und Setzen von Informationen zusammengestellt:
getCharacterEncoding() | Gibt die Zeichenkodierung zurück bzw. setzt diese. |
---|---|
setCharacterEncoding() | |
setContentLength() | Setzt die Länge des Inhalts. |
getContentType() | Gibt den Inhaltstyp zurück bzw. setzt diesen. |
setContentType() | |
getHeader() | Gibt den Wert des angegebenen Header-Felds zurück bzw. setzt diesen. |
setHeader() | |
getStatus() | Gibt den Statuscode zurück bzw. setzt diesen. |
setStatus() | |
getWriter() | Gibt den Stream für das Senden des Antwort-Inhalts zurück. |
sendError() | Sendet eine Fehlermeldung (HTTP-Fehler) an den Client zurück. |
sendRedirect() | Sendet eine Umleitung an den Client zurück. |
In diesem und in den 2 vorherigen Beispielen haben wir ja bereits die Funktion setContentType()
zum Setzen des
„Inhaltstyps“ und getWriter()
zum Abruf des ausgehenden Streams benutzt. Diese Funktionen werden wir auch in
diesem und in den folgenden Beispielen verwenden. Zusätzlich rufen wir in diesem Beispiel einige Informationen aus der
HttpServletResponse
ab und geben diese aus:
package de.hwh.bsp.antwortinfo; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ResponseServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Ausgabe als Text-Datei response.setContentType("text/plain;charset=UTF-8"); // Ausgabe durchführen PrintWriter out = response.getWriter(); out.println("Zeichenkodierung: " + response.getCharacterEncoding()); out.println("Inhalts-Typ: " + response.getContentType()); out.println("Puffer-Größe: " + response.getBufferSize()); out.println("HTTP-Status-Code: " + response.getStatus()); out.close(); } }