JAVA_监听器

我们在生活中,会看到很多类似监听器的东西:例如智能驾驶的汽车,识别到前方有障碍物时会自动提醒并绕行。智能电表识别到欠费后会自动断电等,其实在Java的世界里也有很多监听器,今天就来了解一下。

监听器

  • Listener——>J2EE Servlet下的组件
  • Listener的作用是对Web应用对象的监控
  • 通过Listener监听自动触发指定的功能代码

Java被监控的应用对象有三种:

  • servletContent:对全局属性对象
  • HttpSession:对用户会话的属性监控
  • ServletResponse:对请求及属性进行监控

过滤器与监听器的区别

过滤器的职责是对于URL进行拦截处理,是主动地
监听器是对于WEB对象进行监听,是被动触发的

实现一个监听器有以下三个必须的动作

  1. 实现Listener(对应)的接口
  2. 实现特定的方法
  3. 配置Listener(注解的话通过@WebListener)

下面给出一个实例代码:

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyFirstListener implements ServletContextListener {
    
    

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
    
    
		// TODO Auto-generated method stub
		System.out.println("监听到servlet被销毁");

	}

	@Override
	public void contextInitialized(ServletContextEvent sce) {
    
    
		// TODO Auto-generated method stub
		System.out.println("监听到servlet被创建");
	}

}

效果:
在这里插入图片描述

六种常用监听接口

内置对象监听接口

  • ServletContextListener -> 监听ServletContext对象创建,销毁等操作
  • HttpSessionListener -> 监听HttpSession对象创建,销毁等操作
  • ServletRequestListener ->监听HttpServletRequest对象创建,销毁等操作

属性监听接口

  • ServletContextAttributeListener ->监听全局属性操作
  • HttpSessionAttributeListener -> 监听用户会话属性操作
  • ServletRequestAttributeListener ->监听请求属性操作

下面给出一个内置对象监听的示例代码:
监听类:

package com.listener;

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.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class Listener implements ServletContextListener,ServletRequestListener,HttpSessionListener{
    
    

	@Override
	public void sessionCreated(HttpSessionEvent se) {
    
    
		// TODO Auto-generated method stub
		HttpSession session =se.getSession();
		System.out.println("session被创建,sessionId = "+session.getId());
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
    
    
		// TODO Auto-generated method stub
			HttpSession session =se.getSession();
			System.out.println("session被销毁,sessionId = "+session.getId());
		
	}

	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
    
    
		// TODO Auto-generated method stub
		System.out.println("请求被销毁");
	}

	@Override
	public void requestInitialized(ServletRequestEvent sre) {
    
    
		// TODO Auto-generated method stub
		System.out.println("请求被初始化");
	}

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
    
    
		// TODO Auto-generated method stub
		System.out.println("Context被销毁");
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
    
    
		// TODO Auto-generated method stub
				System.out.println("Context被初始化");
	}

}

Servlet:

package com.listener;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestListener
 */
@WebServlet("/TestListener")
public class TestListener extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestListener() {
    
    
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		request.getServletContext().setAttribute("CONTEXT", "1");
		request.getSession().setAttribute("SESSION", "2");
		request.setAttribute("ATTRIBUTE", "3");
		// TODO Auto-generated method stub
		System.out.println("hello");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

效果:

在这里插入图片描述

通过监听器实现展示网页访问频率

监听器:

package com.wangwei;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.SimpleFormatter;

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.HttpServletRequest;
@WebListener
public class RequestTotalListener implements ServletContextListener,ServletRequestListener{
    
    

	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
    
    
		// TODO Auto-generated method stub
		
	}

	@Override
	public void requestInitialized(ServletRequestEvent sre) {
    
    
		// TODO Auto-generated method stub
		HttpServletRequest request =  (HttpServletRequest) sre.getServletRequest();
		String URL = request.getRequestURL().toString();
		if(URL.endsWith("/RequestListenerServlet")) {
    
    
			return ;
		}
		List<String> timeList =(List<String>) sre.getServletContext().getAttribute("timeList");
		List<Integer> countList =(List<Integer>) sre.getServletContext().getAttribute("countList");
		Date date = new Date();
		SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
		String time =dateFormat.format(date);
		if(timeList.indexOf(time)==-1) {
    
    
			timeList.add(time);
			countList.add(1);
			sre.getServletContext().setAttribute("countList",countList);
			sre.getServletContext().setAttribute("timeList",timeList);
		}else {
    
    
			int index = timeList.indexOf(time);
			countList.set(index, countList.get(index)+1);
		}
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
    
    
		// TODO Auto-generated method stub
		
	}

	@Override
	public void contextInitialized(ServletContextEvent sce) {
    
    
		// TODO Auto-generated method stub
		List<String> timeList =new ArrayList<>();
		List<Integer> countList = new ArrayList<>();
		sce.getServletContext().setAttribute("timeList", timeList);
		sce.getServletContext().setAttribute("countList", countList);
	}

}

Servlet:

package com.wangwei;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import com.alibaba.fastjson.JSON;

/**
 * Servlet implementation class RequestListenerServlet
 */
@WebServlet("/RequestListenerServlet")
public class RequestListenerServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RequestListenerServlet() {
    
    
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */


	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		doGet(request, response);
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		System.out.println("asdffff");
		List<String> timeList =(List<String>) request.getServletContext().getAttribute("timeList");
		List<Integer> countList =(List<Integer>) request.getServletContext().getAttribute("countList");
		Map result =new HashMap();
		result.put("countList" , countList);
		result.put("timeList" , timeList);
		String json =JSON.toJSONString(result);
		System.out.println(json);
		response.getWriter().println(json);
	}
}

html:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src ="js/echarts.min.js"></script>
<script type="text/javascript" src ="js/jquery-3.3.1.min.js" ></script>

</head>
<body>
<div id="main" style =width:600px;height:400px;">
<script type="text/javascript">
function showChart(){
    
    
$.ajax({
    
    
	url:"/TotalCount/RequestListenerServlet",
	type:"get",
	dataType:"json",
	success:function(json){
    
    
		var myChart = echarts.init(document.getElementById('main'));
		//绘制图表
		myChart.setOption({
    
    
		title: {
    
    
		 text: '	请求流量分析统计'
		},
		tooltip: {
    
    },
		xAxis: {
    
    
		 data: json.timeList
		},
		yAxis: {
    
    },
		series: [
		 {
    
    
		   name: '访问量',
		   type: 'line',
		   data: json.countList
		 }
		]
		});
	}
})
}
window.setInterval("showChart()",1000)
</script>
</div>
<script type="text/javascript">
	
</script>


</body>
</html>

效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HBUT_WANGWEI/article/details/126672186
今日推荐