Listener 监听器
Listener
- 能做什么
监听器,监听某一个事件的发生,状态的改变
监听器的内部机制(原理)
其实就是接口回调
接口回调
- 条件:A 在执行循环,当循环到5的时候,通知 B。
事先先把一个对象传递给 A ,当 A 执行到5的时候,通过这个对象,来调用 B
中的方法,但是注意的是,不是直接传递的实例,而是传递一个接口的实例。
类似于接口的多态实现,在 A方法的参数中使用一个接口作为参数传入,然后在之后书写 B 类的时候,让B继承该接口,这样在调用A方法的时候,就可以将 B 类作为参数传入,并且调用的是B类已经实现的接口方法,这样就可以做到通用性。
Web监听器
共有8个划分为三种类型
监听三个作用域的创建和销毁(三个)
实现相应监听器Listener接口的时候,还需要在web.xml中对监听器进行注册,才能正常的使用:
注册监听器
<listener>
<listener-class>Listener.MyServletContextListener</listener-class>
</listener>
request --- httpServletRequest
session --- httpSession
application --- ServletContext
1.ServletContextListener
创建:
启动服务器的时候
销毁:
关闭服务器;从服务器移除项目
2.ServletResquestListener
创建:
访问服务器上的任意资源都会出现。(html,jsp,servlet)
销毁:
当服务器对这次请求做出响应的时候。
3.HttpSessionListener
创建:
只要有调用到getSession()这个方法的时候
html(不会);jsp(会,因为Session是jsp的内置对象,源码中带有getSession方法);Servlet(会)
销毁:
超时(30分钟);非正常关闭(销毁);正常关闭服务器(序列化)
作用:
ServletContextListener
利用它来,在ServletContext创建的时候。
1.完成自己想要的初始化工作
2.执行自定义任务调度,执行某一个任务。(如Timer,定时完成某些任务)
HttpSessionListener
统计在线人数
监听三个作用域属性状态变更(三个)
可以监听在作用域值中 添加 | 替换 | 移除的动作
- servletContext — ServletContextAttributeListener
<%
application.setAttribute("name2","cc2");
application.setAttribute("name2","cc3");
application.removeAttribute("name2");
%>
------------------监听器------------------------
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("ServletContextContext属性被添加了了");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("ServletContextContext属性被移除了了");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("ServletContext属性被替换了了");
}
- session — HttpSessionAttributeListener
session.setAttribute("name", "kk");
session.setAttribute("name","kk1");
session.removeAttribute("name");
- request — ServletRequestAttributeListener
request.setAttribute("name1","aa");
request.setAttribute("name1","aa1");
request.removeAttribute("name1");
监听httpSession里面存值的状态变更
这一类的监听器不用注册
-
HttpSessionBindingListener
1.让javaBean实现该接口即可
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("对象被绑定进来了");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("对象被解除绑定了");
}
- HttpSessionActivationListener
用于监听现在Session的值是钝化(序列化),还是活化(反序列化)的动作
PS:还需要在类实现 Serializable接口,打上序列化的标记
- 钝化(序列化)
把内存中的数据,存储到硬盘上,也就是把session里的值存到本地。
- 活化(反序列化)
把硬盘中的数据,读取到内存中,也就是把本地存的session的值,加载到浏览器中。
- session的钝化活化的用意何在
session中的值可能会很多,如果我们有很长一段时间不使用这个内存中的值,那么可以考虑将session的值存储到硬盘上【钝化】,等下一次使用的时候,再从硬盘上提取出来。【活化】
- 如何让session在一定时间内钝化
做配置即可
1. 在tomcat里面 conf/context.xml 里面配置
对所有的运行在这个服务器的项目生效
2. 在C:\Users\Administrator\.IntelliJIdea2018.2\system\tomcat\Tomcat_9_0_14_Listener\conf 配置(IDEA)
对 localhost生效。 localhost:8080
3. 在自己的web工程项目中的 META-INF/context.xml
只对当前的工程生效。
maxIdleSwap : 1分钟不用就钝化
directory : 钝化后的那个文件存放的目录位置。
D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\itheima
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>