监听器 – Listener
内容纲要
- 监听器(Listener) 是J2EE Servlet模块下的组件
- Listener的作用对Web应用对象的行为进行监控
- 通过Listener监听自动触发指定的功能代码
三种监听对象
- ServletContext -对全局ServletContext及其属性进行监听
- HttpSession -对用户会话及其属性操作进行监听
- ServletRequest -对请求及属性操作进行监听 - 任何实现了这个接口的对象都可以被监听(HttpServletRequest)
过滤器与监听器的区别
- 过滤器(Filter)的职责是对URL进行过滤拦截,是主动的执行(前置处理)
- 监听器(Listener)的职责是对Web对象进行监听,是被动触发(相关功能的后续处理)
开发监听器的三要素
- 实现XxxListener接口,不同接口对应不同监听对象
- 实现每个接口中独有的方法,实现触发监听的后续操作
- 在web.xmI中配置< listener>使监听器生效
建议使用配置的方式
<listener>
<listener-class>fun.afterglow.listener.FistListener</listener-class>
</listener>
@WebListener
六种常用监听接口
内置对象监听接口
- ServletContextListener -监听ServletContext对象创建、销毁等操作
- HttpSessionListener -监听HttpSession对象创建、销毁等操作
- ServletRequestListener -监听HttpServletRequest对象创建、销毁等
属性监听接口
- ServletContextAttributeListener -监听全局属性操作
- HttpSessionAttributeListener-监听用户会话属性操作
- ServletRequestAttributeListener -监听请求属性操作
监听器的应用场景
请求流量分析
监听器
public class RequestTotalListener implements ServletContextListener, ServletRequestListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//启动时创建两个list,一个保存时间,一个保存数值
List timeList = new ArrayList();
List valueList = new ArrayList();
servletContextEvent.getServletContext().setAttribute("timeList", timeList);
servletContextEvent.getServletContext().setAttribute("valueList", valueList);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
List<String> timeList = (List) servletRequestEvent.getServletContext().getAttribute("timeList");
List<Integer> valueList = (List) servletRequestEvent.getServletContext().getAttribute("valueList");
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
String time = simpleDateFormat.format(date);
if (timeList.indexOf(time) == -1) {
//不存在初始化为1
timeList.add(time);
valueList.add(1);
servletRequestEvent.getServletContext().setAttribute("timeList",timeList);
servletRequestEvent.getServletContext().setAttribute("valueList",valueList);
}else{
//存在>在原有的基础上加一更新
int index = timeList.indexOf(time);
int value = valueList.get(index);
valueList.set(index,value+1);
servletRequestEvent.getServletContext().setAttribute("valueList",valueList);
}
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>total</title>
<script type="text/javascript" src="https://afterglow.fun/echarts/dist/echarts.min.js"></script>
<script type="text/javascript" src="https://afterglow.fun/jquery/jquery-3.3.1.min.js"></script>
</head>
<body>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
function showChart(){
$.ajax({
url:"./rt",
type:"get",
dataType:"json",
success:function (json) {
console.log(json.timeList);
console.log(json.valueList);
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: '请求流量分析统计'
},
tooltip: {},
legend: {
data:['访问量']
},
xAxis: {
data: json.timeList
},
yAxis: {},
series: [{
name: '访问量',
type: 'bar',
data: json.valueList
}]
};
// 使用刚指定的配置项和数据显示图表。激活对象
myChart.setOption(option);
}
})
}
window.setInterval("showChart()",1000);
</script>
</body>
</html>
共有 0 条评论