Servlet – Evento y Oyente

El término “ evento ” se refiere a la ocurrencia de algo. Un evento ocurre cuando cambia el estado de un objeto. Cuando ocurren estas excepciones, podemos realizar ciertas acciones cruciales, como recopilar usuarios registrados totales y actuales, establecer tablas de base de datos al implementar el proyecto, crear objetos de conexión de base de datos, etc. Los paquetes javax.servlet y javax.servlet.http contienen numerosas clases de eventos e interfaces de escucha.

La función principal de un Listener en una aplicación de GUI es concentrar un evento de un componente de GUI específico, manejarlo usando funciones de Listener y proporcionar la respuesta a la aplicación de GUI. La siguiente técnica se conoce como manejo de eventos o modelo de delegación de eventos en aplicaciones GUI.

Categorías de eventos

Los eventos de servlet se dividen en dos categorías: de alto nivel y de bajo nivel.

  1. Evento de nivel de contexto de servlet (nivel de aplicación) : este evento se refiere a los recursos o estados que se encuentran en la extensión del objeto de contexto de servlet del dispositivo.
  2. Evento a nivel de sesión : involucra recursos o estados asociados con una secuencia de requests de una sola sesión de usuario; en otras palabras, está asociado con el objeto de sesión HTTP.

Hay dos tipos de eventos en cada uno de esos dos niveles:

  1. Cambios en el ciclo de vida
  2. Cambios en los atributos

Para cada una de las cuatro categorías de eventos, podemos definir una o más clases de detectores de eventos. Varias categorías de eventos pueden ser monitoreadas por una sola clase de escucha. Implementar una interfaz o interfaces desde el paquete javax.servlet o el paquete javax.servlet.http es una forma común de crear una clase de ocasión.

Interfaces de escucha de eventos

Interfaz de escucha 

Descripción

javax.servlet.AsyncListener Agente de escucha que recibirá una alerta si una acción asíncrona iniciada en una ServletRequest a la que se adjuntó el agente de escucha se completó, se agotó el tiempo de espera o falló.
javax.servlet.ServletContextListener Interfaz para recibir eventos de notificación de cambio de ciclo de vida de ServletContext.
javax.servlet.ServletContextAttributeListener  Interfaz para recibir eventos de notificación de cambios de atributos de ServletContext.
javax.servlet.ServletRequestListener  Interfaz para recibir notificaciones sobre requests que ingresan y salen del alcance de una aplicación web.
javax.servlet.ServletRequestAttributeListener   Interfaz para recibir eventos de notificación de cambios de atributos de ServletRequest.
javax.servlet.http.HttpSessionListener  Interfaz para recibir eventos de notificación de cambios en el ciclo de vida de HttpSession.
javax.servlet.http.HttpSessionBindingListener  Cuando un objeto está vinculado o liberado de una sesión, javax.servlet.http.HttpSessionBindingListener lo alerta.
javax.servlet.http.HttpSessionAttributeListener  Interfaz para recibir eventos de notificación de cambio de atributo HttpSession.
javax.servlet.http.HttpSessionActivationListener Objetos que están conectados a javax.servlet.http.HttpSessionActivationListener

Pasos para usar oyentes

Si queremos utilizar oyentes oyentes en nuestras aplicaciones web, debemos seguir los pasos a continuación:

Paso 1: prepara la clase Listener.

Tome una clase definida por el usuario, que debe ser una clase de implementación de interfaz de escucha. Por ejemplo, considere que MyListener implementa la clase pública Listener{……}

Paso 2: en el archivo web.xml, configure la clase Listener.

Las siguientes etiquetas XML deben usarse en el archivo web.xml para configurar la clase Listener:

<web-app>

 ……

<listener>
   <listener-class>Name of the Listener class</listener-class>
</listener>

 ……

</web-app>

A excepción de HttpSessionBindingListener y HttpSessionActivationListener, todos los agentes de escucha requieren la configuración de agente de escucha antes mencionada.

