the5fire的技术博客

关注python、vim、linux、web开发和互联网--life is short, we need python.


ServletContextListener简单应用:统计访问人数

作者:the5fire | 标签:   | 发布:2011-01-06 10:43 a.m. | 阅读量: 3825, 3820

在Servlet API中有这样一个ServletContextListener接口,他能过监听servletContext的生命周期,也就是web应用的生命周期。 servletContextListener接口中定义了两个方法,分别用于监听web应用的创建和销毁,利用这两个方法可以完成对网站访问人数进行统计。 下面用一个实例来说明: 首先建一个InitListener.java,用来监听每一web应用的创建,其原理是这样的,每有一个用户访问该网站(jsp),服务器必定会启动一个web应用,可以通过继承servletContextListener来监听web的启动,从而统计来访人数。 InitListener.java:

package com.listener;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;



public class InitListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce){
        System.out.println("application is Initialized.");
            //获取ServletContext对象
        ServletContext context=sce.getServletContext();
        try{
            //从文件中读取计数器的数值
            BufferedReader reader=new BufferedReader(
            new InputStreamReader(context.getResourceAsStream("/count.txt")));
            int count=Integer.parseInt(reader.readLine());
            System.out.println(count);
            reader.close();
            //把计数器对象保存到Web应用范围
            context.setAttribute("counter",count);
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    public void contextDestroyed(ServletContextEvent sce){
        System.out.println("application is Destroyed.");
            //获取ServletContext对象
        ServletContext context=sce.getServletContext();
            //从Web应用范围获得计数器对象
        int counter=(Integer)context.getAttribute("counter");

        if(counter != 0){
            try{
                //把计数器的数值写到count.txt文件中,这里最好把路径输出一下,网站运行时的物理路径
                String filepath=context.getRealPath("");
                filepath=filepath+"/count.txt";
                System.out.println(filepath);
                PrintWriter pw=new PrintWriter(filepath);
                counter++;//统计数量累加
                System.out.println(counter);
                pw.println(counter);
                pw.close();
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }


}

配置web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <listener>
        <listener-class>com.listener.InitListener</listener-class>
    </listener>
</web-app>

建一个index.jsp页面:

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
我是打酱油的
<body>
</body>
</html>

这样每次启动系统都会读取counter.txt文件中的数字,然后在web应用关闭的时候进行加一,存储。其实这些数据存储在数据库中更方便一点。这个就自由发挥了。 ServletContextListener的运用有很多,比如说缓存的创建等等。 扩展阅读: 运用ServletContextListener在服务器启动和关闭时创建和关闭缓存


----EOF-----

扫码关注,或者搜索微信公众号:码农悟凡


其他分类: