【Java Web】8、Listener

Listener

web 加载顺序

web.xml 的加载顺序是:Context-Param -> Listener -> Filter -> Servlet,而同个类型之间的实际程序调用的时候的顺序是根据对应的 Mapping 的顺序进行调用。

Java 监听器

监听器用于监听 web 应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。Listener 接口分类:

  • ServletContext 监听器

  • HttpSession 监听器

  • ServletRequest 监听器

ServletContext 监听器

**ServletContextListener:**监听 ServletContext 对象

package com.listener;

import javax.servlet.ServletRequestEvent;

public class ServletRequestListener implements javax.servlet.ServletRequestListener {
    /**
     * 该请求即将超出Web应用程序的范围。
     * request将要销毁
     */
    @Override
    public void requestDestroyed(ServletRequestEvent event) {
        System.out.println("request将要销毁");
    }

    /**
     * 该请求即将进入Web应用程序的范围。
     * request初始化
     */
    @Override
    public void requestInitialized(ServletRequestEvent event) {
        System.out.println("request初始化");
    }
}
<!-- ServletContext对象监听器 -->
<listener>
    <listener-class>com.listener.ServletRequestListener</listener-class>
</listener>

**ServletContextAttributeListener:**监听对 ServletContext 属性的操作,比如增加、删除、修改

package com.listener;

import javax.servlet.ServletRequestAttributeEvent;

public class ServletRequestAttributeListener implements javax.servlet.ServletRequestAttributeListener {
    /**
     * 通知一个新的属性被添加到servlet请求。 在添加属性后调用。
     */
    @Override
    public void attributeAdded(ServletRequestAttributeEvent event) {
        System.out.println("request添加属性后调用");
    }

    /**
     * 通知现有的属性已经从servlet请求中删除。 在属性被删除后调用。
     */
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent event) {
        System.out.println("request删除属性后调用");
    }

    /**
     * 通知servlet请求中已经替换了一个属性。 在属性被替换后调用。
     */
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent event) {
        System.out.println("request替换属性后调用");
        String name = event.getName();
        Object value = event.getValue();
        System.out.println("request被替换的key:" + name + "  ,替换前的value:" + value);
    }
}
<!-- ServletContext属性的操作监听器  -->
<listener>
    <listener-class>com.listener.ServletRequestAttributeListener</listener-class>
</listener>

HttpSession 监听器

**HttpSessionListener:**监听 Session 对象

package com.listener;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;

public class HttpSessionListener implements javax.servlet.http.HttpSessionListener {
    /**
     * 通知会话已创建。
     * session创建之后调用
     */
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        System.out.println("session创建之后");
        HttpSession session = event.getSession();
    }

    /**
     * 通知会话即将失效。
     * session销毁之前调用
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        System.out.println("session销毁之前");
        HttpSession session = event.getSession();
    }
}
<!-- HttpSession对象监听器 -->
<listener>
    <listener-class>com.listener.HttpSessionListener</listener-class>
</listener>

**HttpSessionAttributeListener:**监听 Session 中的属性操作

package com.listener;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;

public class HttpSessionAttributeListener implements javax.servlet.http.HttpSessionAttributeListener {
    /**
     * 通知某个属性已被添加到会话中。 在添加属性后调用。
     */
    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        System.out.println("session添加属性后调用");
        HttpSession session = event.getSession();
        String name = event.getName();
        Object value = event.getValue();
        System.out.println("被添加到session中的属性:" + "key=" + name + "   ,value=" + value);
    }

    /**
     * 通知某个属性已从会话中删除。 在属性被删除后调用。
     */
    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        System.out.println("session删除属性后调用");
        HttpSession session = event.getSession();
        String name = event.getName();
        Object value = event.getValue();
        System.out.println("被删除的session中的属性:" + "key=" + name + "   ,value=" + value);
    }

    /**
     * 在会话中通知属性已被替换。 在属性被替换后调用。
     */
    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        System.out.println("session替换属性后调用");
        HttpSession session = event.getSession();
        String name = event.getName();
        Object value = event.getValue();
        System.out.println("被替换的session中的属性:" + "key=" + name + "   ,替换之前的value=" + value);
    }
}

