Inhalt | Abbildung | Source | SCWCD | |||
|< | < | > | >| | Generated by CoCoDiL |
Innerhalb von Web-Applikationen kommunizieren verschiedene Servlets miteinander. Sie benötigen dazu einen gemeinsamen Bereich, mit dem sie Daten lesen bzw. austauschen können. Die Servlet Spezifikation definiert dazu 3 verschiededen Scopes, die es erlauben Attribute zu speichern und zu lesen.
Ihre Interfaces sind jeweils identisch, die Scopes unterscheiden sich lediglich in der Lebensdauer.
request | Gültig für eine einzige Anfrage (i.a. an ein Servlet). Ein Servlet kann mittels RequestDispatcher die Anfrage an mehreren anderen Servlets weiterleiten. Dann sind die Attribute, die in dem request gespeichert werden, auch in diesen anderen Servlets sichtbar. Wurde eine Anfrage abgearbeitet, so verliert man den Zugriff auf diese Attribute |
session | Eine Session wird von einem einzigen Anwender in einem Browser angestossen, und ist solange gültig bis sich der Anwender explizit abmeldet, oder der Servlet Container die Session von sich aus beendet hat (z.B. falls lange keine Interaktion in dieser Session gemacht wurde). I.a. geht eine Session von einem einzigen Browser aus, es sei denn der Anwender öffnet aus diesem Browser aus einen 2. Fenster. (Wenn der Anwender dann noch Cookies verbietet funktioniert das Session Management nicht mehr) |
context | Die Servlets einer Webapplikation teilen sich alle einen gemeinsamen ServletContext. Alle Anfragen aller Anwender dieser Webapplikationen können auf die Attribute des ServletContext zugreifen |
Die folgende Tabelle zeigt, wie der Programmierer die verschiedenen Scopes erreicht.
request | Hier sind die Attribute an ein (Http)ServletRequest Instanz gebunden, die in der doService() Methode eines HttpServlets als Parameter mitgegeben wird |
session | Von einer Instanz einer HttpServletRequest aus, bekommt man die aktuelle HttpSession durch die Methode getSession() bzw. getSession(true) |
context | Zu dem Context eines Servlets gelangt man vom HttpServlet aus, durch die Methode getServletContext() |
Das Interface um Attribute zu speichern, lesen und löschen sind für alle scopes identisch.
Für die Attributnamen gibt es Konventionen:
Ein WebServer wird i.a. paralell mit Anfragen bombadiert. Dabei kann es zu Problemen kommen, wenn ein Thread ein Attribut ändert, das gerade ein anderer Thread in Bearbeitung hat.
Da ein Benutzer i.a. nicht hunderte von Browser geöffnet hat, ergibt sich dadurch aus Sicht der Performance keinen Flaschenhals.
Bei grösseren Anwendungen sind die Servlets auf mehreren Rechnern verteilt. So kann z.B. ein ServletContainer auf mehreren Maschinen mit verschiedenen Java Virtuellen Maschinen (JVM) arbeiten. Dies hat folgende Vorteile
Verteilte Anwendungen sind alles andere als trivial und wirken sich auf die Programmierung aus. D.h. Eine Applikation entwickelt für eine Maschine mit einer JVM kann nicht ohne groesseren Aufwand umkonfiguriert werden, so dass sie auf mehreren Maschinen läuft
Verhalten von Servlet Context
Für jede Webapplikation gibt es pro virtuelle Maschine genau einen ServletContext. In einer verteilten Anwendung, gibt es aber i.a. mehrerer JVM und deshalb mehrere ServletContexte pro Webapplikation.
Verhalten von Http Session
Eine Session kann zu einem Zeitpunkt immer auf genau einer JVM laufen. Allerdings ist es erlaubt eine Session von einer JVM zu einer anderen zu migrieren.
Inhalt | Abbildung | Source | SCWCD | |||
|< | < | > | >| | Generated by CoCoDiL |