HDM Stuttgart, Uwe Schulz Aufgabensammlung Interaktive Medien 2 – 2006 Bitte lösen Sie die Aufgaben 4-5 in der 3. Semesterwoche (30.3. - 5. 4.2006) Aufgabe 4 doGet/doPost, HTTP Headerparameter Es wäre viel zu umständlich, für jede <html> Aufgabe ein eigenes Eclipse-Projekt zu <body> <h1>Meine IM2-Aufgaben</h1> erzeugen. Legen Sie deshalb das neue <a href="servlet/A4">Aufgabe 4 – Header Parameter</a><br> Java-Tomcat Projekt „im2“an und erstellen </body> </html> Sie im Hauptverzeichnis die nebenstehende HTML-Seite. Der Link Aufgabe 4 zeigt auf die relative URL „servlet/A4“. Damit der Link „servlet/A4“ funktioniert, ohne das das Servlet angemeldet ist, muss in der Konfigurationsdatei <tomcat-home>/conf/web.xml der Servlet-Invoker aktiviert sein (Schritt 6 in Aufgabe 1). Bevor Sie das untenstehende Servlet implementieren rufen Sie die Servlet-API Dokumentation in einem Browser auf. Falls Tomcat läuft, öffnen Sie auf der Startseite(http://localhost:8080) links unter Tomcat Documentation und dort unter Reference den Link Servle-API-Javadocs. Wenn Tomcat nicht gestartet ist, können die Seiten auch unter <tomcat-home>/webapps/tomcat-docs/servletapi/index.html geöffnet werden. Lesen Sie die Beschreibung der abstrakten Klasse HttpServlet, von der ein Servlet abgeleitet wird. Sie hat die Methoden doGet und doPost um auf die entsprechenden HTTP-Requests zu reagieren. Damit Servlets sowohl mit GET als auch mit POST gleich funktionieren, schreibt man eine doGet Methode, die doPost aufruft (oder umgekehrt): import import import import java.io.*; java.util.*; javax.servlet.*; javax.servlet.http.*; public class A4 extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request, response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><head>"); out.println("<title>Aufgabe 4</title></head><body>"); out.println("<h2>IM2 - Aufgabe 4</h2>"); out.println("<p>Today is "+ new Date()); Enumeration headers=request.getHeaderNames(); while(headers.hasMoreElements()){ String name=(String)headers.nextElement(); out.println("<p><b>"+name+"</b>: "+ request.getHeader(name)); } out.println("</body></html>"); } } Um dieses Servlet zu implementieren, fügen Sie die neue Klasse A4 zum Verzeichnis WEB-INF/src im TomcatProjekt „im2“ hinzu. Beim Abspeichern wird es automatisch übersetzt und neu geladen. Schlagen Sie alle verwendeten Klassen und Methoden nach! 6 HDM Stuttgart, Uwe Schulz Aufgabe 5 Aufgabensammlung Interaktive Medien 2 – 2006 Dateien binär und formatiert lesen und schreiben Das klassische Beispiel für eine dynamische Webseite, die sich einen Zustand auf dem Server merkt ist der Zähler, wie oft eine Seite gerufen wurde: mport java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class A5 extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request, response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><head><title>Aufgabe 5</title></head><body>"); out.println ("<h2>IM2 - Aufgabe 5: Zähler</h2>"); out.println("<p>Sie sind der "+zaehlen(response)+". Besucher auf dieser Seite!"); out.println("</body></html>"); } /** * Inkrementiert Zaehler in Datei zaehler.dat und gibt neuen Wert zurück */ private int zaehlen(HttpServletResponse response)throws IOException{ int n=0; File f = new File("zaehler.dat"); try{ if(f.canRead()){ FileReader r = new FileReader(f); n=r.read(); r.close(); } FileWriter w = new FileWriter(f); n++; w.write(n); w.close(); }catch(Exception e){response.sendError(500,"I/O Fehler:\n"+e);} return n; } } Fügen Sie die Klasse A5 zum Verzeichnis WEB-INF/src hinzu und ergänzen Sie index.html um einen Link zu diesem Servlet. Suchen Sie nach der Datei zaehler.dat um festzustellen, wo sie angelegt wird. Eventuell müssen Sie einen absoluten Pfadnamen als Dateinamen angeben. Provozieren Sie einen I/O Fehler indem Sie die Datei auf ein nicht existierendes Verzeichnis legen (z.B. als Dateinamen x/x/x angeben). Die Datei zaehler.dat ist eine Binärdatei, sie enthält keinen Text. Schauen Sie sie mit einem Editor an, um das zu verifizieren. Ändern Sie Ihr Programm so um, dass es die Textdatei zaehler.txt benutzt. Verwenden Sie dazu einen LineNumberReader, der im Konstruktor den FileReader als Parameter erhält bzw. einen PrintWriter für die Ausgabe. Die Methode readLine liest die erste Zeile der Datei, das Ergebnis ist ein String, der mit Integer.parseInt in eine Zahl umgewandelt werden muss. PrintWriter biete die altbekannte Methode println. Schlagen Sie alle verwendeten Klassen und Methoden nach! 7