[ Team LiB ] Previous Section Next Section

Recipe 16.9 Setting Request Attributes in Servlets

Problem

You want to use a servlet to store an attribute in a request.

Solution

Use the javax.servlet.ServletRequest.setAttribute( ) method.

Discussion

The ServletRequest.setAttribute( ) method is often used in code that dynamically forwards requests or includes content with a javax.servlet.RequestDispatcher.

Web applications that use RequestDispatchers to share requests between web components can communicate between these components using request attributes. Both the recipient of the RequestDispatcher.forward( ) method and the included file or page involved with the RequestDispatcher.include( ) method have access to the original or enclosing request. Therefore, these web components can also access any object attributes that are stored in those requests.

The servlet in Example 16-10 creates an instance of a ContextObject, stores some information in the object by calling its put( ) method, and then places the object in the HttpServletRequest under the name "com.jspservletcookbook.ContextObject." The servlet then uses a RequestDispatcher to forward the request (including the attribute) and response to the servlet path /displayAttr. The web component mapped to that servlet path now has access to the previously created request attribute.

Example 16-10. Binding an object to a request
package com.jspservletcookbook;           

import javax.servlet.*;
import javax.servlet.http.*;

public class RequestBinder extends HttpServlet {

  public void doGet(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException,
      java.io.IOException {
    
      //bind an object to the request
      ContextObject contextObj = new ContextObject( );

      contextObj.put( request.getRemoteAddr( ), ""+new java.util.Date( ));

      request.setAttribute(
        "com.jspservletcookbook.ContextObject",contextObj );
    
      //use RequestDispatcher to forward request to another servlet
      // mapped to the servlet path '/displayAttr'
      RequestDispatcher dispatcher = request.getRequestDispatcher(
        "/displayAttr");

      dispatcher.forward(request,response);

  } //doGet

}

Example 16-11 shows the servlet that receives the forwarded request. The RequestDisplay servlet is mapped in web.xml to the /displayAttr servlet path. This servlet gets the request attribute from the HttpServletRequest object by calling getAttribute( ) with the attribute name: com.jspservletcookbook.ContextObject. Since the return value of getAttribute( ) is typed to Object, the code must cast the result to ContextObject.

Example 16-11. The target of RequestDispatcher.forward has access to the request attribute
package com.jspservletcookbook;           

import javax.servlet.*;
import javax.servlet.http.*;

public class RequestDisplay extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws 
ServletException, java.io.IOException {
    
    ContextObject obj = (ContextObject) request.getAttribute(
        "com.jspservletcookbook.RequestObject");

    response.setContentType("text/html");
    java.io.PrintWriter out = response.getWriter( );
    out.println(
        "<html><head><title>Request Attribute</title></head><body>");
    out.println("<h2>Request attribute values</h2>");

    //display the keys of the java.util.Map stored in the request object
    //attribute
    if (obj != null)
        out.println( obj.getValues( ) );

    out.println("</body></html>");
      
} //end doGet

}

Make sure to check whether the ServletRequest.getAttribute( ) return value is null before calling any of the object attribute's methods. The getAttribute( ) method returns null if the request does not contain an attribute of the specified name.

See Also

Recipe 16.1-Recipe 16.4 on handling ServletContext attributes in servlets and JSPs; Recipe 16.5-Recipe 16.8 on handling session attributes in servlets and JSPs; Recipe 16.10 on setting request attributes in JSPs; Recipe 16.11 and Recipe 16.12 on accessing or removing request attributes in servlets and JSPs; the Javadoc for javax.servlet. ServletRequestAttributeListener: http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletRequestAttributeListener.html.

    [ Team LiB ] Previous Section Next Section