文章目录
一:监听器初识
监听器是一个实现了特定接口的普通Java类,用于监听其他对象的创建和销毁,监听其他对象的方法执行和属性改变;
二:监听器实现步骤
- 创建一个普通的Java类
- 让该类实现监听器的接口
- 在该类中实现监听器接口的所有方法
- 旧版的在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,不断刷新,总访问次数会增加。