Javaweb组件--Listener

作者: a1ie2 | 来源:发表于2017-11-21 16:29 被阅读26次

监听器就是实现特定接口的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的大都数监听器,因为这些在实际开发中用的次数还是很多的,所以还是很有必要掌握的。

相关文章

网友评论

    本文标题:Javaweb组件--Listener

    本文链接:https://www.haomeiwen.com/subject/giywvxtx.html