假如有这么一个需求,要记录所有用户访问某一页面的次数。
最先想到的可能是在该Controller定义一个静态成员,然后在相应Action里自增。但这样有一个问题,就是Tomcat或者其他服务器重启的话,这个值是没办法保存的。
当然在数据库中直接保存也是可以的,但因此便要去单独建张表,日后用户访问相应页面都要去访问数据库维护该表有点不值得。
利用自定义ServletContextListener可以很方便做到这一点。思路如下:
1、在Web应用启动时从文件中读取计数器的数值,并把表示计数器的Counter对象存放到Web应用范围内。存放计数器的文件的路径为helloapp/count/count.txt。
2、在Web应用终止时把Web应用范围内的计数器的数值保存到count.txt文件中。
public class MyServletContextListener implementsServletContextListener{public voidcontextInitialized(ServletContextEvent sce){
System.out.println("helloapp application is Initialized.");//获取 ServletContext 对象
ServletContext context=sce.getServletContext();try{//从文件中读取计数器的数值
BufferedReader reader=newBufferedReader(newInputStreamReader(context.
getResourceAsStream("/count/count.txt")));int count=Integer.parseInt(reader.readLine());
reader.close();//把计数器对象保存到 Web 应用范围
context.setAttribute("count",count);
}catch(IOException e) {
e.printStackTrace();
}
}public voidcontextDestroyed(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=newPrintWriter(filepath);
pw.println(count);
pw.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
同时在web.xml文件中要配置
ServletContextTest.MyServletContextListener
通过ServletContext对象便能获取到保存的count值。
如果觉得《java记录访问次数_Java 利用监听器来实现记录用户访问网站次数(示例代码)》对你有帮助,请点赞、收藏,并留下你的观点哦!