Servlet监听器listener

Servlet监听器listener

监听器的定义

用于在监听对象事件的发生前、发生后等情况时进行操作处理。

监听器类型

在Java Web中,监听的事件源为ServletContext、HttpSession、ServletRequest 3大对象。其中ServletContext和HttpSession对象在应用启动时创建,只有一个实例;ServletRequest,每次有请求过来时创建,请求结束后销毁。
按照监听对象分类:
- ServletContextListener 监听应用启动和关闭
- HttpSessionListener 监听会话产生和销毁
- ServletRequestListener 监听每个请求初始化&结束
按照监听事件分类
- ServletContextAttributeListener
- HttpSessionAttributeListener
- ServletRequestAttributeListener
用于监听对象中属性的增加、删除等事件,当调用相应对象的setAttribute()、removeAttribute()方法设置属性时,监听器可进行捕获。

当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由 ServletContextListener 来处理。

代码示例

创建web工程
在src下添加类

package com.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * Created by chenxin on 16/5/31.
 */
public class TestListener implements ServletContextListener{

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("此处完成一些初始化工作");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("此处完成一些销毁结束工作");
    }
}

在web.xml中注册监听器

 <listener>
        <listener-class>com.listener.TestListener</listener-class>
    </listener>

部署在Tomcat下,启动后再stop,可以看到控制台输出如下:
这里写图片描述
如图,打印出了在启动和关闭事件时的处理内容。

使用Spring时,在web.xml中注册ContextLoaderListener,作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

listener、filter、servlet的加载顺序

顺序依次为:
ServletContext(ContextParam) -> listener -> filter -> servlet
对于servlet,2节点不存在情况下,servlet被请求时才被初始化.
所以, context-param 配置节点并不是一定要写在 listener 配置节前。

当然,对于某一类节点来说,加载顺序与它们在 web.xml 文件中的先后顺序有关。

以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。
servlet 同 filter 类似,此处不再赘述。

所以,同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值