| [ 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 ] |
|