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.
|
No comments:
Post a Comment