package com.chen.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CounterServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 在程序代码中33行,调用getServletContext()方法(从GenericServlet类间接继承而来)得到Web应用程序的上下文对象
* 。为了避免线程安全的问题,我们在第35行使用synchronized关键字对context对象进行同步。第36行,
* 调用上下文对象的getAttribute()方法获取counter属性的值。第36~40行,判断count是否为null,如果为null,则将它的初始值设为1
* 。当这个Servlet第一次被访问的时候 ,在上下文对象中还没有保存counter属性,所以获取该属性的值将返回null。如果count不为null,
* 则将count加1。第40行,将count作为counter属性的值保存到ServletContext对象中
* 。当下一次访问这个Servlet时,调用getAttribute()方法取出counter属性的值不为null,
* 于是执行第38行的代码,将count加1,此时count为2,表明页面被访问了两次。
* 第49行,输出count,显示该页面的访问次数
*/
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext context = getServletContext();
Integer count = null;
synchronized (context) {
count = (Integer) context.getAttribute("counter");
if (null == count) {
count = new Integer(1);
} else {
count = new Integer(count.intValue() + 1);
}
context.setAttribute("counter", count);
}
resp.setContentType("text/html;charset=gb2312");
PrintWriter out = resp.getWriter();
out.println("<html><head>");
out.println("<title>页面访问统计</title>");
out.println("</head><body>");
out.println("该页面已被访问了" + "<b>" + count + "</b>" + "次");
out.println("</body></html>");
out.close();
}
}