Friday, 13 June 2014

Servlets : ServletContextAttributeListener Demo

Master Core Java & Servlets!

Subscribe to Ram N Java for beginner-friendly coding walkthroughs, web architecture lessons, and hands-on Java guides!

🔔 Subscribe to Ram N Java

What is ServletContextAttributeListener?

In Java web applications, the ServletContextAttributeListener interface (from the javax.servlet package) provides a callback mechanism to monitor changes to application-scoped attributes.

Whenever an attribute is added to, removed from, or replaced within the ServletContext (application scope), the servlet container automatically dispatches events to any registered ServletContextAttributeListener. This allows developers to audit global application state modifications, synchronize shared resources, or update cached data seamlessly.

Lifecycle Callback Methods

The ServletContextAttributeListener interface defines three essential callback methods:

  • attributeAdded(ServletContextAttributeEvent scab): Triggered when a new attribute is bound to the servlet context via servletContext.setAttribute("name", value).
  • attributeRemoved(ServletContextAttributeEvent scab): Triggered when an existing attribute is unbound using servletContext.removeAttribute("name").
  • attributeReplaced(ServletContextAttributeEvent scab): Triggered when an existing attribute value is overwritten by a new value for the same attribute name.
@WebListener
public class ContextAttributeTracker implements ServletContextAttributeListener {

    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("Context Attribute Added: " + event.getName() + " = " + event.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        System.out.println("Context Attribute Removed: " + event.getName());
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        System.out.println("Context Attribute Replaced: " + event.getName() + " (Previous: " + event.getValue() + ")");
    }
}

Key Advantages of Using ServletContextAttributeListener

  • Application-Wide Auditing: Easily log when and where global application settings or shared state values change across different servlets.
  • Decoupled Architecture: Keep state-monitoring logic completely separate from core business servlets.
  • Dynamic Configuration Updates: Detect runtime updates to global configuration attributes and react instantly (e.g., reloading configurations or refreshing caches).

Recommended Related Tutorials

Continue exploring servlet listeners and web architecture with these tutorials from Ram N Java:


Click here to watch in Youtube : https://www.youtube.com/watch?v=6sMQkPkN3TE

Click the below Image to Enlarge

ServletContextAttributeListenerDemo Project Dir Structure

ServletContextAttributeTestServlet.java
import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletContextAttributeTestServlet extends HttpServlet
{
    private static final long serialVersionUID = 1L;

    public void init() throws ServletException
    {
        System.out.println("-----------------------------------------");
        System.out.println(" Init method is called in "
                + this.getClass().getName());
        System.out.println("--------------------------------------");
    }

    public void doGet( HttpServletRequest request, HttpServletResponse response )
            throws ServletException, IOException
    {
        response.setContentType("text/html");
        
        ServletContext servletContext = getServletContext();

        sleep();
        
        servletContext.setAttribute("CompanyName", "Wipro");

        sleep();

        servletContext.setAttribute("CompanyName", "Infosys");

        sleep();

        servletContext.removeAttribute("CompanyName");

    }

    private void sleep()
    {
        try
        {
            Thread.sleep(10000);
        }
        catch( InterruptedException e )
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void destroy()
    {
        System.out.println("-----------------------------------------");
        System.out.println(" destroy method is called in "
                + this.getClass().getName());
        System.out.println("-----------------------------------------");
    }

}

MyServletContextAttributeListener.java
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

public class MyServletContextAttributeListener implements
        ServletContextAttributeListener
{

    @Override
    public void attributeAdded(
            ServletContextAttributeEvent servletContextAttributeEvent )
    {
        System.out.println("\n###################################\n");

        System.out.println("attributeAdded method has been called in "
                + this.getClass().getName());

        System.out.println("Newly added Attribute Name ="
                + servletContextAttributeEvent.getName() + ",value = "
                + servletContextAttributeEvent.getValue());

        System.out.println("\n#####################################\n");

        /*
         * if particular Attribute is added, based on that if you want to
         * perform any operation then you can do it here.
         */

    }

    @Override
    public void attributeRemoved(
            ServletContextAttributeEvent servletContextAttributeEvent )
    {
        System.out.println("\n###################################\n");

        System.out.println("attributeRemoved method has been called in "
                + this.getClass().getName());

        System.out.println("Removed Attribute Name ="
                + servletContextAttributeEvent.getName() + ",value = "
                + servletContextAttributeEvent.getValue());

        System.out.println("\n###################################\n");

        /*
         * if particular Attribute is Removed, based on that if you want to
         * perform any operation then you can do it here.
         */

    }

    @Override
    public void attributeReplaced(
            ServletContextAttributeEvent servletContextAttributeEvent )
    {
        System.out.println("\n###################################\n");

        System.out.println("attributeReplaced method has been called in "
                + this.getClass().getName());

        System.out.println("Replaced Attribute Name ="
                + servletContextAttributeEvent.getName() + ",value = "
                + servletContextAttributeEvent.getValue());

        System.out.println("\n###################################\n");

        /*
         * if particular Attribute is Replaced, based on that if you want to
         * perform any operation then you can do it here.
         */

    }

}


web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    metadata-complete="true" version="3.0">

    <display-name>ServletContextAttributeListenerDemo</display-name>

    <description>
        This is a simple web application with a source code organization
        based on the recommendations of the Application Developer's Guide.
    </description>

    <servlet>
        <servlet-name>ServletContextAttributeTestServlet</servlet-name>
        <servlet-class>ServletContextAttributeTestServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ServletContextAttributeTestServlet</servlet-name>
        <url-pattern>/listenerTest</url-pattern>
    </servlet-mapping>

    <listener>
        <listener-class>MyServletContextAttributeListener</listener-class>
    </listener>

</web-app>

index.html
<html>
<body>
    <a href="listenerTest">listenerTest</a>
</body>
</html>


Environment Used 

JDK version :1.7.0_51
Tomcat version : 7.0.50 

To Download ServletContextAttributeListenerDemoApp Project Click the below link

https://sites.google.com/site/javaee4321/servlets/ServletContextAttributeListenerDemoApp.zip?attredirects=0&d=1

See also:

  • Servlets Tutorial
  • All Design Patterns Links
  • No comments:

    Post a Comment

    Tutorials