JAVA_监听器

11 篇文章 1 订阅
3 篇文章 0 订阅
我们在生活中,会看到很多类似监听器的东西:例如智能驾驶的汽车,识别到前方有障碍物时会自动提醒并绕行。智能电表识别到欠费后会自动断电等,其实在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>

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中的监听器(Listener)是一种广泛应用的设计模式,它用于处理程序中的事件。通过监听器,我们可以在事件发生时执行一些特定的操作。在Java中,我们可以使用内置的监听器API或自定义监听器实现此功能。 下面是Java中的常见监听器类型: 1. ActionListener:用于处理按钮、菜单等组件的动作事件。 2. WindowListener:用于处理窗口事件,如窗口打开、关闭等。 3. MouseListener:用于处理鼠标事件,如单击、双击、拖动等。 4. KeyListener:用于处理键盘事件,如键盘按下、释放等。 5. FocusListener:用于处理组件焦点事件,如获得或失去焦点等。 使用监听器的步骤如下: 1. 创建一个监听器类,该类实现了相应的监听器接口。 2. 在需要监听的组件上添加监听器对象。 3. 在监听器类中实现相应的方法来处理事件。 下面是一个简单的示例代码,演示了如何使用ActionListener监听器处理按钮单击事件: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ButtonListenerDemo implements ActionListener { private JFrame frame; private JButton button; public ButtonListenerDemo() { frame = new JFrame("Button Listener Demo"); button = new JButton("Click Me"); button.addActionListener(this); frame.getContentPane().add(button); frame.pack(); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(frame, "Button Clicked!"); } public static void main(String[] args) { new ButtonListenerDemo(); } } ``` 在上面的代码中,我们创建了一个ButtonListenerDemo类,该类实现了ActionListener接口。在构造函数中,我们创建了一个按钮对象,然后将该按钮添加到窗口中,并将该按钮的监听器设置为当前类。当用户单击按钮时,程序将调用actionPerformed()方法来处理事件,该方法将弹出一个消息框来告诉用户按钮已被单击。 总之,监听器Java编程中非常重要的组成部分。使用监听器,我们可以轻松地处理程序中的事件,并实现交互式用户界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

知虚

权当做笔记,打赏随您心意

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

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

打赏作者

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

抵扣说明:

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

余额充值