监听器 – 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>
THE END
分享
二维码
< <上一篇
下一篇>>