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(); } }