Listener(监听器)

概述

Servlet三大技术之一。Servlet三大技术包括Servlet、Filter、Listener
如果希望自己的网站收集一些数据,可以通过监听器来获取。

实现

某一个事件触发监听器之后监听器会执行对应的操作

监听器有三大种类

监听三大作用域创建和销毁的监听器

提供两个方法–域的创建和销毁

ServletContextListener
HttpSessionListener
ServletRequestListener

案例:

在这里插入图片描述

package cn.tedu.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;
@WebListener()
public class SCListener implements ServletContextListener {
// Public constructor is required by servlet spec
public SCListener() {
}
// 在 web 应用被初始化时调用
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("day15 已 启动 。"+servletContextEvent.getServletContext());
}
// 在 web 应用被销毁时调用
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("day15 已 销 毁。"+servletContextEvent.getServletContext());
}
}

监听三大作用域中属性变化的监听器

会提供三个方法,分别为域属性的创建、更新、销毁

ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener

案例:

在这里插入图片描述

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
@WebListener()
public class SCListener implements ServletContextAttributeListener {
    // 属性添加时触发
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println(" 属 性"+servletContextAttributeEvent.getName()+" 已经进入servletContext 域");
    }
    // 属性移除时触发
    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println(" 属 性"+servletContextAttributeEvent.getName()+" 已经移除ServletContext 域");
        System.out.println(" 属 性"+servletContextAttributeEvent.getName()+" 已经移除ServletContext 域");
    }
    // 属性更改时触发
    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println(" 属 性"+servletContextAttributeEvent.getName()+
                ":"+servletContextAttributeEvent.getValue()
                +" 已经在ServletContext 域中更新"
                +servletContextAttributeEvent.getServletContext()
                .getAttribute(servletContextAttributeEvent.getName()));
    }
}

监听JavaBean在Session域中状态变化的监听器

HttpSessionBindingListener
HttpSessionActivationListener
  1. 创建一个javabean,在javabean身上实现HttpSessionBingdingListener,然后重写两个方法。方法为session域中添加javabean和session域中销毁javabean。
    其中具有两个方法:
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class Person implements HttpSessionBindingListener {
    private String name;
    private int age;
    private String addr;

    public Person(String name, int age, String addr) {
        this.name = name;
        this.age = age;
        this.addr = addr;
    }

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    //javabean 进入 session 域时触发
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("javabean 进 入session 域" + name);
    }

    //javabean 离开 session 域时触发
    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("javabean 离 开session 域" + name);
    }
}

在这里插入图片描述

监听器案例

开发监听器:
记录web应用启动关闭;
记录资源被访问;
记录用户登录注销的日志。

创建ScListener监听web应用的开启和关闭

在这里插入图片描述

@WebListener()
public class ScListener implements ServletContextListener{
    //ServletContext创建对象(web应用被加载)触发下面的重写
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("EasyMall项目启动...");
    }

    //ServletContext对象销毁(web应用被移除)触发下面的重写
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("EasyMall项目关闭...");
    }
}

创建RequestListener监听访问资源

在这里插入图片描述

package cn.tedu.listener;

import cn.tedu.domain.User;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.*;

@WebListener()
public class RequestListener implements ServletRequestListener {
    //当请求结束时触发下面的重写方法
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
    //获取request对象
        HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();
    //获取用户访问的url路径
        String url = request.getRequestURL().toString();
    //获取用户的ip
        String ip = request.getRemoteAddr();
    //访问资源的用户名---初始是游客
        String username = "游客";
    //判断用户是否登录
        if (request.getSession(false) != null && request.getSession().getAttribute("user") != null) {
    //用户已登陆
    //获取用户名
            User user = (User) request.getSession().getAttribute("user");
    //把用户名覆盖之前初始的用户名
            username = user.getUsername();
        }
        System.out.println("用户【" + username + "】ip【" + ip + "】访问url【" + url + "】请求结束");
    }

    //当请求开始时触发下面的重写方法
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
    //获取request对象
        HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();
    //获取用户访问的url路径
        String url = request.getRequestURL().toString();
    //获取用户的ip
        String ip = request.getRemoteAddr();
    //访问资源的用户名---初始是游客
        String username = "游客";
    //判断用户是否登录
        if (request.getSession(false) != null && request.getSession().getAttribute("user") != null) {
    //用户已登陆
    //获取用户名
            User user = (User) request.getSession().getAttribute("user");
    //把用户名覆盖之前初始的用户名
            username = user.getUsername();
        }
        System.out.println("用户【" + username + "】ip【" + ip + "】访问url【" + url + "】请求开始");
    }
}

让JavaBean实现HTTPSessionBingListener

在这里插入图片描述

//javabaen可以封装数据以及提供方法
public class User implements HttpSessionBindingListener {
    //
//    Logger logger=Logger.getLogger(User.class);
    //javaben属性要和表的字段对应
    private int id;
    private String username;
    private String password;
    private String nickname;
    private String email;

    //构造方法
    //无参构造
    public User() {
    }
    //有参构造
    public User(int id, String username, String password, String nickname, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.nickname = nickname;
        this.email = email;
    }
    //提供get、set方法
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    //重写toString方法
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", nickname='" + nickname + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
    //当javabean对象存放在session对象中触发下面重写方法
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("用户【"+username+"】登陆");
//        logger.info("用户【"+username+"】登陆");
    }

    //当javabean对象移除在session对象中触发下面重写方法
    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("用户【"+username+"】注销");
//        logger.info("用户【"+username+"】注销");

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sparky*

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

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

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

打赏作者

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

抵扣说明:

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

余额充值