Mit Event-Listenern erhält der Java EE Entwickler den Zugriff auf sämtliche wichtigen Ereignisse der Servlet-Technolgie. Hierzu gehören die Ereignisse des Lebensszyklus' der Objekte ServletContext
, HttpSession
sowie ServletRequest
. Diese Objekte stehen stellvertretend für den Applikationskontext, die Session eines Benutzers sowie für jeden Request, der am Server für diese Applikation eintrifft.
Jedes dieser Objekte wird zu einem bestimmten Zeitpunkt erzeugt und zu einem anderen wieder verworfen. Es gibt also zwei Lebenszyklus-Ereignisse für jedes dieser Objekttypen. Folgende Tabelle verdeutlicht alle grundlegenden Ereignisse des Lebenszyklus' der drei Objekte:
Ereignis | ServletContext | HttpSession | ServletRequest |
Erzeugen | contextInitalized |
sessionCreated |
requestInitialized |
Verwerfen | contextDestroyed |
sessionDestroyed |
requestDesdroyed |
übergebener Parameter | ServletContextEvent |
HttpSessionEvent |
ServletRequestEvent |
zu |
ServletContextListener |
HttpSessionListener |
ServletRequestListener |
Die für den jeweiligen Typ des Event-Listeners vorgesehene Schnittstelle sieht genau die Methoden mit den für diesen Listener vorgesehenen Event-Parametern vor. Schließlich muss der Listener über die Details des Ereignisses informiert werden. Die Schnittstelle ServletContextListener
sieht beispielsweise die Methoden contextInitialized
und contextDestroyed
mit jeweils einem ServletContextEvent
als Parameter vor.
Wenn also auf den Start oder das Beenden der Applikation reagiert werden muss, etwa zur Initialisierung von Objekten oder zur Freigabe von Ressourcen, so ist ein ServletContextListener zu implementieren. Denn der ServletContext ist das zentrale Objekt, dass der Servlet-Container der Applikation zur Verfügung stellt.
Ein typischer ServletContext-Listener würde also wie folgt implementiert werden:
@WebListener
public class MeinContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
//. . .
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//. . .
}
}
Damit der Servlet-Container weiß, dass es sich um einen Listener handelt, der über bestimmte Ereignisse informiert werden muss, wird der Kode mit der Annotation @WebListener
gekennzeichnet. Welche Ereignisse an den Listener gemeldet werden müssen, weiß der Servlet-Container anhand der Schnittstelle(n), welche die Klasse des Listeners implementiert.
Es ist an diesem Beispiel auch zu sehen, dass die notwendigen Informationen über das Ereignis aus dem Event-Objekt gelesen werden können, welches mit der eintreffenden Nachricht übergeben wurde. In diesem Fall ist es der ServletContextEvent, der mit der Nachricht contextInitialized übergeben wird. Der Listener kann auf den ServletContext über diesen Event zugreifen.
Ebenso sind für den Lebenszyklus der Attribut-Objekte Ereignisse vorgesehen:
Ereignis | ServletContextAttribute | HttpSessionAttribute | ServletRequestAttribute |
Erzeugen | attributeAdded |
attributeAdded |
attributeAdded |
Verändern | attributeReplaced |
attributeReplaced |
attributeReplaced |
Löschen | attributeRemoved |
attributeRemoved |
attributeRemoved |
übergebener Parameter |
ServletContextAttributeEvent |
HttpSessionAttributeEvent |
ServletRequestEvent |
zu |
ServletContextAttributeListener |
HttpSessionAttributeListener |
ServletRequestAttributeListener |
Weitere Informationen können im Java EE Tutorial oder in der Javadoc der Firma Oracle (beide in englischer Sprache) gefunden werden.