Showing posts with label Request Scope. Show all posts
Showing posts with label Request Scope. Show all posts

Wednesday, 11 June 2014

Servlets : ServletRequestAttributeListener Demo

Master Core Java & Servlets!

Subscribe to Ram N Java for beginner-friendly coding walkthroughs, request lifecycle tutorials, and hands-on Java guides!

🔔 Subscribe to Ram N Java

What is ServletRequestAttributeListener?

In Java web applications, attributes bound to a ServletRequest are widely used to share data between servlets, filters, and JSP views during a single request-response lifecycle. The ServletRequestAttributeListener interface (from the javax.servlet package) provides callback notifications whenever attributes are added to, removed from, or replaced within a request.

By registering a ServletRequestAttributeListener, your application can automatically track and audit dynamic data flow as a request travels through filters, forwardings, or includes, keeping tracking logic completely decoupled from business servlets.

Core Lifecycle Callback Methods

The ServletRequestAttributeListener interface defines three essential methods receiving a ServletRequestAttributeEvent:

  • attributeAdded(ServletRequestAttributeEvent srae): Triggered when a new attribute is bound to the request using request.setAttribute(name, value).
  • attributeRemoved(ServletRequestAttributeEvent srae): Triggered when an attribute is unbound from the request using request.removeAttribute(name).
  • attributeReplaced(ServletRequestAttributeEvent srae): Triggered when an existing attribute value in the request is overwritten with a new value under the same name.
@WebListener
public class RequestAttributeLoggingListener implements ServletRequestAttributeListener {

    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        System.out.println("Request Attribute Added: " + srae.getName() + " = " + srae.getValue());
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        System.out.println("Request Attribute Removed: " + srae.getName());
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        System.out.println("Request Attribute Replaced: " + srae.getName() + " (Previous: " + srae.getValue() + ")");
    }
}

Key Benefits & Use Cases

  • Request Pipeline Auditing: Monitor attributes attached to requests across request dispatchers, forwards, and filter chains.
  • Debugging & Diagnostics: Quickly detect unintended modifications or replacements of request attributes during debugging sessions.
  • Zero-Boilerplate Configuration: Simply annotate your listener class with @WebListener without requiring manual deployment descriptor changes.

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=_r3OpD0ozUY

Click the below Image to Enlarge

ServletRequestAttributeListenerDemo Project Dir Structure

ServletRequestAttributeTestServlet.java
import java.io.IOException;

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

public class ServletRequestAttributeTestServlet 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");

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

        sleep();

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

        sleep();

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

}

MyServletRequestAttributeListener.java
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;

