监听器就是实现特定接口的Java类,这个类专门用于监听另一个Java对象的方法调用或者属性改变,当监听对象发生上述事件后,监听器某个方法将立即被执行
JavaWeb中的监听器
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,主要是用于监听Servlet域中的ServletContext、HttpSession和ServletRequest等对象的创建、销毁,属性发生改变的事件。
所以JavaWeb中的监听器主要是三类
ServletContextListener:监听ServletContext的初始化和销毁
HttpSessionListener:监听HttpSession域中的某个对象的状态
ServletRequestListener:监听ServletRequest域对象的创建和销毁
关于Listener的配置,同样有两种方法配置
web.xml中配置
2.用注解@WebListener配置
ServletContextListener
有两个方法:
contextInitialized(ServletContextEvent sce),官方注解是:此方法在 servlet context 初始化时被调用(当web项目部署的时候),你可以在这个方法里初始化相关的servlet context
contextDestroyed(ServletContextEvent sce),官方注解是:此方法在 servlet context被取消部署,或者关闭服务器的时候被调用
翻译可能有点不专业,具体的可以看官方注解
Debug发现,在启动项目时,会调用contextInitialized方法
在停止项目时,会调用contextDestroyed方法
至此,ServletContextListener简单的例子算是完成。
HttpSessionListener
有两个方法:
sessionCreated(HttpSessionEvent se),官方注解:Session被创建
sessionDestroyed(HttpSessionEvent se),官方注解:Session被销毁
为了测试这两个方法,修改方法如下
因为要测试Session的过期方法,所以要在配置文件中配置Session的过期时间为1分钟,当在这段时间内,之前的请求未有新的操作,则会把对应的Session过期掉。
Debug模式,发现控制台输出三次请求的SessionID,如果在sessionCreated打上断点,会发现,这个方法中的断点会命中三次。
但是查看起的页面的SessionID是最后一次的请求
按照理论来讲,这个方法只会请求一次,但是为什么这里会请求三次,这是因为测试的时候是在IDEA中Debug,前两次的请求User-Agent 是IDEA,IDEA请求两次判断该进程是否keep-alive
然后用新的浏览器访问http://localhost:8080/,发现控制台中输出了新的SessionID,说明有新的会话建立
因为在配置文件中配置的是1分钟过期,所以在1分钟后,陆续发现调用sessionDestroyed
至此,HttpSessionListener测试完成,一般这个监听器可以用来统计你的站点有多少人登陆等功能
ServletRequestListener
有两个方法:
requestInitialized(ServletRequestEvent servletRequestEvent),用户每一次访问都会创建request对象,调用该方法
requestDestroyed(ServletRequestEvent servletRequestEvent),当前访问结束,request对象就会销毁,调用该方法
修改测试用例如下
发现debug的时候,会有三次创建和销毁,说明一切如预期一样,但是为什么会有三次,理由和HttpSessionListener一样,因为IDEA会请求两次
至此,JavaWeb的基本的监听器已经讲解完成了。这三个监听器只是监听对应对象的创建和销毁,与之对应的还有三个监听器用来监听者三个对象中的属性变更信息,这三个监听器分别是:ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener,至于其中的方法,这里就不细讲,基本上和上面的方法类似。
感知Session绑定的事件监听器
Servlet规范中定义了两个特殊的监听器接口:HttpSessionBindingListener和HttpSessionActivationListener。这两个监听器来帮助JavaBean对象链接自己在Session域中的状态。再者,实现这两个接口的类不需要在web.xml文件中配置。
HttpSessionBindingListener
有两个方法:
valueBound(HttpSessionBindingEvent httpSessionBindingEvent):当对象被绑定到HttpSession对象中时,web服务器调用该对象的该方法
valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent):当对象从HttpSession对象中解除绑定时,web服务器调用该对象的该方法
其实也就在调用session.setAttribute()方法时会触发valueBound方法,在调用session.removeAttribute方法时会触发valueUnbound,这个监听器主要就是监听session的绑定和解绑
修改ListenerDemo类如下
修改index.jsp如下
当debug时,因为会访问页面index.jsp,然后页面会执行绑定和解绑session的方法,这时救护触发该监听器的两个方法,所以控制台会输出改造后的方法中的信息
HttpSessionActivationListener
在介绍这个监听器之前,先介绍两个概念:活化、钝化
活化:javabean对象和session一起被反序列化(活化)到内存中
钝化:javabean对象如果存在session中,当服务器把session序列化到硬盘上时,如果session中的javabean对象实现了Serializable接口,那么服务器会把session中的javabean对象一起序列化到硬盘上,这个操作就叫钝化,但是如果javabean没有实现Serializable接口,那么服务器会先把没有实现Serializable接口的javabean对象移除,然后再钝化到硬盘中。
该接口也有两个方法:
sessionWillPassivate(HttpSessionEvent httpSessionEvent):当绑定在session中的javabean将要被钝化到硬盘中,会调用这个方法
sessionDidActivate(HttpSessionEvent httpSessionEvent):当绑定在session中的javabean将要被活化到内存中,会调用这个方法
修改ListenerDemo如下
修改index.jsp如下
当debug的时候,页面会打印出当前的sessionID
然后退出debug时,控制台会输出
查找文件,可以发现文件夹中会有一个文件
说明钝化成功。
至于活化的流程,和钝化类似,这里不在叙述
以上就是javaweb的大都数监听器,因为这些在实际开发中用的次数还是很多的,所以还是很有必要掌握的。
网友评论