通过监听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)注销
点击注销之后页面重新返回登录界面