<!-- HttpSession属性的操作监听器 -->
<listener>
    <listener-class>com.listener.HttpSessionAttributeListener</listener-class>
</listener>

**HttpSessionBindingListener 监听器:**感知 Session 绑定的事件监听器

package com.listener;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;

public class HttpSessionBindingListener implements javax.servlet.http.HttpSessionBindingListener {
    /**
     * 通知对象它正在被绑定到会话并标识会话。(还未绑定)
     */
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("当前对象正在绑定到session中,还未绑定");
        HttpSession session = event.getSession();

        String name = event.getName();
        Object value = event.getValue();
        System.out.println("将要被绑定到session中的key值:" + name + "value值:" + value);
        System.out.println("value值是否是当前对象:" + (value == this));//true

        Object valueNow = session.getAttribute(name);
        System.out.println("valueNow:" + valueNow);//null,还未绑定


    }

    /**
     * 通知对象它正在从会话中解除绑定并标识会话。(还未解除绑定)
     */
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("当前对象它正在从会话中解除绑定");
        HttpSession session = event.getSession();

        String name = event.getName();
        Object value = event.getValue();
        System.out.println("将要解除绑定session中的key值:" + name + "value值:" + value);
        System.out.println("value值是否是当前对象:" + (value == this));//true

        Object valueNow = session.getAttribute(name);
        System.out.println("valueNow:" + valueNow);//null,还未解除绑定
    }
}

测试页面

<%@page import="cn.itcast.erp.listener.session.HttpSessionBindingListener"%>
<%@page import="cn.itcast.erp.listener.session.HttpSessionActivationListener"%>
<%@page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>测试HttpSessionActivationListener监听(session的活化和钝化)</title>
  </head>

  <body>
    <%
        //测试session活化和钝化监听器HttpSessionActivationListener
        session.setAttribute("sessionActivation",new HttpSessionActivationListener1());

        //测试session绑定和解绑监听器
        session.setAttribute("sessionBind", new HttpSessionBindingListener1());
        session.removeAttribute("sessionBind");

    %>
    <h1>session活化和钝化监听</h1>
  </body>
</html>

**HttpSessionActivationListener:**监听 HTTP 会话的 active 和 passivate 情况,passivate 是指非活动的 session 被写入持久设备(比如硬盘),active 相反。注意:HttpSessionActivationListener 不需要 web.xml 配置文件。

ServletRequest 监听器

**ServletRequestListener:**监听 Request 对象

package com.listener;

import javax.servlet.ServletRequestEvent;

public class ServletRequestListener implements javax.servlet.ServletRequestListener {
    /**
     * 该请求即将超出Web应用程序的范围。
     * request将要销毁
     */
    @Override
    public void requestDestroyed(ServletRequestEvent event) {
        System.out.println("request将要销毁");
    }

    /**
     * 该请求即将进入Web应用程序的范围。
     * request初始化
     */
    @Override
    public void requestInitialized(ServletRequestEvent event) {
        System.out.println("request初始化");
    }
}
<!-- ServletRequest对象监听器 -->
<listener>
    <listener-class>com.listener.ServletRequestListener</listener-class>
</listener>

**ServletRequestAttributeListener:**监听 Requset 中的属性操作

package com.listener;

import javax.servlet.ServletRequestAttributeEvent;

public class ServletRequestAttributeListener implements javax.servlet.ServletRequestAttributeListener {
    /**
     * 通知一个新的属性被添加到servlet请求。 在添加属性后调用。
     */
    @Override
    public void attributeAdded(ServletRequestAttributeEvent event) {
        System.out.println("request添加属性后调用");
    }

    /**
     * 通知现有的属性已经从servlet请求中删除。 在属性被删除后调用。
     */
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent event) {
        System.out.println("request删除属性后调用");
    }

    /**
     * 通知servlet请求中已经替换了一个属性。 在属性被替换后调用。
     */
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent event) {
        System.out.println("request替换属性后调用");
        String name = event.getName();
        Object value = event.getValue();
        System.out.println("request被替换的key:" + name + "  ,替换前的value:" + value);
    }
}
<!-- ServletRequest属性的操作监听器  -->
<listener>
    <listener-class>com.listener.ServletRequestAttributeListener</listener-class>
</listener>

微信公众号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tellsea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值