服务器Servlet端

  1. package com.sxt.mvcpro.servlet;
  2. import java.io.IOException;
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class OnlineNumberServlet extends HttpServlet{
  10. private Set<String> names=new HashSet<>();
  11. @Override
  12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. //编码修改为utf-8(需要中文显示不乱码必须设置)
  14. req.setCharacterEncoding("utf-8");
  15. //获取操作路径请求
  16. String pathInfo=req.getPathInfo();
  17. //登录请求
  18. if ("/login".equals(pathInfo)) {
  19. this.login(req,resp);
  20. }
  21. //登出请求
  22. else if ("/logout".equals(pathInfo)) {
  23. this.logout(req,resp);
  24. }
  25. }
    //实现登录统计的方法
  26. public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  27. String username=req.getParameter("username");
  28. //如果为null则表示还没有登录
  29. if (req.getSession().getAttribute("username")==null) {
  30. if (!"".equals(username)) {
  31. //只有输入的用户名不能为空字符串才能进行操作
  32. req.getSession().setAttribute("username", username);
  33. //将用户名保存到set集合中
  34. names.add(username);
  35. //再将names集合保存到application内置对象中
  36. req.getServletContext().setAttribute("users", names);
  37. //集合大小即为人数多少
  38. req.getServletContext().setAttribute("count", names.size());
  39. }
  40. }
  41. //继续跳转到在线显示的页面
  42. resp.sendRedirect("/Mvcpro/pages/online.jsp");
  43. }
    //实现注销的方法
  44. public void logout(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
  45. //移除当前用户输入的用户名
  46. names.remove(req.getSession().getAttribute("username"));
  47. //销毁当前用户的session内置对象
  48. req.getSession().invalidate();
  49. req.getServletContext().setAttribute("count", names.size());
  50. resp.sendRedirect("/Mvcpro/pages/online.jsp");
  51. }
  52.  
  53. @Override
  54. //通过doPost来调用doGet方法可以使账号不在地址栏显示
  55. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  56. this.doGet(req, resp);
  57. }
  58.  
  59. }

