07.使用Tomcat实现在线人数的监听

Posted 没有对象的野指针

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了07.使用Tomcat实现在线人数的监听相关的知识,希望对你有一定的参考价值。

通过监听Session对象的方式来实现在线人数的统计和在线人信息展示。

1.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>MvcPro</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
    <listener>
      <listener-class>com.sxt.mvcpro.listener.RequestListener</listener-class>
  </listener>
  <!-- 在容器中配置出路径对应的servlet -->
  <servlet>
      <servlet-name>listenerOnlineNumber</servlet-name>
      <servlet-class>com.sxt.mvcpro.controller.OnlineNumberServlet</servlet-class>
  </servlet>
  <!-- 定义出上面的servlet处理的路径 这个路径叫做servlet的映射路径 -->
  <servlet-mapping>
      <servlet-name>listenerOnlineNumber</servlet-name>
      <url-pattern>/online/*</url-pattern>
  </servlet-mapping>
</web-app>

2.online.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="/MvcPro/">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 <h1>在线人数为:${count==null? 0:count}</h1>
     ${users}
     <form action="online/login"  method="post">
         <fieldset>
           <legend>请登录</legend>
             用户名:<input  type="text" name="username"><br><br>
             <input type="submit" value="登陆">
         </fieldset>
     </form>
     <a  href="online/logout">注销</a>
</body>
</html>

3.OnlineNumberServlet.java

  对Session对象实现监听,首先必须继承HttpSessionListener类,该程序的基本原理就是当浏览者访问页面的时候必定会产生一个session对象;当关闭该页面的时候必然会删除该session对象。所以每当产生一个新的session对象就让在线人数加1,当删除一个session对象就让在线人数减1。

  实现登录的方法

public void login(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        
        String username = req.getParameter("username");
        
        //    如果为null则表示还没登陆
        if (req.getSession().getAttribute("username")==null) {
            if (!"".equals("username")) {//    只有输入的用户名不为空才能进行操作
                req.getSession().setAttribute("username", username);
                //    将用户名保存到set集合中
                names.add(username);
                //    再将names集合保存到application内置对象中去
                req.getServletContext().setAttribute("users", names);
                req.getServletContext().setAttribute("count", names.size());
            }
        }
        resp.sendRedirect("/MvcPro/pages/online.jsp");
    }

  实现注销的方法

public void logout(HttpServletRequest req, HttpServletResponse resp) {
        names.remove(req.getSession().getAttribute("username"));
        //    销毁当前用户的session内置对象
        req.getSession().invalidate();
        try {
            req.getServletContext().setAttribute("count", names.size());
            resp.sendRedirect("/MvcPro/pages/online.jsp");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

  获取服务器信息,并将其作为响应返回给客户端

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{
        req.setCharacterEncoding("UTF-8");
        String pathInfo = req.getPathInfo();
        if ("/login".equals(pathInfo)) {
            try {
                this.login(req, resp);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if("/logout".equals(pathInfo)) {
            this.logout(req, resp);
        }
    }

  客户端把数据传送到服务器端

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }

  创建集合保存用户名

//    保存用户名
    private Set<String> names = new HashSet<String>();

4.测试

(1)登录界面

(2)输入用户名进行登录

(3)注销

点击注销之后页面重新返回登录界面

 

 

以上是关于07.使用Tomcat实现在线人数的监听的主要内容,如果未能解决你的问题,请参考以下文章

java web用监听器listener简单的实现在线统计人数

监听器实现案例----自定义session扫描器和统计在线用户人数及用户信息

java监听器之实现在线人数显示

Listener监听器,实现一个显示在线用户人数

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

Redis集群环境下的键值空间监听事件实现方案