Métodos para detectores de eventos y clases relacionadas

1) Métodos para ServletContextListeners y la clase ServletContextEvent

Los siguientes métodos están definidos por ServletContextListener:

Métodos

Descripción

void contextInitialized(ServletContextEvent sce) Esta función se usa para informar al oyente que se ha formado el contexto del servlet y que la aplicación ahora está lista para manejar requests.
void contextDestroyed(ServletContextEvent sce) Esta función se usa para alertar al oyente que el programa está a punto de finalizar.

Cuando se implementa una aplicación web en el servidor, se informa el ServletContextEvent. Incluye la técnica que se muestra a continuación, que su oyente podría llamar:

ServletContext getServletContext(): este método recupera el objeto de contexto del servlet que se creó o se va a eliminar, del cual puede obtener la información que desee.

2) Métodos para ServletContextAttributeListener y la clase ServletContextAttributeEvent

ServletContextAttributeListener especifica los siguientes métodos:

Métodos

Descripción

atributo vacío Agregado (ServletContextAttributeEvent scae): Se usa para informar al oyente que el contexto del servlet se ha actualizado con un atributo.
atributo vacío Eliminado (ServletContextAttributeEvent scae): Se utiliza para informar al oyente que se ha eliminado un atributo del contexto del servlet.
atributo vacío Reemplazado (ServletContextAttributeEvent scae) Se utiliza para informar al oyente cuando se ha reemplazado un atributo en el contexto del servlet.

La clase de evento ServletContextAttributeEvent se utiliza para notificar cambios en los atributos del contexto de servlet de una aplicación web. Incluye las técnicas enumeradas a continuación, que su oyente puede usar:

  1. String getName() devuelve el nombre del atributo que se agregó, eliminó o reemplazó como una string.
  2. Object getValue() es un método para recuperar el valor de un atributo que se ha agregado, eliminado o reemplazado. Este método devuelve el valor anterior, no el valor nuevo, en caso de que se reemplace un atributo.

3) Métodos para HttpSessionListeners y la clase HttpSessionEvent

HttpSessionListener especifica los siguientes métodos:

Métodos

Descripción

sesión vacía creada (HttpSessionEvent hse) Se utiliza para informar al oyente que se ha establecido una sesión.
sesión vacía destruida (HttpSessionEvent hse): Se utiliza para que el oyente sepa que se ha terminado una sesión.

Cuando se modifica el objeto de sesión, se informa HttpSessionEvent. Incluye la técnica que se muestra a continuación, que su oyente podría llamar:

HttpSession getSession() : esta función se utiliza para obtener el objeto de sesión generado o eliminado.

4) Métodos para HttpSessionAttributeListener y la clase HttpSessionBindingEvent

HttpSessionAttributeListener especifica los siguientes métodos:

Métodos

Descripción

atributo vacío Agregado (HttpSessionBindingEvent hsbe) Informa al oyente que se ha introducido un nuevo atributo en la sesión.
atributo vacío Eliminado (HttpSessionBindingEvent hsbe) Se utiliza para informar al oyente cuando se ha eliminado un atributo de sesión.
atributo vacío Reemplazado (HttpSessionBindingEvent hsbe) Se utiliza para informar al oyente cuando se ha reemplazado un atributo en la sesión.

Cuando un objeto implementa HttpSessionBindingListener está vinculado o liberado de una sesión, HttpSessionBindingEvent se entrega a ese objeto o a un HttpSessionAttributeListener que se ha establecido en el descriptor de implementación cuando cualquier atributo está vinculado, desvinculado o reemplazado en una sesión. Incluye las técnicas enumeradas a continuación, que su oyente puede usar:

  1. String getName(): devuelve el nombre del atributo que se agregó, eliminó o reemplazó como una string.
  2. Object getValue(): es un método para recuperar el valor de un atributo que se ha agregado, eliminado o reemplazado. Este método devuelve el valor anterior, no el valor nuevo, en caso de que se reemplace un atributo.
  3. HttpSession getSession(): Este método se utiliza para obtener el objeto de sesión cuyo atributo ha cambiado.

