javaweb之Listener监听器原理精讲及实战

一:监听器初识

监听器是一个实现了特定接口的普通Java类,用于监听其他对象的创建和销毁,监听其他对象的方法执行和属性改变;

二:监听器实现步骤

  1. 创建一个普通的Java类
  2. 让该类实现监听器的接口
  3. 在该类中实现监听器接口的所有方法
  4. 旧版的在web.xml文件中通过标签来配置监听器,新版使用 @WebListener

三:监听器实战

3.1 ServletContextListener全局配置加载

1、使用场景

加载全局配置,初始化项目信息

2、web.xml配置

<context-param>
        <param-name>url</param-name>
        <param-value>https://xdclass.net</param-value>
    </context-param><context-param>
        <param-name>topic</param-name>
        <param-value>学习课程</param-value>
    </context-param>

3、监听器开发

package net.xdclass.web.listener;

import net.xdclass.web.domain.Config;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class ContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ContextListener contextInitialized");
        ServletContext servletContext = sce.getServletContext();
        String url = servletContext.getInitParameter("url");
        String topic = servletContext.getInitParameter("topic");

        Config config = new Config();
        config.setUrl(url);
        config.setTopic(topic);

        servletContext.setAttribute("config",config);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ContextListener contextDestroyed");
    }
}

4、在普通java类里获取全局配置

package net.xdclass.web.servlet;

import net.xdclass.web.domain.Config;
import net.xdclass.web.domain.User;

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 java.io.IOException;

@WebServlet("/forward")
public class DispatchServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {

        Config config = (Config)req.getServletContext().getAttribute("config");
        System.out.println(config.getTopic());


        System.out.println("DispatchServlet doGet");

    }
}

访问路径:http://localhost:8080/forward查看运行结果
在这里插入图片描述

3.2 HttpSessionListener统计当前在线人数

与session结合,统计网站在线人数

1、ContextLisener配置

新增如下代码

//获取上下文对象
ServletContext sc = sce.getServletContext();
sc.setAttribute("onlineNum",0);

2、HttpSessionListener开发

@WebListener
public class SessionListener implements HttpSessionListener {@Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("SessionListener sessionCreated");
    
        ServletContext servletContext  = se.getSession().getServletContext();
    
        //获取在线人数
        Integer onlineNum = (Integer)servletContext.getAttribute("onlineNum");
    
        //新增1
        servletContext.setAttribute("onlineNum",++onlineNum);
    
    }@Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("SessionListener sessionDestroyed");
    
        ServletContext servletContext  = se.getSession().getServletContext();
    
        //获取在线人数
        Integer onlineNum = (Integer)servletContext.getAttribute("onlineNum");
    
        //减少1
        servletContext.setAttribute("onlineNum",--onlineNum);
    
    }
}

3、add.jsp

<%--
  Created by IntelliJ IDEA.
  User: mz
  Date: 2024/9/25
  Time: 上午11:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    Integer onlineNum = (Integer) application.getAttribute("onlineNum");
    Integer totalvisit = (Integer)application.getAttribute("totalvisit");
    request.setAttribute("onlineNum",onlineNum);
    request.setAttribute("totalvisit",totalvisit);

%>

<html>
<head>
    <title>统计在线人数</title>
</head>
<body>30分钟在线人数  <%= onlineNum%>
<hr>

</body>
</html>

4、delete.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>小滴课堂 xdclass.net 专题课程</title>
</head>
<body>
​
销毁session
<hr>
<% request.getSession().invalidate(); %>
</body>
</html>

通过chrome浏览器访问http://localhost:8080/add.jsp,结果为
在这里插入图片描述
使用safar浏览器,再次访问http://localhost:8080/add.jsp,此时近30分钟在线人数由3变为4,再访问http://localhost:8080/delete.jsp后,重新访问http://localhost:8080/add.jsp此时在线人数由4继续变为3。

3.3 ServletRequestListener统计网站请求量

1、ContextLisener配置

//获取上下文对象
ServletContext sc = sce.getServletContext();
sc.setAttribute("onlineNum",0);
sc.setAttribute("totalVisit",0);

2、RequestListener开发

@WebListener
public class SessionListener implements HttpSessionListener {@Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("SessionListener sessionCreated");
    
        ServletContext servletContext  = se.getSession().getServletContext();
    
        //获取在线人数
        Integer onlineNum = (Integer)servletContext.getAttribute("onlineNum");
    
        //新增1
        servletContext.setAttribute("onlineNum",++onlineNum);
    
    }@Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("SessionListener sessionDestroyed");
    
        ServletContext servletContext  = se.getSession().getServletContext();
    
        //获取在线人数
        Integer onlineNum = (Integer)servletContext.getAttribute("onlineNum");
    
        //减少1
        servletContext.setAttribute("onlineNum",--onlineNum);
    
    }
}

3、add.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    Integer onlineNum = (Integer) application.getAttribute("onlineNum");
    Integer totalvisit = (Integer)application.getAttribute("totalvisit");
    request.setAttribute("onlineNum",onlineNum);
    request.setAttribute("totalvisit",totalvisit);

%>

<html>
<head>
    <title>统计在线人数</title>
</head>
<body>30分钟在线人数  <%= onlineNum%>
<hr>

应用服务器启动后,总访问次数<%= totalvisit%>

</body>
</html>

访问http://localhost:8080/add.jsp,不断刷新,总访问次数会增加。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

竹意雅韵(马)

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值