Showing posts with label ServletContextAttributeListener. Show all posts
Showing posts with label ServletContextAttributeListener. Show all posts

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
  • Thursday, 12 June 2014

    Servlets : ServletContextAttributeListener Introduction

    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

    Introduction to ServletContextAttributeListener

    In Java web applications, the application context represents the shared environment across all servlets, JSPs, and filters. The ServletContextAttributeListener interface (from the javax.servlet package) provides a callback mechanism that notifies your application whenever attributes are added, removed, or replaced within application scope.

    Unlike listeners that track the creation or destruction of the context itself, ServletContextAttributeListener focuses strictly on data changes within the ServletContext. This makes it an invaluable tool for logging global configuration changes, synchronizing shared state, and keeping caches up to date.

    Core Lifecycle Callback Methods

    The ServletContextAttributeListener interface defines three essential callback methods:

    • attributeAdded(ServletContextAttributeEvent event): Triggered when a new attribute is bound to the servlet context using servletContext.setAttribute("name", value).
    • attributeRemoved(ServletContextAttributeEvent event): Triggered when an attribute is unbound from the servlet context using servletContext.removeAttribute("name").
    • attributeReplaced(ServletContextAttributeEvent event): Triggered when an existing attribute in the servlet context is overwritten with a new value.
    @WebListener
    public class ContextAttributeMonitor implements ServletContextAttributeListener {

        @Override
        public void attributeAdded(ServletContextAttributeEvent event) {
            System.out.println("New context attribute added: " + event.getName());
        }

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

    Key Benefits & Use Cases

    • Global State Auditing: Keep complete visibility over which components are reading or mutating application-wide parameters.
    • Runtime Cache Invalidation: Automatically refresh or clear dependent caches whenever relevant global attributes change.
    • Clean Separation of Concerns: Maintain clean business logic by handling state monitoring, diagnostics, and notifications separately from core servlets.

    Recommended Related Tutorials

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


    Click the below Image to Enlarge
    ServletContextAttributeListener Introduction
    ServletContextAttributeListener Introduction
    ServletContextAttributeListener Introduction
    See also:

  • Servlets Tutorial
  • All Design Patterns Links
  • Tutorials