每一个站点都有自己的统计訪问量,可是少不了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. CDR X6设计师的福利,3折特惠!

    最新消息称,即日起CorelDRAW官方为回馈新老用户长期以来的支持,特别推出CorelDRAW X6降价活动.目前CorelDRAW X6售价仅为2399元,照这个价格,CDR 2017     会 ...

  2. checkbox控制显示隐藏

    显示文本框<input type = "checkbox" id="checkbox" onclick="on_hide();"/&g ...

  3. NodeJS学习笔记 (5)网络服务-http-req(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: 概览 本文的重点会放在req这个对象上.前面已经提到,它其实是http.Incom ...

  4. 浅谈python 中正则的一些函数

         主要的函数有  : match() search() findall() group() groups() split()  match (): 含义  开头匹配,匹配成功返回一个对象失败则 ...

  5. HTTP——学习笔记(1)

    名词解释: 协议: HTTP:HyperText Transfer Protocol,超文本传输协议,属于应用层的协议 FTP:File Transfer Protocol,文件传输协议,相比于HTT ...

  6. cogs 181. [USACO Jan07] 最高的牛

    181. [USACO Jan07] 最高的牛 ★★   输入文件:tallest.in   输出文件:tallest.out   简单对比时间限制:1 s   内存限制:32 MB FJ's N ( ...

  7. hdu_5139 概率问题

    #include<iostream> #include<cstdio> #include<cmath> using namespace std; int main( ...

  8. POJ 3173 模拟

    按照题意模拟就好-- //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; in ...

  9. Metasploit的三种启动方式

    不多说,直接上干货! 注意:博主我用的是Kali linux 2016.2(Rolling).  msfcli 的启动 root@kali:~# msfcli -h bash: msfcli: 未找到 ...

  10. Android RecyclerView 水平滚动+自动循环轮播

    主要处理的地方: 1.RecyclerView中Adapter的item个人可以无限轮询. 2.RecyclerView自动滑动 3.手指按下时滑动停止,手指抬起后继续自动滑动 public clas ...