$KK(Das HttpServletResponse Interface) $R(Objective) Using the HttpServletResponse interface, write code to set an HTTP response header, set the content type of the response, acquire a text stream for the response, acquire a binary stream for the response, redirect an HTTP request to another URL, or add cookies to the response. $R\ Hier die Methoden des Interface, die für dieses Objective interessant sind $S() public interface ServletResponse { public PrintWriter getWriter() throws IOException; public ServletOutputStream getOutputStream() throws IOException; public void setContentType(String type); ... } $S\ $S() public interface HttpServletResponse extends ServletResponse{ public void addCookie(Cookie cookie); public boolean containsHeader(String name); public void addHeader(String name, String value); public void setHeader(String name, String value); public void addDateHeader(String name, long date); public void setDateHeader(String name, long date); public void addIntHeader(String name, int value); public void setIntHeader(String name, int value); public void sendRedirect(String location) throws IOException; ... } $S\ $KKK(Setzen der Headers) * public boolean containsHeader(String name); Überprüft ob ein Header mit dem Parameter name gesetzt ist. * public void setHeader(String name, String value); * public void setDateHeader(String name, long date); * public void setIntHeader(String name, int value); Diese Methoden setzen einen Header. Existieren schon Header mit denselben Namen, werden diese überschrieben. * public void addHeader(String name, String value); * public void addDateHeader(String name, long date); * public void addIntHeader(String name, int value); Diese Methoden setzen einen Header, überschreiben aber nicht existierende. Sie werden benutzt um Header mit mehreren Werten zu erzeugen. $KKK(Textuelle und Binäre Ausgabe) * setContentType(String) Mit setContentType wird mitgeteilt welche Art von Daten übertragen werden, und wie sie zu bearbeiten sind, entsprechend der MIME Typs Beispiele: $S() setContentType("text/html"); // Default Einstellung setContentType("text/plain"); setContentType("text/xml"); setContentType("application/jar"); $S\ setContentType(String) sollte am Anfang einer Ausgabe stehen. * public PrintWriter getWriter() throws IOException; Diese Methode wird für Ausgaben mit ASCII Texten benutzt. Beispiel: $S() import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class KinoServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { resp.setContentType("text/html"); // Ausgabe ist als Html File zu interpretieren PrintWriter out = resp.getWriter(); out.println(""); out.println("Der Schuh des Manitu"); ... } } $S\ Achtung: Man kann nicht dies nicht mit einem OutputStream vermischen * public ServletOutputStream getOutputStream() throws IOException; Diese Methode wird verwendet um Binärdaten auszugeben. Auch hier ein Beispiel: $S() public void doGet( HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("application/jar"); File f = new File("test.jar"); byte[] bytearray = new byte[(int) f.length()]; FileInputStream is = new FileInputStream(f); is.read(bytearray); OutputStream os = res.getOutputStream(); os.write(bytearray); os.flush(); } $S\ Der Aufruf von flush committed die Ausgabe, danach kann nichts mehr ausgegeben werden. getOutputStream und getWriter können nicht gemeinsam benutzt werden. $KKK(Umleitung einer Http Umfrage an eine andere URL) * public void sendRedirect(String location) throws IOException; Mit dieser Methode kann eine Anfrage an eine andere URL umgeleitet werden. Location kann auch eine relative Adresse sein. Beginnt diese Adresse mit einem Slash /, so wird location an die URL des Servlet Containers angehängt. Beginnt diese nicht mit einem Slash so wird die Adresse relativ zur URL des aktuellen Servlets angenommen. Die Methode sendRedirect ist nicht transparent für den Browser. D.h der Browser wird aufgefordert die neue URL zu laden. Vorhergehende Ausgabenanweisungen werden ignoriert. Der Versuch nach einer Ausgabe die schon committed ist (mit flush), die URL umzuleiten führt zu einer IllegalStateException $KKK(Setzen der Cookies) Cookies wurden schon in der vorherigen Objective eingeführt. Das Setzen eines Cookies auf die Festplatte des Clienten funktioniert mit der Methode * public void addCookie(Cookie cookie); Um mehrere Cookies zu setzen wird die Methode einfach mehrmals aufgerufen