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.
- 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.
- 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:
- Cambios en el ciclo de vida
- 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:
- String getName() devuelve el nombre del atributo que se agregó, eliminó o reemplazó como una string.
- 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:
- String getName(): devuelve el nombre del atributo que se agregó, eliminó o reemplazó como una string.
- 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.
- 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.
En el navegador, veremos algo como esto.
Publicación traducida automáticamente
Artículo escrito por sanketnagare y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA