Servlet页面显示在线人数
我们平时看直播的时候,有时候会显示当前页面的在线人数,看B站的时候,视频下方会有当前看这个视频的人数。我们这次通过Servlet的监听器,来实现这个功能。代码效果如图
- 创建一个实现HttpSessionListener接口的Class类
package web;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
*
* @author 悦酱IKA
*监听session的创建过程的监听事件类
*/
public class CountListener implements HttpSessionListener{
//在类里面定义在线人数的count属性
private int count =0;
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
count++;
//获取session对象
HttpSession session = se.getSession();
//这里通过上下文的方式,将count绑定,原因是:只有ServletContext的作用范围是整个应用,
//而如果用session.setAttribute的方式,每当我们关闭页面的时候,就自然消失。
//session与页面想对应
ServletContext sc = session.getServletContext();
sc.setAttribute("count", count);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
//当关闭页面的时候,或者调用session.invalidate()时,自动调用该方法。
//销毁session
count--;
//获取当前session
HttpSession session = se.getSession();
//必须把这个放在上下文中,才可以实现更新绑定
ServletContext sc = session.getServletContext();
sc.setAttribute("count", count);
}
}
- 创建显示在线人数的JSP页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 从上下文中获取count的值,从而实现在线人数 -->
<h3>当前共有<%=
application.getAttribute("count").toString()
%>人在线</h3>
<a href="logout">登出</a>
</body>
</html>
- 创建登出操作的Class的界面
package web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
*
* @author 悦酱IKA
*
* 2020年3月23日-下午2:16:12
*/
public class LogoutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession();
//这个步骤关键时调用这个方法,实现主动的删除session方法。
session.invalidate();
out.close();
}
}
- 配置web.XML文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>ListenerWeb</display-name>
<!-- 配置监听器
监听器的配置一定要在过滤器之前 -->
<listener>
<listener-class>web.CountListener</listener-class>
</listener>
<servlet>
<servlet-name>logout</servlet-name>
<servlet-class>web.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>logout</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
</web-app>
到这里,我们简单的监听器应用就结束了。其实监听器可以应用很多方面,这里作者也是小白,就不多装了。
总结时间:
- 监听器的XML要放在过滤器前面
- 要实现HttpSessionListener接口
- 要通过上下文进行绑定
多写代码,多多提高自己才是王道,不要总想着装X,不然就和我一样,大三了什么都不会。