studyklar
IProg · Skript 8 · Abschnitt 4

Daten im Servlet: Request, Session, Cookie, ServletContext

HTTP vergisst nach jeder Antwort alles. Ein Servlet braucht darum Orte, an denen Daten bleiben: für eine Anfrage, für einen Benutzer oder für alle. Rechts sieht man, wo diese Orte liegen und wie lange sie halten. Mit Weiter geht es Schritt für Schritt voran.

Worum es geht

Skript 08, Folien 22 bis 26: Übergabe von Daten, Session-Variablen, Cookies und ServletContext.

Ein Formular schickt Werte an ein Servlet. Ein Warenkorb soll über mehrere Seiten halten. Eine Einstellung soll beim nächsten Besuch noch da sein. Die Frage ist: Wo legt ein Servlet welche Daten ab, und wie kommt es wieder heran?

Drei Änderungen an den Folien: Das Formular auf Folie 22 sendet mit POST, darum steht der Code in doPost. Wer das Attribut auf Folie 22 liest, steht dort nicht; wir nehmen die Weiterleitung aus Klausur 2. Der Code auf Folie 25 lässt sich nicht übersetzen; hier steht eine korrigierte Fassung.

„Folie N“ heißt hier immer die N-te Seite der PDF-Datei. Die kleine Zahl unten auf der Folie kann davon abweichen.

So gehen wir vor:

  1. Request: Formular-Parameter lesen, Attribute weitergeben.
  2. Session: Daten für einen Benutzer setzen und lesen.
  3. Cookie: Daten im Browser setzen und lesen.
  4. ServletContext: Daten für alle Benutzer.
  5. Die vier Orte im Vergleich und eine Klausurfrage.

Formular-Parameter lesen

<form action="demoUrl" method="post">  <input type="text" name="p1" /></form>
public void doPost(HttpServletRequest request,                   HttpServletResponse response) {  String abtname = request.getParameter("p1");}

Das Formular hat ein Textfeld mit dem Namen p1. Beim Absenden schickt der Browser den eingegebenen Text unter diesem Namen an die Adresse demoUrl. Dort antwortet ein Servlet mit der Methode doPost. Das DemoServlet von Skript 08, Folie 16 hat bisher nur doGet; für das Formular bekommt es zusätzlich doPost mit der Zeile unten.

Im Servlet liest request.getParameter("p1") diesen Wert. Er ist immer ein String. Fehlt das Feld, kommt null zurück.

Das Formular sendet mit method="post". Darum steht die Zeile in doPost, nicht in doGet. Mit doGet allein antwortet der Server auf das Formular mit dem Fehler 405 („Method Not Allowed“).

Aus Klausur 3, Aufgabe 1 („Formulare senden mit GET und POST“): GET schickt die Formularwerte in der URL, POST im Datenteil der Anfrage.

Attribute im Request weitergeben

request.setAttribute("personen", pList);request.getRequestDispatcher("personen.jsp").forward(request, response);

Ein Servlet kann auch selbst Werte in den Request legen. Ein Attribut ist ein Wert unter einem Namen. setAttribute("personen", pList) legt die Personenliste unter dem Namen personen ab.

pList ist die Personenliste, etwa die aus Skript 08, Folie 16. Wozu das Attribut? Das Servlet gibt die Anfrage an eine andere Seite weiter, meist eine JSP, die das HTML erzeugt. getRequestDispatcher("personen.jsp") holt ein Objekt, das an diese Seite weitergeben kann; forward gibt Request und Response weiter. Diese Seite bekommt denselben Request und findet dort die Liste. Ist die Antwort geschickt, ist der Request weg, und mit ihm das Attribut.

Die JSP liest die Liste mit request.getAttribute("personen"), meist aber mit JSTL (siehe Klausur 2, Aufgabe 8).

Aus Klausur 2, Aufgabe 8 („JSP mit JSTL: Bewertungen als Tabelle ausgeben“): Dort legt ein Servlet die Liste mit setAttribute in den Request und ruft mit forward die Seite Ausgabe.jsp auf.
Noch 9 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1

Browser
Formular-Parametermit der Anfrage geschickt
Cookiebleibt im Browser, bis es abläuft
Server (Servlet-Container)
ServletContexteiner für die ganze Anwendung, alle Benutzer
Sessionje Benutzer, über mehrere Anfragen
Requestje Anfrage, danach weg
Legendegerade gemeintIm Browser: Formular-Parameter und Cookie. Auf dem Server ineinander: Request, Session und ServletContext.