项目中是监听什么?

项目中就 监听三个对象

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");
    }