记录用户访问次数

在Servlet中应用ServletContext接口,Servlet容器在启动一个Web应用时,会为它创建一个ServletContext对象。当Servlet容器终止一个Web应用时,ServletContext对象也会被销毁,所以该对象与Web应用程序有同样的生命周期

在ServletContext接口中存取共享数据的方法有:

  • setAttribute(String name,Object
    object):在ServletContext对象中存放共享数据,参数name表示属性名,参数object表示属性值;

  • removeAttribute(String name):根据指定参数name属性名,删除ServletContext对象中的共享数据;

  • getAttribute(String name):根据指定的参数name属性,获取ServletContext对象中的共享数据;
    新建CounterServlet的Servlet类,在doPost()方法中实现统计用户的访问次数

    public class CounterServlet extends HttpServlet {
     	public void doGet(HttpServletRequest request, HttpServletResponse response)
     			throws ServletException, IOException {
     		this.doPost(request, response);
     	}
     	public void doPost(HttpServletRequest request, HttpServletResponse response)
     			throws ServletException, IOException {
     		//获得ServletContext对象
     		ServletContext context = getServletContext();
     		//从ServletContext中获得计数器对象
     		Integer count = (Integer)context.getAttribute("counter");
     		if(count==null){//如果为空,则在ServletContext中设置一个计数器的属性
     			count=1;
     			context.setAttribute("counter", count);
     		}else{			//如果不为空,则设置该计数器的属性值加1
     			context.setAttribute("counter", count+1);
     		}
     		response.setContentType("text/html");	//响应正文的MIME类型
     		response.setCharacterEncoding("UTF-8");	//响应的编码格式
     		PrintWriter out = response.getWriter();
     		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
     		out.println("<HTML>");
     		out.println("  <HEAD><TITLE>统计网站访问次数</TITLE></HEAD>");
     		out.println("  <BODY>");
     		out.print("    <h2><font color='gray'> ");
     		out.print("您是第  "+context.getAttribute("counter")+" 位访客!");
     		out.println("</font></h2>");
     		out.println("  </BODY>");
     		out.println("</HTML>");
     		out.flush();
     		
     		out.close();
     	}
     }
    

新建CounterListener类

public class CounterListener implements ServletContextListener {
	/**
	 * Web服务器终止时,调用该方法
	 * 向保存计数器文件中写一个当前网站的访问次数
	 */
	@Override
	public void contextDestroyed(ServletContextEvent contextEvent) {
		ServletContext context = contextEvent.getServletContext();
		Integer count = (Integer)context.getAttribute("counter");
		if(count!=null){
			try{
				String path =context.getRealPath("/count.txt");
				File file = new File(path);
				FileWriter fw = new FileWriter(file);
				BufferedWriter bw = new BufferedWriter(fw);
				bw.write(context.getAttribute("counter").toString());
				bw.flush();
				bw.close();
				fw.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		
	}
	/**
	 * 当Web服务器启动时,调用该方法
	 * 读取计数器文件中保存的网站访问次数
	 */
	@Override
	public void contextInitialized(ServletContextEvent contextEvent) {
		Integer count = 0;
		ServletContext context = contextEvent.getServletContext();
		try{
			String path  =context.getRealPath("");
			File file = new File(path,"count.txt");
			System.out.println(file.getPath());
			if(!file.exists()){
				
				file.createNewFile();
				FileWriter fw = new FileWriter(file);
				BufferedWriter bw = new BufferedWriter(fw);
				bw.write("0");
				bw.flush();
				bw.close();
				fw.close();
			}else{
				FileReader fr = new FileReader(file);
				BufferedReader br = new BufferedReader(fr);
				count = new Integer(br.readLine());	
				context.setAttribute("counter", count);
				br.close();
				fr.close();
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
}

web.xml文件配置

 <servlet>
    <servlet-name>CounterServlet</servlet-name>
    <servlet-class>com.cn.zj.Servlet.CounterServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CounterServlet</servlet-name>
    <url-pattern>/counter</url-pattern>
  </servlet-mapping>
  <listener>
  	<listener-class>com.cn.zj.Servlet.CounterListener</listener-class>
  </listener>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

猜你喜欢

转载自blog.csdn.net/weixin_44234912/article/details/88576142