• 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)注销

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

     

  • 相关阅读:
    进制转化
    递归小结
    Java异常处理面试题归纳
    字符串相加 内存分配
    递归与循环
    cookie
    会话管理
    在javaweb中通过servlet类和普通类读取资源文件
    JS中遍历EL表达式中后台传过来的Java集合
    Ztree加载完成后显示勾选节点
  • 原文地址:https://www.cnblogs.com/wangdh666/p/10752748.html
Copyright © 2020-2023  润新知