public class MyServletRequestAttributeListener implements
        ServletRequestAttributeListener
{

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

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

        System.out.println("Newly added Attribute Name ="
                + servletRequestAttributeEvent.getName() + ",value = "
                + servletRequestAttributeEvent.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(
            ServletRequestAttributeEvent servletRequestAttributeEvent )
    {
        System.out.println("\n###################################\n");

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

        System.out.println("Removed Attribute Name ="
                + servletRequestAttributeEvent.getName() + ",value = "
                + servletRequestAttributeEvent.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(
            ServletRequestAttributeEvent servletRequestAttributeEvent )
    {
        System.out.println("\n###################################\n");

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

        System.out.println("Replaced Attribute Name ="
                + servletRequestAttributeEvent.getName() + ",value = "
                + servletRequestAttributeEvent.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>ServletRequestAttributeListenerDemo</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>ServletRequestAttributeTestServlet</servlet-name>
        <servlet-class>ServletRequestAttributeTestServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>ServletRequestAttributeTestServlet</servlet-name>
        <url-pattern>/listenerTest</url-pattern>
    </servlet-mapping>

    <listener>
        <listener-class>MyServletRequestAttributeListener</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 ServletRequestAttributeListenerDemoApp Project Click the below link

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

See also:

  • Servlets Tutorial
  • All Design Patterns Links
  • Tuesday, 10 June 2014

    Servlets : ServletRequestAttributeListener Introduction

    Master Core Java & Servlets!

    Subscribe to Ram N Java for beginner-friendly coding walkthroughs, request lifecycle tutorials, and hands-on Java guides!

    🔔 Subscribe to Ram N Java

    What is ServletRequestAttributeListener?

    In Java web applications, sharing data during the lifespan of a single HTTP request is a common requirement. The ServletRequestAttributeListener interface (part of the javax.servlet package) provides a callback mechanism to observe and react to attribute changes occurring within the ServletRequest scope.

    While request lifecycle listeners monitor when a request enters or exits the web container, ServletRequestAttributeListener focuses strictly on modifications to data bound to that request. Whenever an attribute is added, removed, or replaced on a ServletRequest object, the container notifies registered listeners, making it useful for logging, debugging data flow across filters and servlets, or auditing state.

    Core Callback Methods

    The ServletRequestAttributeListener interface defines three essential lifecycle methods receiving a ServletRequestAttributeEvent:

    • attributeAdded(ServletRequestAttributeEvent srae): Invoked when a new attribute is bound to the request via request.setAttribute(name, value).
    • attributeRemoved(ServletRequestAttributeEvent srae): Invoked when an existing attribute is removed from the request via request.removeAttribute(name).
    • attributeReplaced(ServletRequestAttributeEvent srae): Invoked when an attribute value on the request is overwritten with a new value under the same name.
    @WebListener
    public class RequestAttributeOverviewListener implements ServletRequestAttributeListener {

        @Override
        public void attributeAdded(ServletRequestAttributeEvent srae) {
            System.out.println("Attribute added to request: " + srae.getName());
        }

        @Override
        public void attributeRemoved(ServletRequestAttributeEvent srae) {
            System.out.println("Attribute removed from request: " + srae.getName());
        }

        @Override
        public void attributeReplaced(ServletRequestAttributeEvent srae) {
            System.out.println("Attribute replaced in request: " + srae.getName());
        }
    }

    Key Advantages & Common Use Cases

    • Request Pipeline Tracking: Monitor how data attributes evolve as requests pass through filters, servlets, and forward destinations.
    • Debugging & Troubleshooting: Identify unexpected attribute overwrites or removals during request handling.
    • Decoupled Architecture: Keep logging and telemetry separate from core business servlets.

    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=J549oygHINM

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

  • Servlets Tutorial
  • All Design Patterns Links
  • Saturday, 7 June 2014

    Servlets : ServletRequest Attribute

    🚀 Master Java Servlets & Enterprise Web Development!

    Subscribe to Ram N Java for clean Java tutorials, servlet architecture deep dives, and practical coding walkthroughs!

    🔔 Subscribe to Ram N Java

    Understanding Request Scope in Java Servlets

    In Java web applications built using the Servlet API, passing data between web components (such as from a Controller Servlet to a JSP view) is a fundamental task. Unlike parameters which are read-only strings sent from client forms or query URLs, request attributes allow servlets to store rich Java objects in the request scope. The lifecycle of these attributes is tied directly to the lifetime of a single HTTP request lifecycle, making request scope the ideal choice for forwarding data securely and efficiently.

    Core ServletRequest Attribute Methods

    The HttpServletRequest interface provides dedicated methods to manipulate attributes stored in the request scope:

    • setAttribute(String name, Object obj): Binds an object to a specified attribute name within this request. If an attribute of the same name already exists, the old value is replaced.
    • getAttribute(String name): Retrieves the attribute as an Object. You can cast this back to its original class type (e.g., String, List, POJO). Returns null if no attribute exists with the given name.
    • removeAttribute(String name): Removes the specified attribute from the request scope entirely.
    • getAttributeNames(): Returns an Enumeration<String> containing all attribute names currently accessible in this request.

    Step-by-Step Implementation Flow

    1. Setting the Attribute: In the source servlet, store processed business data or objects using request.setAttribute("user", "Ram").
    2. Forwarding the Request: Forward the request and response to a target JSP or servlet using RequestDispatcher.forward(request, response) so the request scope remains intact.
    3. Retrieving the Attribute: In the target destination, fetch the stored object using request.getAttribute("user") and cast it appropriately.
    4. Removing the Attribute: If the data is no longer needed or must be cleared during request processing, call request.removeAttribute("user").

    Why Use Request Attributes?

    • Object Preservation: Store complex Java objects (like domain models, collections, or custom DTOs) without converting them into plain text strings.
    • Short, Memory-Safe Lifespan: Attributes are automatically garbage collected once the HTTP response completes, preventing memory leaks unlike long-lived session data.
    • Clean MVC Architecture: Enables servlets to act purely as controllers that fetch and prepare model data before dispatching rendering tasks to view components.

    Recommended Next Videos

    Deepen your understanding of Java Servlet scopes and listeners with these related tutorials from our channel:


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

    Click the below Image to Enlarge
    Servlets : ServletRequest Attribute
    ServletRequestAttributeDemo Project Dir Structure
    Servlets : ServletRequest Attribute

    FirstServlet.java
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class FirstServlet 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");
            PrintWriter out = response.getWriter();
    
            request.setAttribute("CompanyName", "Wipro");
            request.setAttribute("Location", "India");
    
            System.out.println("Firstservlet will forward the request to SecondServlet soon");
    
            try
            {
                Thread.sleep(10000);
            }
            catch( InterruptedException e )
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            RequestDispatcher requestDispatcher = request
                    .getRequestDispatcher("/servlet2");
            
            requestDispatcher.forward(request, response);
    
            out.close();
    
        }
    
        public void destroy()
        {
            System.out.println("-----------------------------------------");
            System.out.println(" destroy method is called in "
                    + this.getClass().getName());
            System.out.println("-----------------------------------------");
        }
    
    }
    

    SecondServlet.java
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Enumeration;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class SecondServlet 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");
            PrintWriter out = response.getWriter();
    
            String CompanyName = (String) request.getAttribute("CompanyName");
            out.print("CompanyName :  " + CompanyName + "<br>");
    
            out.print("*************************************************************"
                    + "<br>");
    
            Enumeration<String> namesEnum = request.getAttributeNames();
            while( namesEnum.hasMoreElements() )
            {
                String name = (String) namesEnum.nextElement();
                out.print(name + ":");
                Object value = request.getAttribute(name);
                out.print(value);
                out.print("<br>");
            }
    
            out.close();
        }
    
        public void destroy()
        {
            System.out.println("--------------------------------------------");
            System.out.println(" destroy method is called in "
                    + this.getClass().getName());
            System.out.println("--------------------------------------------");
        }
    
    }
    

    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>ServletRequestAttributeDemo</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>s1</servlet-name>
        <servlet-class>FirstServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>s1</servlet-name>
        <url-pattern>/servlet1</url-pattern>
      </servlet-mapping>
      <servlet>
        <servlet-name>s2</servlet-name>
        <servlet-class>SecondServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>s2</servlet-name>
        <url-pattern>/servlet2</url-pattern>
      </servlet-mapping>
    </web-app>
    

    index.html
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>ServletContextAttributeDemo</title>
    </head>
    <body>
        <form action="servlet1" method="GET">
                        
            <input type="submit" value="Call FirstServlet" />
            
        </form>
    </body>
    </html>
    
    
    Environment Used

    JDK version :1.7.0_51
    Tomcat version : 7.0.50 

    To Download ServletRequestAttributeDemoApp Project Click the below link

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

    See also:

  • Servlets Tutorial
  • All Design Patterns Links
  • Older Posts Home

    Tutorials