Exemple de Servlet Listener ServletContextListener

Le ServletContextListener est l’un des nombreux écouteurs de Servlet que nous avons. Cet article est le cinquième de la série sur les Applications Web Java, vous voudrez peut-être consulter les quatre articles précédents également.

  1. Applications Web Java
  2. Servlets en Java
  3. Gestion de session Servlet
  4. Filtre Servlet

Écouteur de Servlet

Dans ce tutoriel, nous examinerons les écouteurs de servlet, les avantages des écouteurs de servlet, certaines tâches courantes que nous pouvons effectuer avec les écouteurs, les interfaces d’écouteur de l’API de servlet et les objets d’événement. À la fin, nous créerons un projet web simple pour montrer un exemple d’implémentation d’écouteur couramment utilisé pour ServletContext, Session et ServletRequest.

  1. Pourquoi avons-nous des écouteurs de servlet?

  2. Interfaces d’écouteur de servlet et objets d’événement

  3. Configuration des écouteurs de servlet

  4. Exemple d’écouteur de servlet

  5. ServletContextListener

  6. ServletContextAttributeListener

  7. HttpSessionListener

  8. ServletRequestListener

  9. Pourquoi avons-nous des écouteurs Servlet?

Nous savons qu’en utilisant ServletContext, nous pouvons créer un attribut avec une portée d’application auquel tous les autres servlets peuvent accéder, mais nous ne pouvons initialiser les paramètres d’initialisation de ServletContext qu’en tant que chaîne de caractères dans le descripteur de déploiement (web.xml). Et si notre application est orientée base de données et que nous voulons définir un attribut dans ServletContext pour la connexion à la base de données. Si votre application a un seul point d’entrée (connexion utilisateur), vous pouvez le faire dans la première requête de servlet, mais si nous avons plusieurs points d’entrée, le faire partout entraînera beaucoup de redondance de code. De plus, si la base de données est en panne ou n’est pas configurée correctement, nous ne le saurons que lorsque la première requête client arrivera au serveur. Pour gérer ces scénarios, l’API servlet fournit des interfaces de Listener que nous pouvons implémenter et configurer pour écouter un événement et effectuer certaines opérations. Un événement est une occurrence de quelque chose ; dans le monde des applications Web, un événement peut être l’initialisation d’une application, la destruction d’une application, une demande du client, la création/destruction d’une session, la modification d’un attribut en session, etc. L’API des servlets fournit différents types d’interfaces de Listener que nous pouvons implémenter et configurer dans web.xml pour traiter quelque chose lorsqu’un événement particulier se produit. Par exemple, dans le scénario ci-dessus, nous pouvons créer un Listener pour l’événement de démarrage de l’application afin de lire les paramètres d’initialisation du contexte et créer une connexion de base de données, puis la définir comme attribut de contexte pour être utilisée par d’autres ressources.

  1. javax.servlet.AsyncEvent – Événement déclenché lorsqu’une opération asynchrone initiée sur un ServletRequest (via un appel à ServletRequest#startAsync ou ServletRequest#startAsync(ServletRequest, ServletResponse)) est terminée, a expiré ou a produit une erreur.
  2. javax.servlet.http.HttpSessionBindingEvent – Les événements de ce type sont envoyés à un objet qui implémente HttpSessionBindingListener lorsqu’il est lié ou délié d’une session, ou à un HttpSessionAttributeListener configuré dans le web.xml lorsqu’un attribut est lié, délié ou remplacé dans une session. La session lie l’objet par un appel à HttpSession.setAttribute et le délie par un appel à HttpSession.removeAttribute. Nous pouvons utiliser cet événement pour des activités de nettoyage lorsque l’objet est supprimé de la session.
  3. javax.servlet.http.HttpSessionEvent – Il s’agit de la classe représentant les notifications d’événements pour les changements de sessions au sein d’une application web.
  4. javax.servlet.ServletContextAttributeEvent – Classe d’événement pour les notifications sur les modifications des attributs du ServletContext d’une application web.
  5. javax.servlet.ServletContextEvent – Il s’agit de la classe d’événement pour les notifications sur les modifications du contexte de servlet d’une application web.
  6. javax.servlet.ServletRequestEvent – Les événements de ce type indiquent les événements du cycle de vie pour une ServletRequest. La source de l’événement est le ServletContext de cette application web.
  7. javax.servlet.ServletRequestAttributeEvent – Il s’agit de la classe d’événement pour les notifications de modifications des attributs de la requête de servlet dans une application.

L’API Servlet fournit les interfaces de Listener suivantes.

  1. javax.servlet.AsyncListener – Listener qui sera notifié dans le cas où une opération asynchrone initiée sur une ServletRequest à laquelle le auditeur avait été ajouté est terminée, a expiré ou a entraîné une erreur.

  2. javax.servlet.ServletContextListener – Interface pour recevoir des événements de notification sur les changements de cycle de vie de ServletContext.

  3. javax.servlet.ServletContextAttributeListener – Interface pour recevoir des événements de notification sur les changements d’attributs de ServletContext.

  4. javax.servlet.ServletRequestListener – Interface pour recevoir des événements de notification sur les requêtes entrantes et sortantes de la portée d’une application web.

  5. javax.servlet.ServletRequestAttributeListener – Interface pour recevoir des événements de notification sur les changements d’attributs de ServletRequest.

  6. javax.servlet.http.HttpSessionListener – Interface pour recevoir des événements de notification sur les changements de cycle de vie de HttpSession.

  7. javax.servlet.http.HttpSessionBindingListener – Fait en sorte qu’un objet soit notifié lorsqu’il est lié à une session ou en détaché.

  8. javax.servlet.http.HttpSessionAttributeListener – Interface pour recevoir des événements de notification sur les changements d’attributs de HttpSession.

  9. javax.servlet.http.HttpSessionActivationListener – Les objets liés à une session peuvent écouter les événements du conteneur les informant que les sessions seront passivées et que la session sera activée. Un conteneur qui migre des sessions entre des VM ou persiste des sessions doit notifier tous les attributs liés aux sessions mettant en œuvre HttpSessionActivationListener.

  10. Configuration de l’écouteur de Servlet

Nous pouvons utiliser l’annotation `@WebListener` pour déclarer une classe comme écouteur (@WebListener), cependant la classe doit implémenter un ou plusieurs des interfaces d’écouteur. Nous pouvons définir un écouteur dans web.xml comme suit:

<listener>
    <listener-class>
    com.journaldev.listener.AppContextListener
    </listener-class>
</listener>
  1. Exemple d’écouteur de servlet

Créons une application web simple pour voir l’écouteur de servlet en action. Nous allons créer un projet web dynamique dans Eclipse ServletListenerExample, dont la structure du projet ressemblera à l’image ci-dessous. web.xml: Dans le descripteur de déploiement, je vais définir quelques paramètres d’initialisation du contexte et la configuration de l’écouteur.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>ServletListenerExample</display-name>
  
  <context-param>
    <param-name>DBUSER</param-name>
    <param-value>pankaj</param-value>
  </context-param>
  <context-param>
    <param-name>DBPWD</param-name>
    <param-value>password</param-value>
  </context-param>
  <context-param>
    <param-name>DBURL</param-name>
    <param-value>jdbc:mysql://localhost/mysql_db</param-value>
  </context-param>
  
  <listener>
    <listener-class>com.journaldev.listener.AppContextListener</listener-class>
  </listener>
  <listener>
    <listener-class>com.journaldev.listener.AppContextAttributeListener</listener-class>
  </listener>
  <listener>
    <listener-class>com.journaldev.listener.MySessionListener</listener-class>
  </listener>
  <listener>
    <listener-class>com.journaldev.listener.MyServletRequestListener</listener-class>
  </listener>
</web-app>

GestionnaireDeConnexionDB: Il s’agit de la classe pour la connectivité à la base de données, pour simplifier je ne fournis pas de code pour la connexion réelle à la base de données. Nous allons définir cet objet comme attribut du contexte de servlet.

package com.journaldev.db;

import java.sql.Connection;

public class DBConnectionManager {

	private String dbURL;
	private String user;
	private String password;
	private Connection con;
	
	public DBConnectionManager(String url, String u, String p){
		this.dbURL=url;
		this.user=u;
		this.password=p;
		// créer la connexion à la base de données maintenant 
		
	}
	
	public Connection getConnection(){
		return this.con;
	}
	
	public void closeConnection(){
		// fermer la connexion à la base de données ici 
	}
}

MaServlet: Une simple classe servlet où je travaillerai avec la session, les attributs, etc.

package com.journaldev.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			ServletContext ctx = request.getServletContext();
			ctx.setAttribute("User", "Pankaj");
			String user = (String) ctx.getAttribute("User");
			ctx.removeAttribute("User");
			
			HttpSession session = request.getSession();
			session.invalidate();
			
			PrintWriter out = response.getWriter();
			out.write("Hi "+user);
	}

}

