Open In App

Servlet – Event and Listener

Improve
Improve
Like Article
Like
Save
Share
Report

The term “event” refers to the occurrence of something. An event occurs when the state of an object changes. When these exceptions occur, we can conduct certain crucial actions, such as collecting total and current logged-in users, establishing database tables when deploying the project, building database connection objects, and so on. The javax.servlet and javax.servlet.http packages contain numerous Event classes and Listener interfaces.

The primary function of a Listener in a GUI application is to concentrate an event from a specific GUI component, handle it using Listener functions, and provide the response to the GUI application. The following technique is referred to as Event Handling or Event Delegation Model in GUI applications.

Event Categories

Servlet events are divided into two categories: high-level and low-level.

  1. Servlet context-level (application-level) event: This event concerns resources or states held at the appliance servlet context object’s extent.
  2. Session-level event: It involves resources or states associated with a sequence of requests from a single user session; in other words, it is associated with the HTTP session object.

There are two types of events on each of those two levels:

  1. Changes in the life cycle
  2. Changes in attributes

For each of the four-event categories, we can define one or more event listener classes. Multiple event categories can be monitored by a single listener class. Implementing an interface or interfaces from the javax.servlet package or javax.servlet.http package is a common way to make an occasion class.

Event Listener Interfaces

Listener Interface 

Description

javax.servlet.AsyncListener Listener that will be alerted if an asynchronous action started on a ServletRequest to which the listener was attached has completed, timed out, or failed.
javax.servlet.ServletContextListener Interface for receiving ServletContext lifecycle change notification events.
javax.servlet.ServletContextAttributeListener  Interface for receiving ServletContext attribute changes notification events.
javax.servlet.ServletRequestListener  Interface for receiving notifications about requests entering and exiting a web application’s scope.
javax.servlet.ServletRequestAttributeListener   Interface for receiving ServletRequest attribute changes notification events.
javax.servlet.http.HttpSessionListener  Interface for receiving HttpSession lifecycle changes notification events.
javax.servlet.http.HttpSessionBindingListener  When an object is tied to or freed from a session, it is alerted by javax.servlet.http.HttpSessionBindingListener.
javax.servlet.http.HttpSessionAttributeListener  Interface for receiving HttpSession attribute change notification events.
javax.servlet.http.HttpSessionActivationListener Objects that are connected to a javax.servlet.http.HttpSessionActivationListener

Steps for Using Listeners

If we want to utilize listener listeners in our web apps, we must follow the steps below:

Step 1: Get the Listener class ready.

Take one user-defined class, which must be a Listener interface implementation class. For instance, consider the public class Listener is implemented by MyListener{……}

Step 2: In the web.xml file, configure the Listener class.

The following XML tags must be used in the web.xml file to configure the Listener class:

<web-app>

 ……

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

 ……

</web-app>

Except for HttpSessionBindingListener and HttpSessionActivationListener, all Listeners require the aforementioned listener configuration.

Methods for Event Listeners and Related Classes

1) Methods for ServletContextListeners and the ServletContextEvent Class

The following methods are defined by ServletContextListener:

Methods

Description

void contextInitialized(ServletContextEvent sce) This function is used to inform the listener that the servlet context has been formed and that the application is now ready to handle requests.
void contextDestroyed(ServletContextEvent sce) This function is used to alert the listener that the program is about to be terminated.

When a web application is deployed on the server, the ServletContextEvent is informed. It includes the technique shown below, which your listener might call:

ServletContext getServletContext(): This method retrieves the servlet context object that was created or is going to be deleted, from which you may get any information you want.

2) Methods for ServletContextAttributeListener and the ServletContextAttributeEvent Class

ServletContextAttributeListener specifies the following methods:

Methods

Description

void attributeAdded(ServletContextAttributeEvent scae): It’s used to inform the listener that the servlet context has been updated with an attribute.
void attributeRemoved(ServletContextAttributeEvent scae): It’s used to inform the listener that an attribute from the servlet context has been deleted.
void attributeReplaced(ServletContextAttributeEvent scae) It’s used to inform the listener when an attribute in the servlet context has been replaced.

The event class ServletContextAttributeEvent is used to notify about changes to the attributes of a web application’s servlet context. It includes the techniques listed below, which your listener can use:

  1. String getName() returns the name of the attribute that was added, deleted, or replaced as a string.
  2. Object getValue() is a method for retrieving the value of an attribute that has been added, deleted, or replaced. This method returns the previous value, not the new value, in the event of a replaced attribute.

3) Methods for HttpSessionListeners and the HttpSessionEvent Class

HttpSessionListener specifies the following methods:

Methods

Description

void sessionCreated(HttpSessionEvent hse) It’s used to inform the listener that a session has been established.
void sessionDestroyed(HttpSessionEvent hse): It’s used to let the listener know that a session has been terminated.

When the session object is modified, HttpSessionEvent is informed. It includes the technique shown below, which your listener might call:

HttpSession getSession(): This function is used to obtain the generated or deleted session object.

4) Methods for HttpSessionAttributeListener and the HttpSessionBindingEvent Class

HttpSessionAttributeListener specifies the following methods:

Methods

Description

void attributeAdded(HttpSessionBindingEvent hsbe) It informs the listener that a new attribute has been introduced to the session.
void attributeRemoved(HttpSessionBindingEvent hsbe) It’s used to inform the listener when a session attribute has been deleted.
void attributeReplaced(HttpSessionBindingEvent hsbe) It’s used to inform the listener when an attribute in the session has been replaced.

When an object implements HttpSessionBindingListener is bound or freed from a session, HttpSessionBindingEvent is delivered to that object, or to a HttpSessionAttributeListener that has been set in the deployment descriptor when any attribute is bound, unbound, or replaced in a session. It includes the techniques listed below, which your listener can use:

  1. String getName(): returns the name of the attribute that was added, deleted, or replaced as a string.
  2. Object getValue(): is a method for retrieving the value of an attribute that has been added, deleted, or replaced. This method returns the previous value, not the new value, in the event of a replaced attribute.
  3. HttpSession getSession(): This method is used to obtain the session object whose attribute has changed.

Example

To demonstrate the servlet listener in action, let’s create a basic web application. In Eclipse, we’ll build a dynamic web project called ServletListenerExample, and the project structures will look like this.

The context init params and listener settings will be defined in web.xml. The class for database connectivity is DatabaseManager. The object will be added to the servlet context as an attribute. I’ll deal with the session, characteristics, and other things in MyServlet. We’ll use the AppContextListener to read the servlet context init parameters and use them to create the DatabaseManager object, which we’ll then set as an attribute on the ServletContext object. ServletContextAttributeListener is a simple implementation for logging the event when an attribute in the servlet context is added, removed, or replaced. HttpSessionListener is a simple implementation to log the event when the session is created or destroyed. ServletRequestListener is to log the servletRequest IP address when the request is initialized and destroyed.

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.");
    }
}


MyServletRequestListener.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());
    }
}


MySessionListener.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());
    }
}


MyServlet.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);
    }
}


Output:

When we deploy our application and access MyServlet, the server log file will include the following logs.

Output

In the browser, we’ll see something like this.

Output



Last Updated : 25 Feb, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads