Friday, October 30, 2009

Recipe 16.9 Setting Request Attributes in Servlets



[ Team LiB ]






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 ]



    No comments: