javaee的OA项目(七)监听器的使用

本文介绍了项目中如何通过监听器监控request、session和application对象的变化,涉及ServletRequestListener、HttpSessionListener、HttpSessionBindingListener和HttpSessionActivationListener的实战应用,以及session的序列化和反序列化过程。

项目中是监听什么?

项目中就 监听三个对象

request对象

session对象

application对象

在这里插入图片描述
我们就是学习利用监听器对那三个对象进行监听,就是监听那三个对象的变化

监听器(8个)

在这里插入图片描述
以上的监听器都是接口

监听用户日志操作(监听request对象)

1 首先写一个监听器,对当前的请求进行监听,所以使用监听request的监听器

在这里插入图片描述

package com.listener;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class LogListener implements ServletRequestListener,ServletRequestAttributeListener {

ServletRequestListener  这个父类监听器的方法是下面两个




// request 对象一被销毁,就会执行这个方法
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {

    }


// request 对象一被创建,就会执行这个方法
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {

         // XXX在XX时间做了XX操作
        HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();

        //如何获得客户端IP地址
        String remoteAddr = request.getRemoteAddr();

        //获得时间
        String locale = new Date().toLocaleString();

        //获得用户操作的地址  /aa?method=uu
        String uri = request.getRequestURI();

        String method = request.getQueryString();

        try {
            PrintWriter  out=new PrintWriter(new FileWriter("D:/log.txt",true));

            out.println("用户:"+remoteAddr+"在:"+locale+"访问了:"+uri+"?"+method);

            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }





ServletRequestAttributeListener  这个父类监听器的方法是
下面的3个

就是监听request对象里面有没有设置值



    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
第一次往request里面设置值的时候,会执行这个方法
        // request.setAttribute("emp","123");

    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
移除request对象里面的值的时候,走这个方法

        // request.removeAttribute("emp");
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
对同一个key设置另一个值,那么会走这个方法
        // request.setAttribute("emp","456");

    }
}

2 在web.xml里面配置监听器

在这里插入图片描述

    <listener>
        <listener-class>com.listener.LogListener</listener-class>
    </listener>

监听当前的在线人数(监听session对象)

登录成功之后,数量加一,退出,数量减一。

在这里插入图片描述

package com.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnLineListener implements HttpSessionListener,HttpSessionAttributeListener {


session 销毁的时候走这个
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {

        ServletContext servletContext = httpSessionEvent.getSession().getServletContext();


        Integer  online = (Integer) servletContext.getAttribute("online");

        if(online==null){

            online=0;
        }else {
            online--;
        }

        servletContext.setAttribute("online",online);

    }


session里面设置值的时候

    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {

        String name = httpSessionBindingEvent.getName();

        ServletContext servletContext = httpSessionBindingEvent.getSession().getServletContext();


只有session保存的键是emp的时候,才可以加一
        if("emp".equals(name)){
             //进行在线人数加一

            //获得之前的在线人数

            Integer online = (Integer) servletContext.getAttribute("online");

            if(online==null){
                online=1;
            }else{
                online++;
            }

            servletContext.setAttribute("online",online);

        }
    }




    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {

    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {

    }

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {

    }


}

在这里插入图片描述

HttpSessionBindingListener 绑定监听器

  • HttpSessionBindingListener:
  • 监听对象从session 上进行绑定和解绑的操作
    
  • 如果指定的对象绑定到session上的时候就会执行valueBound
  • 如果对象从session中解绑的时候或者session注销的时候就会执行valueUnbound
  • 需要注意的是使用这个监听器的时候不需要在web.xml 中进行任何的配置

这个监听器咋使用

我们在我们的实体类上面,继承这个监听器,并且重写里面的方法,重写的方法是


    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session绑定");
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("解绑");
    }

在这里插入图片描述
我们的员工实体类,继承这个监听器,并且重写他的两个方法

当这个实体类创建了对象,并且放到session对象里面的时候,那么就会执行这个重写的这个valueBound() 这个方法。这个是针对这个员工实体类的。

这个监听器不需要在web.xml里面配置,只需要以上写完就可以使用

HttpSessionActivationListener(session 的序列化和反序列化)

这个监听器也是作用在实体类上面。

session的序列化 和 反序列化

实体类继承这个监听器,重写他的方法


    @Override
    public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
//        序列化
        System.out.println("sessionWillPassivate");
    }

    @Override
    public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
//反序列化
        System.out.println("sessionDidActivate");
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一写代码就开心

你的打赏将是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值