servlet监听器功能讲解及代码案例

servlet监听器功能讲解及代码案例


监听器的功能很强大,但是往往一些初级工程师会忽略她,那么今天就对servlet的监听器很久域对象做一个分析及代码演示,分类如下图


那么我们分为三部分来讲解(案例按着 后面的来,还有一些监听器接口由于不经常用就不做分析例如 session的绑定 钝化活化 等):
一、application的监听  一般用来启动定时任务、初始化数据、加载配置文件
二、session的监听  --一般用来统计在线人数等
三、request的监听  --一般用来统计网站请求人数等

action
一、对application的监听
  application在我们服务器中只会出现一次,是在项目启动的时候,那么我们这时候想可不可以给他加个监听那么在项目启动的时候我们就可以处理一些自己的事情  比如项目启动的时候我们初始化一下数据、启动一些定时任务 那么这样我们就不用再去操心这几个功能了,因为在项目启动的时候已经帮我们完成了
   一般监听器都是一个普通的类然后实现了一节监听器的接口,那么我们接下里接写个项目启动监听到application的案例

监听器代码
public class ContextLinstener implements ServletContextListener{

	@Override
	public void contextInitialized(ServletContextEvent sce) {//初始化项目启动  application产生 则触发该方法
		System.out.println("====开始初始化----区县---数据======");
		CacheData.getCitys();//实现类里面是静态f方法
		System.out.println("==========初始化数据----区县---结束,开始初始化省市数据==========");
		CacheData.getProvinces();
		System.out.println("============初始化数据----省市---结束========");
		//启动任务
		System.out.println("=============启动定时任务读取用户生日数据==========");
		TimeTask.timer4();//调用定时任务
	}
	@Override
	public void contextDestroyed(ServletContextEvent sce) {//关闭
		// TODO Auto-generated method stub
		//项目关闭的时候触发
	}
}

CacheData类里面的代码

public class CacheData {
	public static List<CityModel> cms=new ArrayList<>();
	//静态变量是全局的  使用静态缓存的数据时   写CacheData.cms就行了
	public static List<ProvinceModel> pms=new ArrayList<>();
	
	public static void getCitys(){
		CityService cs=new CityService();
		cms=cs.doGetCitys();
		System.out.println("区县总共"+cms.size()+"条数据");
	}
    public static void getProvinces(){
    	ProvinceService ps=new ProvinceService();
    	pms=ps.doGetProvinces();
    	System.out.println("省市总共"+pms.size()+"条数据");
	}
}


TimeTask类里面的代码
public class TimeTask {
	    public static void main(String[] args) {  
	        //timer1();  
	        //timer2();  
	        //timer3();  
	        timer4();  
	    }  
	    // 第一种方法:设定指定任务task在指定时间time执行 schedule(TimerTask task, Date time)  
	    public static void timer1() {  
	        Timer timer = new Timer();  
	        timer.schedule(new TimerTask() {  
	            public void run() {  
	                System.out.println("-------设定要指定任务--------");  
	            }  
	        }, 2000);// 设定指定的时间time,此处为2000毫秒  
	    }  
	  
	    // 第二种方法:设定指定任务task在指定延迟delay后进行固定延迟peroid的执行  
	    // schedule(TimerTask task, long delay, long period)  
	    public static void timer2() {  
	        Timer timer = new Timer();  
	        timer.schedule(new TimerTask() {  
	            public void run() {  
	                System.out.println("-------设定要指定任务--------");  
	            }  
	        }, 1000, 1000);  
	    }  
	  
	    // 第三种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。  
	    // scheduleAtFixedRate(TimerTask task, long delay, long period)  
	    public static void timer3() {  
	        Timer timer = new Timer();  
	        timer.scheduleAtFixedRate(new TimerTask() {  
	            public void run() {  
	                System.out.println("-------设定要指定任务--------");  
	            }  
	        }, 1000, 2000);  
	    }  
	     
	    // 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行.  
	    // Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)  
	    public static void timer4() {  
	        Calendar calendar = Calendar.getInstance();  
	        calendar.set(Calendar.HOUR_OF_DAY, 16); // 控制时  
	        calendar.set(Calendar.MINUTE, 9);       // 控制分  
	        calendar.set(Calendar.SECOND, 0);       // 控制秒  
	  
	        Date time = calendar.getTime();         // 得出执行任务的时间,此处为今天的1点
	  
	       // System.out.println(time);
	        Timer timer = new Timer();  
	        timer.scheduleAtFixedRate(new TimerTask() {  
	            public void run() {  
	                System.out.println("-------开始跑批,查询今日过生日的人--------");  
	                //跑批,得出有谁今天谁生日  
	                //发短信  或者邮件
	            }  
	        }, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行  
	    }  
	}  



第二类监听器 session监听器
我们都知道session在用户访问的时候会产生那么这个时候我们写一个session的监听只要有用户访问都能知道,这个时候我们在applicationcontest中记录一下,当saeeion过时了 那么就把我们刚才记录
的数据减去就好了

session监听器代码如下

public class SessionLinstener implements HttpSessionListener {

	//要实现session监听的接口 只有这样当有用户访问产生sessiion时才能触发//sessionCreated
    public void sessionCreated(HttpSessionEvent se) {
        // TODO Auto-generated method stub
    	System.out.println("session已经创建");
    	ServletContext context = se.getSession().getServletContext();
        Integer count = (Integer) context.getAttribute("peopleOnline");
        if (count == null) {
            count = 1;
        } else {
            count++;
        }
        context.setAttribute("peopleOnline", count);
    }
	/**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent se) {
        // TODO Auto-generated method stub
    	 System.out.println("session正在被销毁");
    	 ServletContext context = se.getSession().getServletContext();
         Integer count = (Integer) context.getAttribute("peopleOnline");
         count--;
         context.setAttribute("peopleOnline", count);
    }
}

//那么我们记录的这个在线用户信息怎么打印或显示出来呢?
//可以在jsp中这样写   当前在线人数为:${applicationScope.peopleOnline }


第三类监听 可以坚挺到request的创建和销毁,什么是request就是用户访问我们的网站任何一次请求都是requset,那么我们可以利用这一特性去记录我们网站的访问量
那么具体代码是怎么实现的呢?
public class RequestLinstener implements ServletRequestListener {

	/**
     * @see ServletRequestListener#requestInitialized(ServletRequestEvent)
     */
 //同样的只用我们实现了ServletRequestListener接口在有请求的时候才能触发这个方法
    public void requestInitialized(ServletRequestEvent sre) {
        // TODO Auto-generated method stub
    	System.out.println("request被创建");
    	//统计网站访问量
    	ServletContext context = sre.getServletRequest().getServletContext();
        Integer count = (Integer) context.getAttribute("requestCount");
        if (count == null) {
            count = 1;
        } else {
            count++;
        }
        context.setAttribute("requestCount", count);
    }
	/**
     * @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
     */
    public void requestDestroyed(ServletRequestEvent sre) {
        // TODO Auto-generated method stub
    	System.out.println("request正在销毁");
    }
}
那么这个数据我在页面上怎么显示出来呢?
访问量:${applicationScope.requestCount }


猜你喜欢

转载自patronli.iteye.com/blog/2336478