Maintenant, nous allons implémenter des classes d’écouteurs, je fournis des exemples de classes d’écouteurs couramment utilisées – ServletContextListener, ServletContextAttributeListener, ServletRequestListener et HttpSessionListener.27. ## ServletContextListener

Nous lirons les paramètres d’initialisation du contexte de servlet pour créer l’objet GestionnaireDeConnexionDB et le définir comme attribut de l’objet ServletContext.

package com.journaldev.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import com.journaldev.db.DBConnectionManager;

@WebListener
public class AppContextListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent servletContextEvent) {
    	ServletContext ctx = servletContextEvent.getServletContext();
    	
    	String url = ctx.getInitParameter("DBURL");
    	String u = ctx.getInitParameter("DBUSER");
    	String p = ctx.getInitParameter("DBPWD");
    	
    	// créer une connexion à la base de données à partir des paramètres d'initialisation et la définir sur le contexte 
    	DBConnectionManager dbManager = new DBConnectionManager(url, u, p);
    	ctx.setAttribute("DBManager", dbManager);
    	System.out.println("Database connection initialized for Application.");
    }

    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    	ServletContext ctx = servletContextEvent.getServletContext();
    	DBConnectionManager dbManager = (DBConnectionManager) ctx.getAttribute("DBManager");
    	dbManager.closeConnection();
    	System.out.println("Database connection closed for Application.");
    	
    }
	
}
  1. ServletContextAttributeListener

