17.11 Das HttpServletResponse-Objekt
Über das implizite Objekt response lassen sich Antworten von der JSP-Seite an den Client formulieren.
17.11.1 Automatisches Neuladen
Das Setzen von Content-Type ist für nahezu alle Servlets unabdingbar. Daneben gibt es aber noch weitere, die beispielsweise für Cookies interessant sind. Ein spezieller Header kann auch das Caching beeinflussen (mit dem Datum der letzten Modifizierung) oder die Seite nach einer bestimmten Zeit neu laden. Letzteres wollen wir verwenden, um eine einfache Ausgabe zu erzeugen, die jede Sekunde neu geladen wird. (Die Seite darf jedoch nicht im Cache liegen. Um das Caching explizit auszuschalten, sollte Pragma: no-cache gesetzt werden. Bei einer lokalen Installation spielt dies aber keine Rolle. Wir verschieben die Diskussion daher in das Kapitel über die unterschiedlichen Header.)
Listing 17.10 neuladen.jsp
<%! private String result = "*"; %>
<% response.setHeader( "Refresh", "1" ); %>
<%= result += "*" %>
Dieses Servlet erzeugt eine Reihe von Sternchen, wobei es sich die Zeichenkette jede Sekunde neu vom Server holt.
Das dargestellte Programm zeigt in einfacher Weise auf, was sich noch wesentlich komplexer mit Threads machen lässt. Im Hintergrund hätten wir einen Thread starten können, der immer eine neue Berechnung macht, die dann in der println()-Zeile hätte ausgegeben werden können.
17.11.2 Seiten umlenken
Ist eine Seite nicht mehr korrekt, so kann sie umgelenkt werden. Hierfür wird ein spezieller Header gesetzt. Dazu dient die Methode sendRedirect(String), die auf eine neue Seite verweist. Als Parameter kann eine relative oder absolute URL aufgeführt werden, die auf eine temporäre neue Seite weist. Wir könnten auch mit setHeader() arbeiten, aber dann müssten wir auch von Hand den Statuscode ändern, der für Umleitungen auf 302 gesetzt sein muss.1 Die Arbeit können wir uns sparen. Nach dem Setzen der Umleitung sollte nicht mehr in die Ausgabe geschrieben werden.
Wozu kann nun diese Umleitung eingesetzt werden? Zum Beispiel, um über Formular-Parameter zu externen Seiten weiterzuleiten:
response.sendRedirect( url );
Nach der Umleitung steht der Ort der neuen Seite in der URL-Zeile des Browsers. Das folgende Programm verweist nun einfach auf ein anderes Servlet. Die Pfadangabe kann absolut oder relativ sein.
Listing 17.11 redirect.jsp
<%
String url = ">http://java-tutor.com/";
response.sendRedirect( url );
%>
Was passiert beim Umlenken?
Technisch gesehen ist eine Umlenkseite eine ganz normale Web-Seite. Das wirkliche Umlenken ist eine Fähigkeit des Browsers und nicht des Servers. Dies ist wichtig zu bemerken, da eigene Programme, die URL-Verweise aufbauen, dieses oft nicht korrekt behandeln.
Das Servlet setzt beim sendRedirect() den Content-Type auf "text/html". Wichtig sind zwei weitere Informationen: eine in der Statuszeile und eine im Header. In der Statuszeile wird die Nummer 302 gesendet, die das Umlenken bezeichnet. Die Information darüber, wohin verwiesen wird, steht in einem weiteren Header mit dem Namen »Location«. Somit können wir unser Redirect prinzipiell auch selber ausformulieren, indem wir schreiben:
response.setStatus( 302 );
response.setContentType( "text/html" );
response.setHeader( "Location", url );
Der String s ist dann eine Referenz auf die neue Seite. Der Verweis auf die externe Seite muss dann natürlich absolut sein. Doch dies regelt sendRedirect() automatisch.
1 Der Apache-Server schreibt bei einer Umleitung automatisch den korrekten Header.
|