每一个站点都有自己的统计訪问量,可是少不了server会出现意外情况,(如断电。。)

所以就须要我们在站点挂机的前段时间将这个数据存起来。

我们就须要用到站点最大的容器,application,我们採用观察者设计模式实现ServletContextListener接口。然后在销毁之前将这个数据存起来

ps:属于点点知识。大牛请绕道。

开发步骤:

第一步:实现ServletContextListener接口。
第二步:实现两个方法。
contextInitialized
contextDestroyed

第三步:在web.xml中加入<listener/>节点。

详细实现:

我们须要实现ServletContextListener接口,里面用两个方法。我们须要在初始化的时候从文件中面读出来。然后在销毁的时候存进去。

读取文件:

public class MyServletContext implements ServletContextListener {
//这是监听器。统计站点的訪问量
/*
* 启动的时候(初始化)从文件中读取。存在servletcontext中
* 销毁的时候,把数据从servletcontext中取出来,存到文件中
*/
String filename ="";
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context=sce.getServletContext();
String filename=context.getRealPath("/count.txt");
try {
BufferedReader br =new BufferedReader(new FileReader(filename));
String num =br.readLine();
Integer numer =Integer.valueOf(num);
context.setAttribute("count", numer);//将读取的值存放到servletcontext容器中
br.close();
} catch( Exception e) {
e.printStackTrace();
context.setAttribute("count", new Integer(0));//出异常说明没有值读取,所以设置为0;
} }

 

销毁将数据存储到文件(仅仅有文件才是永久储存)

@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContext context=sce.getServletContext();
String filename=context.getRealPath("/count.txt");
try {
PrintWriter pw =new PrintWriter(filename);
Integer count=(Integer) context.getAttribute("count");//从容器中获取对应count值
// pw.write(count);//存的文件tomcat文件夹下
pw.print(count);
System.out.println("销毁了"+count);
pw.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

訪问量的加入

訪问量我们须要写在过滤器里面。每次过滤一次我们从context中加一次

	public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//这里考虑到多线程,这样写数据不准确,所以须要採用多线程
final ServletContext sct=request.getServletContext();
//启用新的线程去计数,不影响整个站点的速度,这样做非常好
new Thread(){
public void run(){
MyCount.addcount(sct);//把以下这个总体上锁。。 }
}.start();
chain.doFilter(request, response);
}

统计数量会存在多线程的问题。所以我们採用多线程处理,仅仅让统计数量线程,不影响整个站点的效率

//把这个上锁,仅仅会子分支会慢,不会影响整个站点的速度
class MyCount{
public synchronized static void addcount(ServletContext sct){
Integer count=Integer.parseInt(""+sct.getAttribute("count"));
count++;//加入之后,我们须要加入容器里面进去
sct.setAttribute("count", count);
System.out.println(count);
}
}

MyServletContext在初始化的时候会从文件中加载,不存在会自己主动设置为一,每过一次filter。就会加1,这就实现了站点刷新量的统计。

最新文章

  1. Python SocketServer源码分析
  2. 纯Java获得本地MAC地址
  3. 什么是LBS?地理位置服务
  4. 基于ASP.NET MVC和Bootstrap搭建响应式个人博客站(一)
  5. 自己做的萌萌哒的js宠物挂件~
  6. PHP设计模式笔记四:适配器模式 -- Rango韩老师 http://www.imooc.com/learn/236
  7. nginx+ftp搭建图片服务器(Windows Server服务器环境下)
  8. 解析 .Net Core 注入 (2) 创建容器
  9. 使用Dreamweaver正则表达式替换href中的内容
  10. 编程心法 之什么是MVP What is MVP development?
  11. VR一体机如何退出FFBM
  12. VMware三种网络介绍
  13. Eclipse 中构建 Maven 项目的完整过程 - 动态 Web 项目
  14. centos6安装自带php
  15. JavaScript——双向链表实现
  16. STM8串口初始化寄存器配置
  17. 跑道标识和那些复杂的灯光系统 and 简介、编号、参数、标志及数量 and 飞机跑道标准与参数
  18. git回滚线上代码
  19. (一)Fiddler的介绍和安装
  20. JAVA开发工作流程

热门文章

  1. UVa 10801 Lift Hopping【floyd 】
  2. HDU 1505 City Game【DP】
  3. NetworkX-simple graph
  4. 拉格朗日插值&amp;&amp;快速插值
  5. redis.conf配置文件配置项解析
  6. System.IO.IsolatedStorage 使用 IsolatedStorageFileStream 存储信息
  7. Object-C,NSURL,统一资源定位器
  8. Linux进程管理之状态(二)
  9. PID的原理
  10. 关于Android制作.9.png图片