Javaweb学习笔记之监听器(一):监听 对象的 创建和销毁

package com.demo.listener;

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

/**
 * 监听器:主要用来监听特定对象的创建或销毁,以及属性的变化的;是一个实现特定接口的普通 java 类;
 *
 * Servlet 中可以监听的对象有:
 *  request、session、servletContext;
 *  分别对应的是 request监听器、session监听器、servletContext监听器;
 *
 * 监听器接口:
 *  1、监听对象创建或销毁的监听器接口:
 *      Interface ServletRequestListener:监听 request 对象的创建或销毁;
 *      Interface HttpSessionListener:监听 session 对象的创建或销毁;
 *      Interface ServletContextListener:监听 servletContext 对象的创建或销毁;
 *  2、监听对象属性的变化:
 *      Interface ServletRequestAttributeListener:监听 request 对象属性变化:添加、移除、修改;
 *      Interface HttpSessionAttributeListener:监听 session 对象属性变化:添加、移除、修改;
 *      Interface ServletContextAttributeListener:监听 servletContext 对象属性变化;
 *  3、session 相关监听器:
 *      Interface HttpSessionBindingListener:监听对象绑定到 session 上的事件;
 *      Interface HttpSessionActivationListener:监听 session 序列化及反序列化的事件;
 *
 * 监听 request 对象的创建或销毁
 */
public class MyRequestListener implements ServletRequestListener {
    /**
     * request 对象创建:
     * 浏览器客户端访问服务器地址:http://localhost:8080/07_Listener_war_exploded/index.jsp 的时候创建 request 对象
     */
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("request 对象创建");

        // 在 index.jsp 中添加一条数据(name)到 request 域中,从监听器中获取该数据:
        // 1、获取 request 对象
        ServletRequest servletRequest = sre.getServletRequest();
        // 2、获取 request 域中的数据
        Object value = servletRequest.getAttribute("name");
        System.out.println("init:" + value); // 获取不到数据,因为此时 request 对象刚创建,还没有访问到目标资源
    }

    /**
     * request 对象销毁:浏览器客户端访问服务器结束的时候销毁 request 对象
     */
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("request 对象销毁");

        // 获取 request 对象
        ServletRequest servletRequest = sre.getServletRequest();
        // 获取 request 域中的数据
        Object value = servletRequest.getAttribute("name");
        System.out.println("destroy:" + value); // 能够获取到数据
    }
}
package com.demo.listener;

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

/**
 * 监听 HttpSession 对象的创建或销毁
 */
public class MySessionListener implements HttpSessionListener {
    /**
     * session 对象创建:
     *  浏览器客户端第一次访问服务器的时候创建 session 对象,浏览器没有关闭重新打开的情况下,
     *  后续所有访问都不再创建 session 对象;
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("session 对象创建");
    }

    /**
     * session 对象销毁:
     *  注意:浏览器关闭时没有销毁 session 对象,但是重新打开浏览器后,第一次访问服务器的时候还是会创建 session 对象;
     *
     *  销毁的方法有两种,一种是 session 的最大时间(30分钟)之后,session 自动销毁;
     *  另一种是调用 session 对象的 invalidate() 方法;
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session 对象销毁");
    }
}
package com.demo.listener;

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

/**
 * 监听 servletContext 对象的创建和销毁
 */
public class MyServletContextListener implements ServletContextListener {
    /**
     * servletContext 对象创建:服务器启动的时候创建 servletContext 对象;
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("servletContext 对象创建");
    }

    /**
     * servletContext 对象销毁:服务器关闭的时候销毁 servletContext 对象;
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("servletContext 对象销毁");
    }
}

配置监听器:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 配置监听器:监听 request 对象的创建和销毁 -->
    <listener>
        <listener-class>com.demo.listener.MyRequestListener</listener-class>
    </listener>

    <!-- 监听 session 对象的创建和销毁 -->
    <listener>
        <listener-class>com.demo.listener.MySessionListener</listener-class>
    </listener>

    <!-- 监听 servletContext 对象的创建和销毁 -->
    <listener>
        <listener-class>com.demo.listener.MyServletContextListener</listener-class>
    </listener>

</web-app>

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  $END$
  <%
    /* 添加数据到 request 域对象中 */
    request.setAttribute("name", "admin");

    /* 销毁 session 对象 */
    session.invalidate();
  %>
  </body>
</html>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值