JavaWeb开发--监听器(Listener)

监听器(Listener)的概念

监听器就是一个实现特定接口(ServletContextListener,HttpSessionListener,ServletRequestListener等)的普通java程序,这个程序专门用于监听另一个java对象的方法的创建,销毁,调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

  • 事件源:被监听的对象 ----- 三个域对象 request session servletContext
  • 监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器
  • 注册监听器:将监听器与事件源进行绑定
  • 响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码

监听器的工作原理

在这里插入图片描述

  • 操作事件源,产生事件对象,将事件对象传递给监听器,并且执行监听器相应监听方法

监听的对象

  • ServletContext:application,整个应用只存在一个
  • HttpSession:session,针对每一个对话
  • ServletRequest:request,针对每一个客户请求
  • 监听作用:可以在事件发生前、发生后进行一些处理,一般可以用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等。
  • 除了上述的,还有如下表所示:
ServletContextListener用于监听 ServletContext 对象的创建与销毁过程
HttpSessionListener用于监听 HttpSession 对象的创建和销毁过程
ServletRequestListener用于监听 ServletRequest 对象的创建和销毁过程
ServletContextAttributeListener用于监听 ServletContext 对象中的属性变更
HttpSessionAttributeListener用于监听 HttpSession 对象中的属性变更
ServletRequestAttributeListener用于监听 ServletRequest 对象中的属性变更
HttpSessionBindingListener用于监听 JavaBean 对象绑定到 HttpSession 对象和从 HttpSession 对象解绑的事件
HttpSessionActivationListener用于监听 HttpSession 中对象活化和钝化的过程

监听器的基本使用

创建步骤:

创建步骤:

1、创建一个实现监听器接口的类

2、配置web.xml文件,注册监听器

<listener>
    <listener-class>自定义类名</listener-class>
</listener>
  • 监听器的启动顺序:按照web.xml的配置顺序来启动

  • 加载顺序:监听器>过滤器>Servlet
    示例代码:
    这是servlet的代码:

package src.com.wdhcr.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class Servlet05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是servlet的请求方法");
        HttpSession session = req.getSession();
        session.setAttribute("user","张三");
        System.out.println(session.getAttribute("user"));
        session.invalidate();

    }

    @Override
    public void init() throws ServletException {
        System.out.println("这是servlet的初始化方法");
    }

    @Override
    public void destroy() {
        System.out.println("这是servlet的销毁方法");
    }
}

这是过滤器的代码

package src.com.wdhcr.filter;

import javax.servlet.*;
import java.io.IOException;

public class Filter01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("这是filter的初始化方法");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("这是filter的拦截方法");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("这是过滤器放行后");
    }

    @Override
    public void destroy() {
        System.out.println("这是filter的销毁方法。");
    }
}

ServletRequestListener 监听器的代码

package src.com.wdhcr.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

/*
* servletrequest的监听器类
*
* */
public class Listener01 implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {

        System.out.println("这是request监听器的销毁方法");
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("这是request监听器的初始化方法");

    }
}

ServletContextListener 监听器的代码

package src.com.wdhcr.listener;

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

/*
ServletContext的监听器


* */
public class Listener02 implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("这是ServletContext的监听器初始化方法");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("这是ServletContext的监听器销毁方法");
    }
}

HttpSessionListener 监听器的代码

package src.com.wdhcr.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/*
* session监听器的类
*
* */
public class Listener03 implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {

        System.out.println("这是session的初始化方法");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {

        System.out.println("这是session的销毁方法");
    }
}

web.xml文件的配置:


    <servlet>
        <servlet-name>Servlet05</servlet-name>
        <servlet-class>src.com.wdhcr.servlet.Servlet05</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet05</servlet-name>
        <url-pattern>/Servlet05</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>Filter01</filter-name>
        <filter-class>src.com.wdhcr.filter.Filter01</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Filter01</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>src.com.wdhcr.listener.Listener01</listener-class>
    </listener>
    <listener>
        <listener-class>src.com.wdhcr.listener.Listener02</listener-class>
    </listener>
    <listener>
        <listener-class>src.com.wdhcr.listener.Listener03</listener-class>
    </listener>
  • 运行结果如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Servlet监听器分为三大类

1、数据域对象创建和销毁监听器
监听域对象自身的创建和销毁的事件监听器,如:

  • ServletRequestListener的创建和销毁
public class Listener01 implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {

        System.out.println("这是request监听器的销毁方法");
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("这是request监听器的初始化方法");

    }

web.xml文件:

 <listener>
        <listener-class>src.com.wdhcr.listener.Listener01</listener-class>
    </listener>
  • HttpSessionListener的创建和销毁

public class Listener03 implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        
        System.out.println("这是session的初始化方法");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        
        System.out.println("这是session的销毁方法");
    }
}

web.xml文件设置:

 <listener>
        <listener-class>src.com.wdhcr.listener.Listener03</listener-class>
    </listener>
  • ServletContext的创建和销毁
public class Listener02 implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("这是ServletContext的监听器初始化方法");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("这是ServletContext的监听器销毁方法");
    }
}

web.xml文件设置:

 <listener>
        <listener-class>src.com.wdhcr.listener.Listener02</listener-class>
 </listener>

2、数据域对象和属性变更监听器

  • ServletContextAttributeListener 监听ServletContext中属性变化

  • HttpSessionAttributeListener 监听HttpSession中属性变化

  • ServletRequestAttributeListener 监听ServletRequest中属性变化

  • attributeAdded 监听属性添加 —- 当数据范围对象没有该属性,第一次添加时调用执行

  • attributeRemoved 监听属性移除 —- 从一个数据范围对象删除一个已经存在属性执行

  • attributeReplaced 监听属性替换 —– 当一个数据范围已经存在一个属性,向数据范围添加相同名称属性触发替换方法
    3、绑定到 HttpSession 域中的某个对象的状态的事件监听器(对象感知监听器)

  • 即将要被绑定到session中的对象有几种状态

    • HttpSessionBindingListener接口

      • 绑定状态:一个对象被放到session域中
        valueBound()方法//绑定
      • 解绑状态:就是这个对象从session域中移除了
        valueUnbound()方法//解除绑定
    • HttpSessionActivationListener接口

      • 钝化状态:是将session内存中的对象持久化(序列化)到磁盘
        sessionWillPassivate()方法//被钝化了
      • 活化状态:就是将磁盘上的对象再次恢复到session内存中
        sessionDidActivate()方法//活化
  • session钝化机制:

①把服务器不常使用的session对象暂时序列化到系统文件或者是数据库中,当使用时反 序列化到内存中,整个过程由服务器自动完成;

②session的钝化机制由SessionManager管理,创建一个普通的JavaBean绑定和接触需要实现HttpSessionBindingListener接口

  • 注意:
    要实现钝化和活化必须实现Serializable接口
    ②不需要在web.xml中注册

Servlet监听器的生命周期

  • ServletContextListener监听器

    • requestInitialized 在容器(tomcat)启动时被调用(在servlet被实例化前执行)
    • requestDestroyed 在容器(tomcat)销毁时调用(在servlet被销毁后执行)
  • HttpSessionListener监听器

    • sessionCreated 在HttpSession创建后调用

    • sessionDestroyed 在HttpSession销毁前调用(执行session.invalidate();方法)

    • 【注】

      web.xml配置session超时参数,单位:分,session超时的时间并不是精确的
      <session-config> <session-timeout>10</session-timeout> </session-config>

  • ServletRequestListener监听器

    • requestDestroyed 在request对象创建后调用(本次发起请求)
    • requestInitialized 在request对象销毁前调用(本次请求结束)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值