黑马程序员_Servlet监听器技术

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------


学习了方立勋老师Web开发第二十天,Servlet的开发技术,总结一下。

一.观察者设计模式

 首先描述java的事件监听机制
1.事件监听涉及到三个组件:事件源,事件对象,事件监听器
2.当事件源上发生某一个动作是,它会调用事件监听器的一个方法,并在调用该方法时把事件对象传递进去,开发人员在监听器中通过事件对象就可以拿到事件源,从而对事件源进行操作。

第二,如何做一个事件源,被监听器监听

public class Demon2 {
//测试
public static void main(String[] args) {
	Person p=new Person();
	p.registerListener(new PersonListener() {
		
		@Override
		public void dorun(Event e) {
			System.out.println(e.getSource()+"跑。。");
			
		}
		
		@Override
		public void doeat(Event e) {
			System.out.println("吃。。");
			
		}
	});
	p.run();
}
}
class Person{
	private PersonListener listener;
	public void eat(){
		if(listener!=null){
			listener.doeat(new Event(this));
		}
	}
	public void run(){
		if(listener!=null){
			listener.dorun(new Event(this));
		}
	}
	public void registerListener(PersonListener listener){
		this.listener=listener;
	}
}
//设计接口
interface PersonListener{
	public void doeat(Event e);
	public void dorun(Event e);
}
class Event{
	//封装Person
	Person source;	
	public Event() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Event(Person source) {
		super();
		this.source= source;
	}

	public Person getSource() {
		return source;
	}

	public void setSource(Person source) {
		this.source = source;
	}
	
}

二.关于servlet监听器技术的一些实用例子

1.实现HttpSessionListener和ServletContextListener两个接口,常常可以用来做一个自定义的session扫描器。用于能定时扫描服务器的session,可以让经过一定时间没被用到的session硬化,即存在硬盘中,从而提高服务器的性能。其中完成自定义的session扫描器用到了Timer 这个工具类,通过查阅API文档,我们知道可以调用schedule方法,来达到定时做什么任务的目的。Timer 这个工具类在开发中经常会使用到,比如定时发送邮件,也可以用到Timer工具类。以下是自定义session扫描器的实现的代码。

import java.util.Collections;
import java.util.Iterator;

import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//自定义session扫描器
public class SessionScanerListener implements HttpSessionListener,ServletContextListener {
	
   private List<HttpSession> list= Collections.synchronizedList(new LinkedList<HttpSession>());
   private Object lock;
	public void sessionCreated(HttpSessionEvent se) {
		HttpSession session=se.getSession();
		//避免添加的时候,两个session同时抢一个位置,所以要线程安全封装一下
		synchronized(lock){
          list.add(session);
		}
        System.out.println("session被创建");
	}


	public void sessionDestroyed(HttpSessionEvent se) {
		
       System.out.println("session被摧毁");
	}


	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		Timer timer=new Timer();
		timer.schedule(new MyTask(list,lock), 0, 1000*60);//1分钟
		
	}

} 

class MyTask extends TimerTask{
	private List<HttpSession> list;
	private Object lock;
	public MyTask(List list,Object lock){
		this.list=list;
		this.lock=lock;
	}
	public void run() {
		synchronized(lock){
		ListIterator it=list.listIterator();
		while(it.hasNext()){
			HttpSession session=(HttpSession) it.next();
			if((System.currentTimeMillis()-session.getLastAccessedTime())>=1000*60){
				session.invalidate();
				list.remove(session);
			}
		}
		}
	}
}
另外在实现接口这后,监听器的调用方法是在web.xml中配置,例如:

<listener>
  <listener-class>com.study.web.listener.SendMailListener</listener-class>
  </listener>

另外可以通过HttpSessionListener这个接口,做一个类似论坛的在线人数的统计。另外,由与session的生命周期是从创建时就开始,到session不被调用,或者浏览器关闭后,服务器仍会替保存session三十分钟,这个三十分钟是可以配置的。所以即使论坛上一些人已经离开,又因为服务器会保存session三十分钟的特点,所以这些论坛在线人数的统计只是大概的数字。




---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值