A simple implementation to log the event when attribute is added, removed or replaced in servlet context.

package com.journaldev.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class AppContextAttributeListener implements ServletContextAttributeListener {

    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
    	System.out.println("ServletContext attribute added::{"+servletContextAttributeEvent.getName()+","+servletContextAttributeEvent.getValue()+"}");
    }

    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
    	System.out.println("ServletContext attribute replaced::{"+servletContextAttributeEvent.getName()+","+servletContextAttributeEvent.getValue()+"}");
    }

    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
    	System.out.println("ServletContext attribute removed::{"+servletContextAttributeEvent.getName()+","+servletContextAttributeEvent.getValue()+"}");
    }
	
}
  1. HttpSessionListener

A simple implementation to log the event when session is created or destroyed.

package com.journaldev.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class MySessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent sessionEvent) {
    	System.out.println("Session Created:: ID="+sessionEvent.getSession().getId());
    }

    public void sessionDestroyed(HttpSessionEvent sessionEvent) {
    	System.out.println("Session Destroyed:: ID="+sessionEvent.getSession().getId());
    }
	
}
  1. ServletRequestListener

A simple implementation of ServletRequestListener interface to log the ServletRequest IP address when request is initialized and destroyed.

package com.journaldev.listener;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class MyServletRequestListener implements ServletRequestListener {

    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
    	ServletRequest servletRequest = servletRequestEvent.getServletRequest();
    	System.out.println("ServletRequest destroyed. Remote IP="+servletRequest.getRemoteAddr());
    }

    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
    	ServletRequest servletRequest = servletRequestEvent.getServletRequest();
    	System.out.println("ServletRequest initialized. Remote IP="+servletRequest.getRemoteAddr());
    }
	
}

À présent, lorsque nous déploierons notre application et accéderons à MyServlet dans le navigateur avec l’URL https://localhost:8080/ServletListenerExample/MyServlet, nous verrons les journaux suivants dans le fichier journal du serveur.

ServletContext attribute added::{DBManager,com.journaldev.db.DBConnectionManager@4def3d1b}
Database connection initialized for Application.
ServletContext attribute added::{org.apache.jasper.compiler.TldLocationsCache,org.apache.jasper.compiler.TldLocationsCache@1594df96}

ServletRequest initialized. Remote IP=0:0:0:0:0:0:0:1%0
ServletContext attribute added::{User,Pankaj}
ServletContext attribute removed::{User,Pankaj}
Session Created:: ID=8805E7AE4CCCF98AFD60142A6B300CD6
Session Destroyed:: ID=8805E7AE4CCCF98AFD60142A6B300CD6
ServletRequest destroyed. Remote IP=0:0:0:0:0:0:0:1%0


ServletRequest initialized. Remote IP=0:0:0:0:0:0:0:1%0
ServletContext attribute added::{User,Pankaj}
ServletContext attribute removed::{User,Pankaj}
Session Created:: ID=88A7A1388AB96F611840886012A4475F
Session Destroyed:: ID=88A7A1388AB96F611840886012A4475F
ServletRequest destroyed. Remote IP=0:0:0:0:0:0:0:1%0


Database connection closed for Application.

Remarquez la séquence des journaux et elle est dans l’ordre d’exécution. Le dernier journal apparaîtra lorsque vous arrêterez l’application ou arrêterez le conteneur.

C’est tout pour l’auditeur dans le servlet, nous examinerons ensuite les cookies et quelques exemples de servlets courants. Vous pouvez télécharger le projet à partir du lien ci-dessous et y jouer pour en savoir plus.

Télécharger l’exemple de projet de servlet écouteur

Consultez l’article suivant de la série sur Les Cookies en Servlet.

Source:
https://www.digitalocean.com/community/tutorials/servletcontextlistener-servlet-listener-example