JavaWeb笔记之快速了解Listener监听器

                                                        Listener监听器

监听器介绍

1.    什么是监听器

                     Javaweb中的监听器是用于监听web常见对象HttpServletRequest,HttpSession,ServletContext

2.监听器的作用
       1) 监听web对象创建与销毁.
2) 监听web对象的属性变化
3) 监听session绑定javaBean操作.
3.监听机制相关概念

1.事件----一件事情

2.事件源---产生这件事情的源头

3.注册监听---将监听器与事件绑定,当事件产生时,监听器可以知道,并进行处理。

4.监听器---对某件事情进行处理监听的一个对象

web监听器介绍

1.javaweb监听器介绍

1.监听web对象创建与销毁的监听器

                            ServletContextListener

                            HttpSessionListener

                            ServletRequestListener  

2.监听web对象属性变化

                            ServletContextAttributeListener

                            HttpSessionAttributeListener

                            ServletRequestAttributeListener   

3.监听session绑定javaBean

                            HttpSessionBindingListener

                            HttpSessionActivationListener

2.   javaweb监听器创建步骤

Ø  创建一个类,实现指定的监听器接口      

Ø  重写接口中的方法.

Ø  在web.xml文件中配置监听

演示监听对象创建与销毁

1.ServletContext对象的创建与销毁监听

Ø  ServletContext对象的创建与销毁分析

ServletContext对象是服务器开启时创建。服务器关闭时销毁。

Ø  监听ServletContext对象的创建与销毁

2.HttpSession对象的创建与销毁监听

Ø  1.HttpSession对象的创建与销毁分析

session对象创建:取决于请求中是否有jsessinid,如果有,可能会获取一个已经存在的session对象。如果没有,会创建一个新的session对象.

销毁session:

              1.默认超时 30分钟

              2.关闭服务器

              3.invalidate()方法

              4.setMaxInactiveInterval(intinterval) 可以设置超时时间

Ø  2.监听HttpSession对象的创建与销毁

3.HttpServletRequest对象的创建与销毁监听

Ø  1.HttpServletRequest对象的创建与销毁分析

request对象是发送请求时创建,当响应产生时,销毁.

Ø  2.监听HttpServletRequest对象的创建与销毁

演示监听属性变化

1.javaweb中监听属性变化API介绍
ServletContextAttributeListener(下面是常用三个方法,void为返回值)

                        void      attributeAdded(ServletContextAttributeEventscab)

void       attributeRemoved(ServletContextAttributeEventscab)

void        attributeReplaced(ServletContextAttributeEvent scab)

HttpSessionAttributeListener

void       attributeAdded(HttpSessionBingdingEventse)

void       attributeRemoved(HttpSessionBingdingEventse)

void        attributeReplaced(HttpSessionBingdingEvent se)

 ServletRequestAttributeListener

void       attributeAdded(ServletRequestAttributeEventsrae)

void       attributeRemoved(ServletRequestAttributeEventsrae)

void        attributeReplaced(ServletRequestAttributeEvent srae)

                    

3.   演示监听session中属性变化

演示监听session绑定javaBean(未讲到)

1.HttpSessionBindingListener监听器功能介绍

                     使javaBean对象在被绑定到会话或从会话中取消对它的绑定时得到通知

2.HttpSessionActivationListener监听器功能介绍

                     绑定到会话的对象可以侦听通知它们会话将被钝化和会话将被激活的容器事件

3.注意事项

                     这两个监听器比较特殊,它是由javaBean来实现的,并且不需要在web.xml文件中注册监听.

                     javaBean必须是序列化的.

4.演示HttpSessionBindingListener功能

                     javaBean自动感知绑定到session中以及从session中移除.

                     public voidvalueBound(HttpSessionBindingEvent event) {

                            System.out.println("绑定了user对象到了session");

                     }

                     public voidvalueUnbound(HttpSessionBindingEvent event) {

                            System.out.println("从session中移除了user对象");

                     }

5.演示HttpSessionActivationListener功能

                     1.bean1.jsp中向session存储一个user对象

                     2.bean2.jsp中从session中获取user对象的name属性

                     3.User类实现接口HttpSessionActivationListener,可以监听到活化与钝化操作

                     4.做一个配置文件,来设定当活化与钝化操作时文件的位置.

                           

                            在meta-inf目录下创建一个context.xml文件

                            <Context>

                                   <ManagerclassName="org.apache.catalina.session.PersistentManager"maxIdleSwap="1">

                                          <StoreclassName="org.apache.catalina.session.FileStore"directory="it315"/>

                                   </Manager>

                            </Context>

监听器案例--定时销毁过期session分析

1.功能描述

                         案例:如果session对象超过15秒没有使用就销毁。

public class MyListener3 implements ServletContextListener ,HttpSessionListener{
    @Override
   
public void contextInitialized(ServletContextEventservletContextEvent) {
        //创建一个存放session的集合
       
List<HttpSession> sessions = new ArrayList<>();
        //利用Context全局参数设置一个sessions属性
       
servletContextEvent.getServletContext().setAttribute("sessions",sessions);
        //创建一个定时器
       
Timer timer = new Timer();
        //给定时器添加一个定时操作和延迟时间,及每隔多少时间执行一次
       
timer.schedule(new TimerTask() {
            @Override
           
public void run() {
               Iterator<HttpSession> iterator = sessions.iterator();
                while (iterator.hasNext()){
                    HttpSession session =iterator.next();
                    long lastAccessedTime= session.getLastAccessedTime();
                    long timeMillis =System.currentTimeMillis();
                    //判断session创建后的时间到目前为止是否超过了15
                   
boolean flag =(timeMillis-lastAccessedTime)>15000;
                    if(flag){
                        //session的创建超过15秒就销毁session
                       
iterator.remove();
                        session.invalidate();
                    }else{
                        System.out.println("先放过你...");
                    }

                }
            }
        },15000,15000);

    }

    @Override
   
public void contextDestroyed(ServletContextEventservletContextEvent) {

    }

    @Override
   
public void sessionCreated(HttpSessionEventhttpSessionEvent) {
        System.out.println("MyListener3.sessionCreated  创建了,不过只能存活15");
        //当察觉创建了一个新的session的时候,获取到这个session
       
HttpSession sessionNew= httpSessionEvent.getSession();
        ServletContext servletContext =sessionNew.getServletContext();
        //Context中的sessions全局数据重新获取一遍
       
List<HttpSession> sessions =(List<HttpSession>);             servletContext.getAttribute("sessions");
        //将新的session放入到sessions
       
sessions.add(sessionNew);
        servletContext.setAttribute("sessions",sessions);
    }

    @Override
   
public void sessionDestroyed(HttpSessionEventhttpSessionEvent) {
        System.out.println("MyListener3.sessionDestroyed   因为15秒没用 所以销毁喽");
    }
}

      

      

 

 

猜你喜欢

转载自blog.csdn.net/DaySurprise/article/details/78629948