Inhalt Abbildung PDF Source SCWCD
 |<    <     >    >|  Generated by CoCoDiL

5.4 Listener

Describe the Web container life cycle event model for requests, sessions, and web applications; create and configure listener classes for each scope life cycle; create and configure scope attribute listener classes; and given a scenario, identify the proper attribute listener to use.

5.4.1 Überblick der Listener Klassen

Instanzen von Listener Klassen beobachten Objekte. Wenn sich am Status dieser Objekte etwas ändert werden Events ausgelöst. Listener können auf diese Events reagieren.

Es können Listener Klassen definiert werden, die den ServletContext, eine Session, bzw. ein Request beobachten. Es werden Events ausgelöst wenn Attribute hinzugefügt, gelöscht oder geändert werden, bzw. wenn einer der Scopes initialisiert bzw zerstört wird bzw. eine Session migriert (bei verteilten Anwendungen kann die Session von einer JVM zu einer anderen verlagert werden).

ScopeEventListener InterfaceEvent Klasse
Servlet ContextInitialisierung und ZerstörungServletContextListenerServletContextEvent
Änderungen an AttributenSevletContextAttributeListenerServletContextAttributeEvent
HttpSessionErzeugung und ZerstörungHttpSessionListenerHttpSessionEvent
Änderungen an AttributenHttpSessionAttributeListenerHttpSessionBindingEvent
Servlet RequestInitialisierung und ZerstörungServletRequestListenerServletRequestEvent
Änderungen an AttributenServletRequestAttribute ListenerServletRequestAttributeEvent

Zusätzlich gibt es noch die Listener HttpSessionActivationListener und HttpSessionBindingListener, die nicht die Session selbst sondern die Attribute innerhalb einer Session beobachten.

ScopeEventListener InterfaceEvent Klasse
Session - AttributMigration (Aktivierung und Deaktivierung)HttpSessionActivationListenerHttpSessionEvent
Hinzufügen oder Entfernen zu einer SessionHttpSessionBindingListenerHttpSessionBindingEvent

5.4.2 Listener die den Lebenzyklus eines Scopes beobachten

ServletContextListener

Direkt nachdem ein ServletContext instantiiert wurde und bevor die dazugehhörigen Servlets und Filter geladen wurden, wird werden alle Listener, die das ServletContextListener Interface erfüllen benachrichtigt und die Methode contextInitialized(ServletContextEvent e) ausgeführt.

Wenn ein ServletContext zerstört wird, (geschieht i.a. nur beim Herunterfahren des ServletContainers) werden nachdem die ganzen Servlets und Filter innerhalb dieses ServletContext noch die Methode contextDestroyed(ServletContextEvent e) aufgerufen.

Das Interface hat folgende Methoden:

Die Eventklasse ist folgendermassen aufgebaut:

HttpSessionListener

Ein HttpSessionListener reagiert darauf wenn eine Session erzeugt, bzw beendet wurde. Das Interface hat folgende Methoden:

ServletRequestListener

Eine Anfrage wird initialisiert bevor diese den ersten Filter vor dem Servlet betritt, und wird beendet, nachdem diese den letzten Filter verlässt.

Eintrag in web.xml

Die Klassen der Listener Objekte, müssen in der Datei web.xml unter dem listener Element eingetragen sein.

Die Listener werden beim Hochfahren des Containers in der Reihenfolge registriert, in der sie in der web.xml Datei aufgelistet sind. Beim Herunterfahren wird die umgekehrte Reihenfolge der Dekleration genommen, wobei die HttpSessionListener den ServletContextListener den Vorzug gegeben wird.

Der Servlet Container instantiiert selbständig die Listener Klassen. Die Listener Klassen dürfen deshalb kein Argument im Constructor besitzen.

Beispiel: Session Counter Listener

5.4.3 Listener die Änderungen in der Attributliste ihres Scopes beobachten

Für jeden Scope gibt es Listener, die darauf reagieren, wenn ein neues Attribut in den Scope hinzugefügt wird, ein Attribut durch ein anderes Attribut ersetzt oder ein Attribut aus dem Scope gelöscht werden.

Je nach Scope heissen die Listener:

Die Interfaces besitzen die Methoden: (Ersetze "scope" durch ServletContextAttribute bzw. HttpSessionBinding oder ServletRequestAttribute)

Die "scope" AttributeEvent Objekte kennen z.B folgende Methoden

Auch verwendete Listener Klassen muessen im Deployment Descriptor web.xml bei den Listener Elemente registriert sein. Der Container instantiiert diese Klassen selbstsändig.

Vorsicht Falle

Beachte ein Listener bemerkt es nicht, wenn ein Attribut geändert wird.

Im unteren Beispiel wird kein Event getriggert, obwohl sich der Wert des Zaehlers ändert.

Im folgenden Beispiel wird ein Event getriggert. Gibt es das Attribut "Zaehler" in dem RequestScope schon, so wird die Methode attributeReplaced(e) aufgerufen; ansonsten wird die Methode attributeAdded(e) aufgerufen

5.4.4 Listener für Session Attribute

HttpSessionActivationListener

In einer verteilten Umgebung kann eine Session von einer JVM zu einer ander JVM migrieren. Die Session, die auf der alten Viruellen Maschinen läuft, wird deaktiviert. Danach wird die Session auf der neuen JVM übertragen und instantiert, und diese Session danach aktiviert.

Mit Hilfe von HttpSessionActivationListener kann der Programmierer darauf reagieren.

HttpSessionBindingListener

Der HttpSessionBindingListener unterscheidet sich von den anderen Listener Klassen. Klassen, die das HttpSessionBindingListener entsprechen, sind i.a. Attribute einer HttpSession. Die andere Listener beobachten den entsprechenden Scope. Der HttpSessionBindingListener Interface ist beobachtet das Attribut einer Session selbst.

Alle Attribute die das HttpSessionBindingListener Interface erfüllen, werden benachrichtigt, falls das Attribut an die Session gebunden, oder von der Session gelöst wird. Die Benachrichtigung findet auch statt, falls die Session migriert, und das Attribut von der "alten" Session gelöst, bzw. an die "neue" Session gebunden wird.

Nicht jedes Attribut einer Session muss das HttpSessionBindingListener Interface erfüllen, auch gibt es für den ServletRequest und ServletContextScope keine entsprechenden Interfaces

Inhalt Abbildung PDF Source SCWCD
 |<    <     >    >|  Generated by CoCoDiL