每一个站点都有自己的统计訪问量,可是少不了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,这就实现了站点刷新量的统计。

javaEE之-------统计站点刷新量的更多相关文章

  1. javaEE之--------统计站点在线人数,安全登录等(观察者设计模式)

    整体介绍下:  监听器:监听器-就是一个实现待定接口的普通Java程序,此程序专门用于监听别一个类的方法调用.都是使用观察者设计模式. 小弟刚接触这个,做了些简单的介绍.大神请绕道,技术仅仅是一点点, ...

  2. Oracle查询优化之减少统计的数据量

    统计各部门人数很简单,通过部门分组即可,要统计部门以下下级部门的人数也简单,通过递归.要统计所有有下级部门的部门人数(包含下级)页比较简单, 先查询出有下级的部门,在对每个部门进行递归查询,如下: ) ...

  3. wordpress添加文章浏览统计(刷新不重复)

    wordpress本身不带文章浏览统计,可以用插件wp-postview,但是刷新还是算一个浏览次数. 1.首先在主题下functions.php里增加以下代码,这段代码也是网上可以找到的 //add ...

  4. Mysql查询优化之 触发器加中间表 方法优化count()统计大数据量总数问题

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6138288.html 在上一篇博文我们提到,分页有三种方法.其中,第三种是我们最常用的.然而,在实际应用过程中 ...

  5. 在windows 上统计git 代码量

    1 需要系统安装 git + gawk git 安装自行百度 gawk 到官网下载 http://gnuwin32.sourceforge.net/packages/gawk.htm 1.2 下载好后 ...

  6. 通过Confulence API统计用户文档贡献量

    Confulence提供了非常清晰的RESTful API,直接使用API比confluence_python_cli这个库更方便. 参考文档:https://developer.atlassian. ...

  7. phpcms v9全站点击量排行代码

    前台: <ul> {pc:content action="sitehits" siteid="1" num="10" order ...

  8. 统计每日单量MySQL语句

    -- 每日单量 select DATE_FORMAT(createtime,'%Y-%m-%d') as days,count(*) count from ibt_shop_order group b ...

  9. 使用redis实现【统计文章阅读量】及【最热文章】功能

    1.视图函数 # 不需要登录装饰器,匿名用户也可访问def article_detail(request, id, slug): # print(slug,id) article = get_obje ...

随机推荐

  1. Html表单提交到Servlet输出到页面乱码

    Html使用的编码是UTF-8编码显示页面,之后使用form表单提交字段到Servlet中,Servlet将利用getParamer方法获得form提交的字段,之后通过Respone中的writer将 ...

  2. 利用SignalR来同步更新Winfrom

    之前写了个用Socket来更新多个Winfrom的试例,这两天看了下SignalR,也用这个来试一下 SignalR 地址:https://www.asp.net/signalr 我这个也是基于 ht ...

  3. 【转载】如何学习C++

    原文地址: http://www.hankcs.com/program/cpp/how_to_learn_c__.html 1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<T ...

  4. python学习笔记:第五天

    day05: 1.字符串格式化输出: 1.占位符:%s (字符串)    %d(整型)   %f (浮点型) 打印格式:print("字符串为%s" %s) 2.字符串:判断是否是 ...

  5. 紫书 例题8-15 UVa 12174 (滑动窗口)

    这道题就是给你一n长序列, 然后把这个序列按顺序分成很多段, 每段长s(最前面可以小于s, 只有第一段的后半段, 最后面也同样, 只有最后一段的前半段), 然后要求是每一段里面没有重复的数, 问你有几 ...

  6. 采药 水题 dp 01背包问题 luogu1048

    最基本的01背包,不需要太多解释,刚学dp的同学可以参见dd大牛的背包九讲,直接度娘“背包九讲”即可搜到 #include <cstdio> #include <cstring> ...

  7. php函数in_array奇怪现象

    $k = 0; $fieldArr = array('tt', 'bb'); if ( in_array( $k, $fieldArr)) { echo '1'; } 按理来说,是不会输出1的,可是最 ...

  8. 三步实现沉浸式状态栏(即状态栏与APP同色)

              本篇实现的是沉浸式状态栏.先明白下概念,什么是状态栏?直接上图:                什么是沉浸式状态栏?演示样例图例如以下:                       ...

  9. node07---post请求、表单提交、文件上传

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. uva_127,栈以及vector的应用

    参考自http://www.cnblogs.com/maqiang/archive/2012/05/02/2479760.html #include <iostream> #include ...