假若有这么一个需求,要记录全部用户访问某一页面的次数。web
最早想到的多是在该Controller定义一个静态成员,而后在相应Action里自增。但这样有一个问题,就是Tomcat或者其余服务器重启的话,这个值是没办法保存的。数据库
固然在数据库中直接保存也是能够的,但所以便要去单独建张表,往后用户访问相应页面都要去访问数据库维护该表有点不值得。服务器
利用自定义ServletContextListener能够很方便作到这一点。思路以下:app
1 、在 Web 应用启动时从文件中读取计数器的数值,并把表示计数器的 Counter 对象存放到 Web应用范围内。存放计数器的文件的路径为helloapp/count/count.txt 。spa
2 、在Web 应用终止时把Web 应用范围内的计数器的数值保存到count.txt 文件中。code
public class MyServletContextListener implements ServletContextListener{ public void contextInitialized(ServletContextEvent sce){ System.out.println("helloapp application is Initialized."); // 获取 ServletContext 对象 ServletContext context=sce.getServletContext(); try{ // 从文件中读取计数器的数值 BufferedReader reader=new BufferedReader( new InputStreamReader(context. getResourceAsStream("/count/count.txt"))); int count=Integer.parseInt(reader.readLine()); reader.close(); // 把计数器对象保存到 Web 应用范围 context.setAttribute("count",count); } catch(IOException e) { e.printStackTrace(); } } public void contextDestroyed(ServletContextEvent sce){ System.out.println("helloapp application is Destroyed."); // 获取 ServletContext 对象 ServletContext context=sce.getServletContext(); // 从 Web 应用范围得到计数器 int count=(int)context.getAttribute("count"); if(count!=0){ try{ // 把计数器的数值写到 count.txt 文件中 String filepath=context.getRealPath("/count"); filepath=filepath+"/count.txt"; PrintWriter pw=new PrintWriter(filepath); pw.println(count); pw.close(); } catch(IOException e) { e.printStackTrace(); } } } }
同时在web.xml文件中要配置xml
<listener> <listener-class> ServletContextTest.MyServletContextListener<listener-class /> </listener>
经过ServletContext对象便能获取到保存的count值。对象