一、监听器
- 事件源:发送事件的对象.
- 事件:主要作用是对事件源的封装.
- 监听器:接口。传入事件对象。监听事件源上发生的事件
二、Servlet规范中的监听器(8个)
- 监听对象的创建和销毁 (3个)
- 监听的对象:ServletContext、HttpSession、ServletRequest.
- 它们分别是在何时创建和销毁的?
- 具体监听器:ServletContextListener、HttpSessionListener、ServletRequestListener.
- ServletContextListener:监听 ServletContext何时创建和销毁
- //使用场景:非常有用
- //ServletContext在一个应用中唯一的,容器加载应用时就创建
- public class MyServletContextListener implements ServletContextListener {
- public void contextDestroyed(ServletContextEvent sce) {
- System.out.println("ServletContext销毁了");
- }
- //完成一些系统级别的初始化工作
- public void contextInitialized(ServletContextEvent sce) {
- System.out.println("ServletContext创建了");
- //加载配置文件中的所有bean,并完成实例化
- //Spring:写了一个监听器。实现了ServletContextListener接口
- //Spring要想与web整合:只需要把Spring的这个监听器类在web.xml中进行注册即可
- }
- }
- HttpSessionListener :监听 HttpSession 何时创建和销毁: httpsession在第一次request.getSession()时被创建,销毁session只有两种方式
- //使用场景:统计当前内存中的HttpSession对象的个数。定时搜索session案例
- //HttpSessionListener:监听会话对象的创建。找个唯一的容器存起来
- //ServletContextListener:创建定时器,并启动,
- public class SessionScanner implements HttpSessionListener,ServletContextListener {
- private List<HttpSession> sessions = Collections.synchronizedList(new LinkedList<HttpSession>());//唯一的
- private Object lock = SessionScanner.class;//唯一
- //抓住session对象
- public void sessionCreated(HttpSessionEvent se) {
- System.out.println("会话对象创建了");
- HttpSession session = se.getSession();
- synchronized (lock) {
- sessions.add(session);
- }
- }
- //定时器启动
- public void contextInitialized(ServletContextEvent sce) {
- Timer t = new Timer();
- TimerTask task = new MyTimerTask(sessions,lock);//扫描sessions,看哪个session对象超过1分钟没有使用了,主动invalidate
- t.schedule(task, 0, 1000*60);
- }
- public void sessionDestroyed(HttpSessionEvent se) {
- System.out.println("会话对象销毁了");
- }
- public void contextDestroyed(ServletContextEvent sce) {
- }
- }
- class MyTimerTask extends TimerTask{
- private List<HttpSession> sessions;
- private Object lock;
- public MyTimerTask(List<HttpSession> sessions, Object lock){
- this.sessions = sessions;
- this.lock = lock;
- }
- //具体任务
- public void run() {
- synchronized (lock) {
- ListIterator<HttpSession> it = sessions.listIterator();
- while(it.hasNext()){
- HttpSession session = it.next();
- if(System.currentTimeMillis()-session.getLastAccessedTime()>1000*60){
- session.invalidate();
- it.remove();
- }
- }
- }
- }
- }
- ServletRequestListener :监听 ServletRequest 何时创建和销毁
- //使用场景:统计各个web资源的使用频率
- public class MyServletRequestListener implements ServletRequestListener {
- public void requestDestroyed(ServletRequestEvent sre) {
- System.out.println("请求销毁了");
- }
- public void requestInitialized(ServletRequestEvent sre) {
- System.out.println("请求创建了");
- }
- }
- ServletContextListener:监听 ServletContext何时创建和销毁
- 如何注册监听器:在 web.xml中配置
- <listener>
- <listener-class>com.itheima.servlet.listener.MyServletContextListener</listener-class>
- </listener>
- 监听三大域对象域中变化的监听器 (3个)
- 监听的域对象:ServletContext、HttpSession、ServletRequest. (page除外)
- 作用向域中添加了东东:setAttribute...
- 具体监听器:ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener.
- ServletContextAttributeListener监听ServletContext域中的属性信息:
- public void attributeAdded(ServletContextAttributeEvent scab) {
- public void attributeRemoved(ServletContextAttributeEvent scab) {
- public void attributeReplaced(ServletContextAttributeEvent scab) {
- HttpSessionAttributeListener 监听HttpSession域中的属性信息 :
- public void attributeAdded(HttpSessionBindingEvent se) {
- public void attributeRemoved(HttpSessionBindingEvent se) {
- public void attributeReplaced(HttpSessionBindingEvent se) {
- ServletRequestAttributeListener 监听ServletRequest域中的属性信息 :
- public void attributeAdded(ServletRequestAttributeEvent srae) {
- public void attributeRemoved(ServletRequestAttributeEvent srae) {
- public void attributeReplaced(ServletRequestAttributeEvent srae) {
- ServletContextAttributeListener监听ServletContext域中的属性信息:
- 注册监听器:
- 在 web.xml中配置
- <listener>
- <listener-class>com.itheima.servlet.listener.MyServletContextListener</listener-class>
- </listener>
- 在 web.xml中配置
- 感知性监听器 (2个)
- 不需要注册。实现这些监听器的类,能感知自己的行为。
- HttpSessionBindingListener:实现该接口的普通类,能感知自己什么时候被HttpSession绑了,什么时候被解绑了。
- HttpSessionActivationListener:实现该接口的普通类,能感知自己什么时候随着session对象去了,什么时候复活了。(钝化--活化)