TomCat配置文件xml的修改

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <display-name>Mvcpro</display-name>
  4. <welcome-file-list>
  5. <welcome-file>index.html</welcome-file>
  6. <welcome-file>index.htm</welcome-file>
  7. <welcome-file>index.jsp</welcome-file>
  8. <welcome-file>default.html</welcome-file>
  9. <welcome-file>default.htm</welcome-file>
  10. <welcome-file>default.jsp</welcome-file>
  11. </welcome-file-list>
  12. <!--容器中配置出 路径对应的servlet-->
  1. <servlet>
    <servlet-name>lineNumberServlet</servlet-name>
    <servlet-class>com.sxt.mvcpro.servlet.OnlineNumberServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
  1. <!--定义出上面的servlet处理路径 这个路径叫做servlet的映射路径-->
  1. <servlet-mapping>
    <servlet-name> lineNumberServlet</servlet-name>
    <url-pattern>/online/*</url-pattern> </servlet-mapping>
    </web-app>

客户端(前端)

由于需要传动态参数所以采用jsp格式而不是html(注意编码统一为utf-8以防止乱码)

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <base href="/Mvcpro/">
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <h1>在线人数为:${count==null? 0:count}</h1>
  12. ${users}
  13. <form action="online/login" method="post">
  14. <fieldset>
  15. <legend>请登录</legend>
  16. 用户名:<input type="text" name="username"><br><br>
  17. <input type="submit" value="登陆">
  18. </fieldset>
  19. </form>
  20. <a href="online/logout">注销</a>
  21. </body>
  22. </html>

效果图

后期会在加入其他功能(敬请期待!!!)

多用户在线人数监听(基于TomCat)的更多相关文章

  1. 基于tomcat插件的maven多模块工程热部署(附插件源码)

    内容属原创,转载请注明出处 写在前面的话 最近一直比较纠结,归根结底在于工程的模块化拆分.以前也干过这事,但是一直对以前的结果不满意,这会重操旧业,希望搞出个自己满意的结果. 之前有什么不满意的呢? ...

  2. 简单读!tomcat源码(一)启动与监听

    tomcat 作为知名的web容器,很棒! 本文简单了从其应用命令开始拆解,让我们对他有清晰的了解,揭开神秘的面纱!(冗长的代码流水线,给你一目了然) 话分两头: 1. tomcat是如何启动的? 2 ...

  3. android事件处理之基于监听

    Android提供了了两种事件处理方式:基于回调和基于监听. 基于监听: 监听涉及事件源,事件,事件监听器.用注册监听器的方法将某个监听器注册到事件源上,就可以对发生在事件源上的时间进行监听. 最简单 ...

  4. tomcat触发ServletContext初始化监听事件的源码(原创)

    tomcat 8.0.36 知识点: 动态监听器的好处可以根据环境条件进行选择性添加. 静态监听器有七类. ServletContextAttributeListener ServletRequest ...

  5. 解决tomcat启动Socket监听端口死循环被hold问题

    原文链接:http://blog.csdn.net/dead_cicle/article/details/7073433 1.SOCKET监听置于servlet的init方法中,在web.xml里加入 ...

  6. JavaWeb学习记录(二十六)——在线人数统计HttpSessionListener监听实现

    一.session销毁控制层代码 public class InvalidateSession extends HttpServlet { public void doGet(HttpServletR ...

  7. Android的事件处理机制详解(二)-----基于监听的事件处理机制

    基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制 ...

  8. 普通用户从非80端口启动tomcat,通过端口转发监听80端口

    linux下小于1024的端口都需要root去绑定. root权限启动tomcat是不明智的,可以使用非root权限启动tomcat监听8080端口,然后利用端口转发实现对80端口的监听. 端口转发: ...

  9. 监听tomcat服务器启动/关闭并从配置文件中读取参数进行初始化

    监听tomcat服务器启动/关闭很简单(2步): 1. 建立一个类实现ServletContextListener接口,重写其中的方法(contextDestroyed和contextInitiali ...

随机推荐

  1. Django 创建一个应用程序

    1. 认识Django Django是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计. 由经验丰富的开发人员构建,它负责Web开发的许多麻烦,因此您可以专注于编写应用程序,而无需 ...

  2. iOS11 适配

    参考:http://kisscu.com/2018/07/01/%E9%80%82%E9%85%8Dios-11%E6%80%BB%E7%BB%93/ self.navigationItem.righ ...

  3. Linux/Python学习路线

    Linux: 初级阶段: 熟练掌握常用80个命令: 掌握Linux常用软件包的安装方法,如源码安装,rpm安装等: 学习安装设备驱动程序(如网卡,显卡驱动): 了解Grub/Lilo引导程序以及简单的 ...

  4. PID控制算法的C语音实现

    http://wenku.baidu.com/link?url=_u7LmA1-gzG5H8DzFYsrbttaLdvhlHVn5L54pgxgUiyyJK_eWtX0LbS7d0SEbHtHzAoK ...

  5. Desktop Central帮助您升级Windows 10,获取更新的五大增强功能

  6. linux下面/usr/local和opt目录有何区别

    /usr/local下一般是你安装软件的目录,这个目录就相当于在windows下的programefiles这个目录 .很多应用都安装在/usr/local下面,那么,这些应用为什么选择这个目录呢?答 ...

  7. 2019.02.09 bzoj4710: [Jsoi2011]分特产(容斥原理)

    传送门 题意简述:有nnn个人,mmm种物品,给出每种物品的数量aia_iai​,问每个人至少分得一个物品的方案数(n,m,每种物品数≤1000n,m,每种物品数\le1000n,m,每种物品数≤10 ...

  8. java常用设计模式三:原型模式

    在说原型模式之前先说一下浅拷贝和深拷贝的概念 一.浅拷贝和深拷贝 1.浅拷贝 在java中,对象创建后需要有一个引用变量来指向该对象实际的地址空间,也就是说引用变量与对象实体是两个不同的数据体.在Ob ...

  9. 第21章:MongoDB-聚合操作--聚合管道--$geoNear

    ①$geoNear 使用“$geoNear”可以得到附近的坐标点. ②范例:准备测试数据

  10. 第09章:MongoDB-CRUD操作--文档--修改--update

    ①语法 db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boole ...