Listener监听器
Listener是什么(怎么理解监听)
- 它是一个接口,可以监听客户端的请求、服务端的操作等。注意:内容有我来实现
- 它需要注册(web.xml中注册)
- 监听中的方法会在特殊事件发生时调用
javaWeb中一共有8个监听
- 事件源,就是三大域
- ServletContext
- 生命周期监听
- ServletContextListener,有两个方法,一个出生时调用,一个死亡时调用
- 属性监听
- ServletContextAttributeListener,有三个方法,分别在添加、覆盖、移除时调用
- 生命周期监听
- HttpSession
- 生命周期监听
- HttpSessionListener,有两个方法,一个出生时调用,一个死亡时调用
- 属性监听
- HttpSessionAttributeListener,有三个方法,分别在添加、覆盖、移除时调用
- 生命周期监听
- ServletRequest
- 生命周期监听
- ServletRequestListener,有两个方法,一个出生时调用,一个死亡时调用
- 属性监听
- ServletRequestAttributeListener,有三个方法,分别在添加、覆盖、移除时调用
- 生命周期监听
- ServletContext
代码实现步骤(生命周期监听)
实现ServletContextListener
- 创建一个类,实现ServletContextListener接口
- 重写生命周期方法
- contextDestroyed(ServletContextEvent sce)
- 销毁时调用
- contextInitialized(ServletContextEvent sce)
- 创建时调用
- ServletContextEvent最主要的就是拿到事件源通过getServletContext() 方法
- contextDestroyed(ServletContextEvent sce)
- 作用(重点)
- 在项目中,可能有一些tomcat需要的启动数据,可以在contextInitialized方法方法中初始化
HttpSessionListener
- 创建一个类,实现HttpSessionListener接口
- 重写生命周期方法
- sessionCreated(HttpSessionEvent se)
- 创建时调用
- HttpSessionEvent拿到事件源,通过getSession() 方法
- sessionDestroyed(HttpSessionEvent se)
- 销毁时调用
- sessionCreated(HttpSessionEvent se)
ServletRequestListener
- 创建一个类,实现ServletRequestListener接口
- 重写生命周期方法
- requestDestroyed(ServletRequestEvent sre)
- 销毁时调用
- requestInitialized(ServletRequestEvent sre)
- 创建时调用
- ServletRequestEvent拿到事件源,getServletRequest()和getServletContext()方法
- requestDestroyed(ServletRequestEvent sre)
代码实现步骤(属性监听)(不常用)
- ServletContextAttributeListener
- 创建一个类,实现ServletRequestListener接口
- 重写方法
- attributeAdded(ServletContextAttributeEvent scab)
- 向ServletCOntext中添加属性时调用
- getName()
- getValue()
- getServletContext()等方法
- attributeRemoved(ServletContextAttributeEvent scab)
- 向ServletCOntext中移除属性时调用
- getName()
- getValue()
- getServletContext()等方法
- attributeReplaced(ServletContextAttributeEvent scab)
- 向ServletCOntext中添覆盖属性时调用
- getName()
- getValue()
- getServletContext()等方法
- attributeAdded(ServletContextAttributeEvent scab)
- 其他的原理一样,这个请自己动手扩展一下
感知监听器(都与HttpSession相关)
- 它用来添加到JavaBean中
- 这两个监听器都不要在web.xml中注册
- HttpSessionBindingListener
- JavaBean类去实现这个接口,并重写方法
- valueBound(HttpSessionBindingEvent event)
- 加载到session中时调用
- HttpSessionBindingEvent下的方法
- getSession()
- getName()
- getValue()
- valueUnbound(HttpSessionBindingEvent event)
- 从session中移除时会被调用
- HttpSessionBindingEvent下的方法
- getSession()
- getName()
- getValue()
- 作用:javaBean这个了知道什么时候被session加载,什么时候被session抛弃
- HttpSessionBindingListener
Session的钝化和活化
我们知道当把数据存储到session中时,服务器关闭在重启的时候,我们浏览器访问数据还是可以访问到的
因为服务器会在服务器关闭的时候把所有session存到硬盘的SESSIONS.ren中,等服务再次启动时再从SESSIONS
中拿到数据,这也是session死而复生的秘密(钝化和活化)在项目中为了节约服务器内存而使用钝化和活化
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true" maxActiveSessions="1"> <Store className="org.apache.catalina.session.FileStore" directory="指定文件地址"> </Store> </Manager>
HttpSessionActivationListener
javabean类实现这个接口,并重写钝化和活化调用时的方法方法
- sessionDidActivate(HttpSessionEvent se)
- 活化时调用
- sessionWillPassivate(HttpSessionEvent se)
- 钝化时调用
- sessionDidActivate(HttpSessionEvent se)
注意:javabean如果就这样随着钝化的话这个类是不会保存在硬盘上的他会死掉,没有钝化的”通行证”。想活下来就要序列化。就是实现java.io.Serializable