【Listener教科书】科普JavaWeb中的多种监听器及用法(知识总结)

一、了解监听器

1.1 什么是监听器

监听器就是一个实现了特定接口的Java类。这个Java类用来监听另一个Java类的方法调用或者属性改变。当被监听的对象的发生上述的事件后。监听器某个方法就会立即执行。

1.1.1 监听器的组件

监听器可以大致分为四个组件(方便理解)

  • 事件源:事件发生的源头
  • 监听器:监听事件发生
  • 绑定:将监听器绑定到事件源
  • 事件:能够触发监听器的事
1.2 什么是Servlet监听器

在Servlet的规范中定义了多种类型的监听器。监听器用来分别监听 ServletContext、HttpSession、ServletRequest三个域对象的

1.2.1 Servlet监听器的组件

Servlet监听器的组件大致分为四个组件

  • 事件源:request域对象、session域对象、ServletContext域对象
  • 监听器:Servlet三种监听器
  • 绑定:配置web.xml
  • 事件:域对象发生改变
1.3 Servlet监听器的分类

Servlet规范中提供了8个监听器

按功能进行划分将其分成三类,如下:

  • 一类:监听三个域对象的创建和销毁的监听器
  • 二类:监听三个域对象的属性变更的监听器。(属性添加、属性移除、属性替换)
  • 三类:监听HttpSession对象中的JavaBean的状态的改变。(绑定、解除绑定、钝化、活化)

二、监听器的开发步骤

  • 自定义类实现一类监听器
  • 重写监听器中的方法
  • 配置xml配置文件或注解配置
/**
 * 监听器开发步骤
 */
public class FirstListener implements ServletContextListener {
   
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
   
        /**
         * 监听ServletContext域的初始化,随着服务器的启动
         */
        System.out.println("ServletContext初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
   
        //监听ServletContext域的销毁,随着服务器的关闭
        System.out.println("ServletContext销毁");
    }
}

三、监听器的配置方式

3.1 xml配置
	<listener>
        <listener-class>com.mylifes1110.java.listener.FirstListener</listener-class>
    </listener>
3.2 注解配置

@WebListener,加了该注解默认配置了监听器

package com.mylifes1110.java.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * 监听器开发步骤
 */
@WebListener
public class FirstListener implements ServletContextListener {
   
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
   
        /**
         * 监听ServletContext域的初始化,随着服务器的启动
         */
        System.out.println("ServletContext初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
   
        /**
         * 监听ServletContext域的销毁,随着服务器的关闭
         */
        System.out.println("ServletContext销毁");
    }
}

四、一类监听器

监听三个域对象(ServletContext、Session、Request)的创建与销毁

4.1 监听ServletContext域对象
  • 实现ServletContextListener接口并覆盖方法
    • 监听服务器启动的时候创建ServletContext对象时
    • 监听服务器关闭的时候ServletContext对象被销毁掉时
package com.mylifes1110.java.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * 监听ServletContext
 */
@WebListener
public class TestServletContextListener implements ServletContextListener {
   
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
   
        /**
         * 监听ServletContext域的初始化,随着服务器的启动
         */
        System.out.println("ServletContext初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
   
        /**
         * 监听ServletContext域的销毁,随着服务器的关闭
         */
        System.out.println("ServletContext销毁");
    }
}
4.2 监听Session域对象
  • 实现HttpSessionListener接口并覆盖方法
    • 监听服务器端第一次调用getSession方法时
    • 监听session过期或调用了invalidate方法
package com.mylifes1110.java.listener;

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

/**
 * 监听HttpSession
 */
@WebListener
public class TestHttpSessionListener implements HttpSessionListener {
   

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
   
        System.out.println("Session创建");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
   
        System.out.println("Session销毁");
    }
}

Servlet测试

package com.mylifes1110.java.servlet;

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

@WebServlet(name = "TestSessionServlet", value = "/tss")
public class TestSessionServlet extends HttpServlet {
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        //创建Session对象
        HttpSession session = request.getSession();
        System.out.println(session.getId());
        //销毁Session对象
        session.invalidate();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        doPost(request, response);
    }
}
4.3 监听Request域对象
  • 实现ServletRequestListener接口并覆盖方法
    • 监听客户的向服务器发送了一次请求而创建这一个request对象
    • 监听当服务器为这次请求作出了响应之后的request对象销毁
package com.mylifes1110.java.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

/**
 * 监听ServletRequest
 */
@WebListener
public class TestServletRequestListener implements ServletRequestListener {
   
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
   
        System.out.println("Request对象创建");
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
   
        System.out.println("Request对象销毁");
    }
}

Servlet测试

package com.mylifes1110.java.servlet;

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值