[ Team LiB ] |
![]() ![]() |
Recipe 18.4 Automatically Refreshing a ServletProblemYou want to automatically refresh a servlet-generated page at a specified interval. SolutionAdd a Refresh response header, using the javax.servlet.http.HttpServletResponse object. DiscussionSuppose 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 secondspackage 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));
See AlsoRecipe 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. |
[ Team LiB ] |
![]() ![]() |