zoukankan      html  css  js  c++  java
  • javaEE之-------统计站点刷新量

    每一个站点都有自己的统计訪问量,可是少不了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,这就实现了站点刷新量的统计。
  • 相关阅读:
    服务详解网址
    WCF、WebAPI、WCFREST、WebService之间的区别
    ql常见面试题 受用了
    用VSCode写python的正确姿势
    C#集合类型大盘点
    ASP.NET Web API 创建帮助页
    C#中IEnumerable、ICollection、IList、List之间的区别
    [WCF REST] 一个简单的REST服务实例
    sql存储过程算法
    oracle 存储过程
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8446334.html
Copyright © 2011-2022 走看看