JavaWeb入门(八)- Servlet监听器Listener

1. Servlet 监听器简介

监听器是专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。

Servlet 监听器是Servlet 规范中定义的一种特殊类,它用于监听 web 应用程序中的ServletContext, HttpSession 和 ServletRequest 等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

按监听的事件类型 Servlet 监听器可分为如下三种类型:

  1. 监听域对象自身的创建和销毁的事件监听器
  2. 监听域对象中的属性的增加和删除的事件监听器
  3. 监听绑定到 HttpSession 域中的某个对象的状态的事件监听器
2. 如何编写一个Servlet监听器?

Servlet 规范为每种事件监听器都定义了相应的接口,开发人员编写的事件监听器程序只需实现这些接口,web 服务器根据用户编写的事件监听器所实现的接口把它注册到相应的被监听对象上。实现接口的代码如下:

一些 Servlet 事件监听器需要在 web 应用程序的 web.xml 文件中进行注册,一个 web.xml 文件中可以注册多个 Servlet 事件监听器,web 服务器按照它们在 web.xml 文件中的注册顺序来加载和注册这些 Serlvet 事件监听器。注册代码如下:

Serlvet 事件监听器的注册和调用过程都是由 web 容器自动完成的,当发生被监听的对象被创建,修改或销毁事件时,web容器将调用与之相关的 Servlet 事件监听器对象的相关方法,开发人员在在这些方法中编写的事件处理代码即被执行。由于一个 web 应用程序只会为每个事件监听器创建一个对象,有可能出现多个线程同时调用同一个事件监听器对象的情况,所以,在编写事件监听器类时,应考虑多线程安全的问题

3. ServletContextListener

ServletContextListener是监听 ServletContext 对象被创建或销毁的 Servlet 监听器。

3.1 如何创建?

创建的步骤如下:

1. 创建一个实现了 ServletContextListener 的类, 并且实现其中的两个方法
	public class HelloServletContextListner implements ServletContextListener

2. 在 web.xml 文件中配置 Listener
	<listener>
		<listener-class>com.atguigu.javaweb.test.HelloServletContextListner</listener-class>
	</listener>
3.2 ServletContextListener的使用场景

ServletContextListener 是最常用的 Listener, 可以在当前 WEB 应用被加载时对当前 WEB 应用的相关资源进行初始化操作:

  • 创建数据库连接池,
  • 创建 Spring 的 IOC 容器,
  • 读取当前 WEB 应用的初始化参数 …
3.3 相关接口
  • public void contextInitialized(ServletContextEvent sce)

SerlvetContext 对象被创建(即, 当前 WEB 应用被加载时)的时候, Servlet 容器调用该方法.

  • public void contextDestroyed(ServletContextEvent sce)

SerlvetContext 对象被销毁之前(即, 当前 WEB 应用被卸载时)的时候, Servlet 容器调用该方法.

  • ServletContextEvent.getServletContext()

获取 ServletContext

4. ServletRequestListener & HttpSessionListener

ServletRequestListener & HttpSessionListener 和 ServletContextListener 类似。利用 ServletRequestListener、HttpSessionListener 以及 ServletContextListener 可以把 探测出Servlet中的相关类,如request, session及 application 的生命周期.

4.1 request对象的生命周期

request是一个请求,。当发送一个请求的时候,request对象即被创建。当一个响应返回时, 即被销毁. 当发送一个请求时被创建。
注意, 请求转发的过程是一个 request 对象.
即若请求到目标页面a.jsp中,a.jsp将请求转发给b.jsp.在这个过程中,只有一个reques对象被创建。
而, 重定向的过程是一个 request 对象.

4.2 session对象的生命周期

Session被创建的情况:
第一次访问 WEB 应用的一个 JSP 或 Servlet 时, 且该 JSP 或 Servlet 中还需要创建 session 对象. 此时服务器会创建一个 session 对象.

Session被销毁的情况:
①Session过期,session被销毁。
②调用session的invalidate方法时,session被销毁。
③当前 web 应用被卸载时,session并不一定会被销毁,因为有的服务器会将session持久化保存在本地。

关闭浏览器, 并不意味着 session 被销毁, 还可以通过 sessionid 找到服务器中的 session 对象.

4.3 application对象的生命周期

贯穿于当前的 WEB 应用的生命周期. 当前 WEB 应用被加载时,创建 application对象, 当前 WEB 应用被卸载时,销毁 application 对象.

5. 域对象中属性的变更的事件监听器

域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。
这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同 。

各个域属性监听器中的完整语法定义为:

public void attributeAdded(ServletContextAttributeEvent scae) 
public void attributeReplaced(HttpSessionBindingEvent  hsbe) 
public void attributeRmoved(ServletRequestAttributeEvent srae)

ServletRequestAttributeListener 为例,说明该接口的相关方法:

  1. 添加属性时被调用
public void attributeAdded(ServletRequestAttributeEvent srae) {
	System.out.println("向 request 中添加了一个属性...");
}
  1. 移除属性时被调用
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
	System.out.println("从 request 中移除了一个属性...");
}
  1. 替换属性时被调用.
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
	System.out.println("request 中属性替换了...");
}

ServletContextAttributeListener,ServletRequestAttributeListener, HttpSessionAttributeListener 等这三个监听器较少被使用.

6. 感知 Session 绑定的事件监听器

感知 Session 绑定的事件监听器,是Servlet 规范中定义了两个特殊的监听器接口来帮助 JavaBean 对象了解自己在 Session 域中的这些状态。这两个接口分别是HttpSessionBindingListener接口和HttpSessionActivationListener接口 ,实现这两个接口的类不需要 web.xml 文件中进行注册

6.1 HttpSessionBindingListener接口

HttpSessionBindingListener接口实现了HttpSessionBindingListener接口的 JavaBean 对象可以感知自己被绑定到 Session 中和从 Session 中删除的事件。

当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的 void valueBound(HttpSessionBindingEvent event) 方法。

当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的 void valueUnbound(HttpSessionBindingEvent event)方法。

统计当前在线人数列表的功能是使用该监听器实现的一个常见的应用。

6.2 HttpSessionActivationListener接口

实现了HttpSessionBindingListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件。

当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前,web 服务器调用该对象的 void sessionWillPassivate(HttpSessionBindingEvent event) 方法。

当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后,web 服务器调用该对象的 void sessionDidActive(HttpSessionBindingEvent event)方法。

活化:从磁盘中读取 session 对象。
钝化:向磁盘中写入 session 对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值