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
  • No comments:

    Post a Comment

    Tutorials