Ejemplo

Para demostrar el detector de servlet en acción, creemos una aplicación web básica. En Eclipse, construiremos un proyecto web dinámico llamado ServletListenerExample, y las estructuras del proyecto se verán así.

Los parámetros de inicio de contexto y la configuración del oyente se definirán en web.xml. La clase para la conectividad de la base de datos es DatabaseManager. El objeto se agregará al contexto del servlet como un atributo. Me ocuparé de la sesión, las características y otras cosas en MyServlet. Usaremos AppContextListener para leer los parámetros de inicio del contexto del servlet y los usaremos para crear el objeto DatabaseManager, que luego estableceremos como un atributo en el objeto ServletContext. ServletContextAttributeListener es una implementación simple para registrar el evento cuando se agrega, elimina o reemplaza un atributo en el contexto del servlet. HttpSessionListener es una implementación simple para registrar el evento cuando se crea o destruye la sesión. ServletRequestListener es para registrar la dirección IP de servletRequest cuando la solicitud se inicializa y se destruye.

web.xml

XML

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <display-name>ServletListenersGfg</display-name>
    
  <context-param>
    <param-name>DBUSER</param-name>
    <param-value>root</param-value>
  </context-param>
  <context-param>
    <param-name>DBPWD</param-name>
    <param-value>root</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.geeksforgeeks.listener.AppContextListener</listener-class>
  </listener>
  <listener>
    <listener-class>com.geeksforgeeks.listener.AppContextAttributeListener</listener-class>
  </listener>
  <listener>
    <listener-class>com.geeksforgeeks.listener.MySessionListener</listener-class>
  </listener>
  <listener>
    <listener-class>com.geeksforgeeks.listener.MyServletRequestListener</listener-class>
  </listener>
</web-app>

DatabaseManager.java

Java

package com.geeksforgeeks.db;
  
import java.sql.Connection;
  
public class DatabaseManager {
    private String dbURL;
    private String user;
    private String password;
    private Connection con;
  
    public DatabaseManager(String url, String u, String p)
    {
        this.dbURL = url;
        this.user = u;
        this.password = p;
        // create db connection now
    }
  
    public Connection getConnection() { return this.con; }
  
    public void closeConnection()
    {
        // close DB connection here
    }
}

AppContextAttributeListener.java

Java

package com.geeksforgeeks.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()
            + "}");
    }
}

AppContextListener.java

Java

package com.geeksforgeeks.listener;
  
import com.geeksforgeeks.db.*;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
  
@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");
  
        // create database connection
        // from init parameters
        // and set it to context
        DatabaseManager dbManager
            = new DatabaseManager(url, u, p);
        ctx.setAttribute("DBManager", dbManager);
        System.out.println(
            "Database connection initialized for Application.");
    }
    public void contextDestroyed(
        ServletContextEvent servletContextEvent)
    {
        ServletContext ctx
            = servletContextEvent.getServletContext();
        DatabaseManager dbManager
            = (DatabaseManager)ctx.getAttribute(
                "DBManager");
        dbManager.closeConnection();
        System.out.println(
            "Database connection closed for Application.");
    }
}

MiServletRequestListener.java

Java

package com.geeksforgeeks.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());
    }
}

MiSessionListener.java

Java

package com.geeksforgeeks.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());
    }
}

MiServlet.java

Java

package com.geeksforgeeks.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", "GeeksForGeeks");
        String user = (String)ctx.getAttribute("User");
        ctx.removeAttribute("User");
  
        HttpSession session = request.getSession();
        session.invalidate();
  
        PrintWriter out = response.getWriter();
        out.write("Hi " + user);
    }
}

Producción:

Cuando implementamos nuestra aplicación y accedemos a MyServlet, el archivo de registro del servidor incluirá los siguientes registros.

Output

En el navegador, veremos algo como esto.

Output

Publicación traducida automáticamente

Artículo escrito por sanketnagare y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *