ProblemYou want to use a JSP to set a cookie on a client. SolutionWrap a JavaBean around the servlet API for creating cookies. Then use the bean in the JSP with the jsp:useBean standard action. DiscussionA JSP can use a JavaBean to create the cookie and set the cookie on the client. Example 10-3 creates an instance of a JavaBean of type com.jspservletcookbook.CookieBean using the jsp:useBean standard action. Then the JSP sets a few bean properties. The bean will pass through the property values to the cookie that it is generating for the JSP. The JSP uses jsp:setProperty to set the following cookie properties:
Example 10-3. A JSP that sends a cookie to a client<jsp:useBean id="cookieBean" class="com.jspservletcookbook.CookieBean" /> <jsp:setProperty name="cookieBean" property="name" value="bakedcookie" /> <%-- set 'Expires' attribute to about one year from now --%> <jsp:setProperty name="cookieBean" property="maxAge" value= "<%= (365*24*60*60) %>" /> <jsp:setProperty name="cookieBean" property="path" value="<%= request.getContextPath( ) %>" /> <jsp:setProperty name="cookieBean" property="cookieHeader" value="<%= response %>" /> <html> <head><title>Cookie Maker</title></head> <body> <h2>Here is information about the new cookie</h2> Name: <jsp:getProperty name="cookieBean" property="name" /><br> Value: <jsp:getProperty name="cookieBean" property="value" /><br> Path: <jsp:getProperty name="cookieBean" property="path" /> </body> </html> The JSP passes along the HttpServletResponse object to its wrapper bean, so that the bean can call response.addCookie(Cookie cookie) to send the client the new cookie. The response object is passed to the bean using this code (see the setCookieHeader( ) method in Example 10-4): <jsp:setProperty name="cookieBean" property="cookieHeader" value= "<%= response %>" /> The bottom of the JSP displays some of the new cookie's values. Figure 10-2 shows the JSP's output in a web browser. Repeatedly requesting the JSP will overwrite the existing cookie with a new one. Figure 10-2. A JSP shows information about a new cookieExample 10-4 shows the code for the CookieBean itself, which is rather lengthy due to all the getter and setter methods .
You can set the cookie value in the JSP (which is not done in Example 10-3) by calling the bean's setValue(String value) method via jsp:setProperty : <jsp:setProperty name="cookieBean" property="value" value="newvalue" /> The bean has to import the Cookie and HttpServletResponse classes, because it uses them to make the new cookie, then send the cookie to the client. Example 10-4 wraps its own methods around some of the Cookie class methods, such as setValue( ) and setMaxAge( ) . Example 10-4. A JavaBean for making cookiespackage com.jspservletcookbook; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Cookie; public class CookieBean { private Cookie cookie = null; public CookieBean( ){} //set the cookie name public void setName(String name){ if (name == null (name.equals(""))) throw new IllegalArgumentException( "Invalid cookie name set in: "+getClass( ).getName( )); cookie = new Cookie(name,""+new java.util.Date( ).getTime( )); } //set the cookie value public void setValue(String value){ if (value == null (value.equals(""))) throw new IllegalArgumentException( "Invalid cookie value set in: "+getClass( ).getName( )); if (cookie != null) cookie.setValue(value); } public void setMaxAge(int maxAge){ if (cookie != null) cookie.setMaxAge(maxAge); } public void setPath(String path){ if (path == null (path.equals(""))) throw new IllegalArgumentException( "Invalid cookie path set in: "+getClass( ).getName( )); if (cookie != null) cookie.setPath(path); } public void setCookieHeader(HttpServletResponse response){ if (response == null ) throw new IllegalArgumentException( "Invalid HttpServletResponse set in: "+getClass( ).getName( )); if (cookie != null) response.addCookie(cookie); } public String getName( ){ if (cookie != null) return cookie.getName( ); else return "unavailable"; } public String getValue( ){ if (cookie != null) return cookie.getValue( ); else return "unavailable"; } public String getPath( ){ if (cookie != null) return cookie.getPath( ); else return "unavailable"; } } If the JSP fails to use jsp:setProperty to call the bean's setCookieHeader(HttpServletResponse response) method, then the cookie is created but never included in the response headers sent to the client. In this design, you allow the user to set some optional cookie attributes (such as Path ) before she explicitly sends the cookie as part of the response. See AlsoRecipe 10.1 on setting a cookie with a servlet; Recipe 10.2 on creating an array from all of the request's cookies; Recipe 10.4 on using a servlet to read cookies; Recipe 10.5 on reading cookie values with a JSP; Recipe 10.6 on altering or removing an existing cookie; the RFC 2109 document dealing with cookies: ftp://ftp.rfc-editor.org/in-notes/rfc2109.txt; Netscape's preliminary specification for cookies: http://wp.netscape.com/newsref/std/cookie_spec.html; the Java Cookie API: http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/Cookie.html. |