Listener监听器

本篇文章主要是作者学习Listener监听器的一些记录,希望能帮到您,如果有什么不妥当的地方希望得到指出,谢谢阅读
Java学习大纲:https://blog.csdn.net/weixin_39778570/article/details/94667501
JavaWeb:https://blog.csdn.net/weixin_39778570/article/details/97800485

请仔细阅读目录,点击可进行跳转

理解

监听器顾名思义就是能够实现监听的工具。当你一个类的对象进行创建或者销毁你希望你能监听到他并作出一些处理,或者进行了属性的设置的时候你能过进行一些处理。而我们只需要配置监听器和实现处理就好了,具体的调用过程是服务器来做的。

方法

ServletContext监听
ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。

public void contextInitialized(ServletContextEvent sce);//上下文初始化
public void contextDestroyed(ServletContextEvent sce);//上下文销毁
public ServletContext getServletContext();//ServletContextEvent事件:取得一个ServletContext(application)对象

ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。

public void attributeAdded(ServletContextAttributeEvent scab);//增加属性
public void attributeRemoved(ServletContextAttributeEvent scab);//属性删除
public void attributeRepalced(ServletContextAttributeEvent scab);//属性替换(第二次设置同一属性)
public String getName();//得到属性名称
public Object getValue();//取得属性的值

Session监听
HttpSessionListener接口:对Session的整体状态的监听。

public void sessionCreated(HttpSessionEvent se);//session创建
public void sessionDestroyed(HttpSessionEvent se);//session销毁
//HttpSessionEvent事件
public HttpSession getSession();//取得当前操作的session

HttpSessionAttributeListener接口:对session的属性监听。

public void attributeAdded(HttpSessionBindingEvent se);//增加属性
public void attributeRemoved(HttpSessionBindingEvent se);//删除属性
public void attributeReplaced(HttpSessionBindingEvent se);//替换属性
//HttpSessionBindingEvent事件
public String getName();//取得属性的名称
public Object getValue();//取得属性的值
public HttpSession getSession();//取得当前的session

Request监听
ServletRequestListener:用于对Request请求进行监听(创建、销毁)。

public void requestInitialized(ServletRequestEvent sre);//request初始化
public void requestDestroyed(ServletRequestEvent sre);//request销毁
//ServletRequestEvent事件
public ServletRequest getServletRequest();//取得一个ServletRequest对象
public ServletContext getServletContext();//取得一个ServletContext(application)对象

ServletRequestAttributeListener:对Request属性的监听(增删改属性)。

public void attributeAdded(ServletRequestAttributeEvent srae);//增加属性
public void attributeRemoved(ServletRequestAttributeEvent srae);//属性删除
public void attributeReplaced(ServletRequestAttributeEvent srae);//属性替换(第二次设置同一属性)
//ServletRequestAttributeEvent事件:能取得设置属性的名称与内容
public String getName();//得到属性名称
public Object getValue();//取得属性的值

例子

在这里插入图片描述
这里对多个监听器一个一个进行实验,具体改变监听器的类路径就好了
在这里插入图片描述
MyServlet.java文件,打开想要测试的功能进行监听,

package listener;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("=================================>接受请求");
		// 监听ServletRequest
//		req.setAttribute("属性1", "hello");
//		req.setAttribute("属性1", "change");
//		req.removeAttribute("属性1");

		// 监听ServletContext
//		req.getServletContext().setAttribute("new", "hello");
//		req.getServletContext().setAttribute("new", "hi");
//		req.getServletContext().removeAttribute("new");
		
		// 监听Session
		// 一秒后移除,但是至少会发生在下一次请求
		req.getSession().setMaxInactiveInterval(1); 
		req.getSession().setAttribute("new", "hello");
		req.getSession().setAttribute("new", "hi");
		req.getSession().removeAttribute("new");
		// 休眠3秒
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("=================================>接受结束");
	}
	
}

ContextListener.java

package listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextListener implements ServletContextListener, ServletContextAttributeListener{
	// 添加Context属性
	@Override
	public void attributeAdded(ServletContextAttributeEvent scae) {
		System.out.println("添加Context属性");
	}
	
	// 移除Context属性
	@Override
	public void attributeRemoved(ServletContextAttributeEvent scae) {
		System.out.println("移除Context属性");
	}

	// 修改Context属性
	@Override
	public void attributeReplaced(ServletContextAttributeEvent scae) {
		System.out.println("修改Context属性");
	}

	// Context销毁
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("Context销毁");
	}

	// Contrxt创建
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("Contrxt创建");
	}
	
}

RequsetListener.java打开注释部分可以知道页面被访问了多少此

package listener;

import java.util.Date;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;

public class RequsetListener implements ServletRequestListener ,ServletRequestAttributeListener{
	
	// 请求销毁执行
	public void requestDestroyed(ServletRequestEvent arg0) {
        System.out.println("requestDestroyed" + "," + new Date());
    //    System.out.println("当前访问次数:" + arg0.getServletContext().getAttribute("count"));
    }

	// 请求响应前执行
    public void requestInitialized(ServletRequestEvent arg0) {
        System.out.println("requestInitialized" + "," + new Date());
        
        // 用服务器的ServletContext来统计访问次数
//        Object count = arg0.getServletContext().getAttribute("count");
//        Integer cInteger = 0;
//        if (count != null) {
//            cInteger = Integer.valueOf(count.toString());
//        }
//        System.out.println("历史访问次数::" + (count==null?0:count));
//        cInteger++;
//        
//        ServletContext servletContext = arg0.getServletContext();
//        servletContext.setAttribute("count", cInteger);
    }

    // 添加属性执行
	public void attributeAdded(ServletRequestAttributeEvent srae) {
		HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();  
        System.out.println("增加'属性1'--->"+request.getAttribute("属性1"));  
	}

	// 移除属性执行
	public void attributeRemoved(ServletRequestAttributeEvent srae) {
		HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();  
        System.out.println("删除'属性1'---->"+request.getAttribute("属性1"));  
	}
	
	// 替换属性执行,值得一提的是,在ServletRequest创建之后,这里会被执行一次,也就是发生了一次修改
	public void attributeReplaced(ServletRequestAttributeEvent srae) {
		HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();  
        System.out.println("提换'属性1'---->"+request.getAttribute("属性1"));  
	}
}

SessionListener.java

package listener;

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

public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener{

	// Session添加
	@Override
	public void attributeAdded(HttpSessionBindingEvent se) {
		System.out.println("Session添加");
	}

	// Session移除
	@Override
	public void attributeRemoved(HttpSessionBindingEvent se) {
		System.out.println("Session移除");
	}

	// Session替换
	@Override
	public void attributeReplaced(HttpSessionBindingEvent se) {
		System.out.println("Session替换");
	}
	
	// Session创建
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("Session创建");
	}

	// Session销毁
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("Session销毁");
	}
	
}

实验效果图
浏览器输入:http://localhost:8089/listener/listener
连续输入两次后(不超过3秒),如图:
在这里插入图片描述
监控ServletContext
在这里插入图片描述
测试Request,在进入doGet方法前就有一次替换发生了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值