Recipe 18.4 Automatically Refreshing a Servlet


Problem

You want to automatically refresh a servlet-generated page at a specified interval.

Solution

Add a Refresh response header, using the javax.servlet.http.HttpServletResponse object.

Discussion

Suppose that your servlet is monitoring a Red Sox versus Yankees baseball game. You want to be able to allow a user to follow the game almost pitch by pitch, and have your web application constantly update the status of the game. If you add a Refresh response header to your client response, the browser will continually refresh the page according to the specified interval.

Example 18-6 adds a response header that the web container will send to the client in the format Refresh: 60 , which means "request this page again in 60 seconds."

Example 18-6. Refreshing a servlet every 60 seconds
 package com.jspservletcookbook;            import javax.servlet.*; import javax.servlet.http.*; public class AutoServlet extends HttpServlet {        public void doGet(HttpServletRequest request,      HttpServletResponse response) throws ServletException,       java.io.IOException {  //client browser will request the page every 60 seconds       response.addHeader("Refresh","60");  response.setContentType("text/html");       java.io.PrintWriter out = response.getWriter( );       out.println(           "<html><head><title>Client Refresh</title></head><body>");       out.println("<h2>Welcome to the Red Sox - Yankees series...</h2>");       //More HTML or dynamic content       out.println("</body></html>");   } //doGet } 

There are some caveats to this approach ”if the end user walks away from her desk, her browser will blithely continue to request the page. If your servlet doesn't impose some control over this, you could add a lot of unnecessary load to your application. One example of a solution to this problem is to keep track of how many times the servlet has been refreshed with a session attribute (detailed in Chapter 16). If the number of times exceeds a certain limit, you could stop adding the header to the response. Example 18-7 shows part of a doPost( ) method body for keeping track of a user's refresh count.

Example 18-7. Tracking a user's refresh count
 //inside doPost (or doGet) method HttpSession session = request.getSession( ); Long times = (Long) session.getAttribute("times"); //create session attribute if it doesn't exist if (times == null)     session.setAttribute("times",new Long(0)); //local variable 'temp' will hold the session attribute value long temp = 1; //increment the attribute value to account for this request if (times != null)     temp = times.longValue( ) + 1; if (temp < 60) //only allow 60 refreshes; about an hour's worth     response.addHeader("Refresh","60"); //update the session attribute value session.setAttribute("times",new Long(temp)); 

This code works equally well inside of a doGet( ) method.


See Also

Recipe 18.5 on automatically refreshing a JSP; Recipe 18.1 and Recipe 18.2 on examining request headers in a servlet and a JSP; Recipe 18.3 on using a filter to wrap the request and forward it along the filter chain; Recipe 18.6 on using a listener to track requests .



Java Servlet & JSP Cookbook
Java Servlet & JSP Cookbook
ISBN: 0596005725
EAN: 2147483647
Year: 2004
Pages: 326

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net