Utilizo código para enseñarte (3): el oyente supervisa las estadísticas de los usuarios en línea

1. Introducción

Cuando comenzó a trabajar en proyectos Java Web, después de dominar Servlet, es posible que no tenga una buena comprensión del rol de Oyente y la escritura de código. Este artículo a través de la realización de estadísticas de usuarios en línea y prácticas de código de listas de usuarios en línea, para que todos puedan comprender y utilizar el Oyente a través de operaciones reales.

2. Escenario empresarial

¿Quiere mostrar un número online de personas en el proyecto sin saber cómo empezar? ? ?
¿Desea ver la lista de usuarios registrados actualmente en su plataforma? ? ?
Este artículo lo implementa por ti a través de JSP + Servlet + Listener, échale un vistazo en 5 minutos.

3. Pantalla de efectos

Abra un navegador diferente para iniciar sesión. Puede ver el número de personas que están conectadas actualmente y la lista de usuarios.
Inserte la descripción de la imagen aquí
Cuando el usuario cierra sesión, el usuario actual se desconecta. Y vea el número de usuarios en línea -1, y la lista de usuarios también reduce este usuario.
Inserte la descripción de la imagen aquí

4. Implementación del código

4.1 Estructura del proyecto

Inserte la descripción de la imagen aquí

4.2 preparación de la página

4.2.1 Página de inicio (index.jsp)

index.jsp se utiliza para mostrar el usuario que ha iniciado sesión actualmente (el usuario existe en la sesión), así como también muestra el número de usuarios registrados y la lista de usuarios registrados. También hay saltos de página login.jsp y register.jsp. Dado que los datos del usuario que inició sesión se almacenan en el dominio de la aplicación, es necesario registrarlos en index.jsp antes de iniciar sesión. Puede ver la lista de inicio de sesión de usuario.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
  <head>
    <title>主页</title>
  </head>
  <body>
  <h1>welcome to index.jsp!</h1>
  <c:if test="${session_user!=null}">
    欢迎您,${
    
    session_user.userName}
    <a href="loginOut">退出</a>
    <a href="">用户列表</a>
  </c:if>
  <c:if test="${session_user==null}">
    <a href="login.jsp">登录</a>
    <a href="register.jsp">注册</a>
  </c:if>
<a href="index.jsp">主页</a>
  <span style="color: red">${
    
    tip}</span>
  <hr/>
  <h3>在线用户</h3>
  当前在线用户人数:[${
    
    fn:length(onlineUser)}]<br/>
  用户列表:<br/>
  <c:forEach items="${onlineUser}" var="user"  varStatus="u">[${
    
    u.index+1}]位,在线[${
    
    user}]用户。<br/>
  </c:forEach>
  </body>
</html>

4.2.2 Página de inicio de sesión (login.jsp)

PD: antes de iniciar sesión, registre usuarios en register.jsp. Aquí no hay conexión a la base de datos y los datos se almacenan en la caché. Por lo tanto, debe registrarse antes de poder iniciar sesión.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<form action="login.do" method="post">
    用户:<input type="text" name="username">
    <br/>
    密码:<input type="password" name="pwd"/>
    <br/>
    <input type="submit" value="登录" />
</form>
<span style="color: red">${
    
    tip}</span>
</body>
</html>

4.2.3 Página de registro (register.jsp)

PD: Después de que el registro sea exitoso, los datos se almacenarán en el dominio de la aplicación. Cuando el usuario inicia sesión, la entrada del usuario se compara con los datos en el dominio de la aplicación. Si el usuario existe, el inicio de sesión es exitoso.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>注册页面</h1>
<form action="register.do" method="post">
    用户:<input type="text" name="username">
    <br/>
    密码:<input type="password" name="pwd"/>
    <br/>
    性别:<input type="radio" name="sex" value="1"/><input type="radio" name="sex" value="0"/><br/>
    <input type="submit" value="注册" />
</form>
</body>
</html>

4.2 Preparación del controlador

4.2.1 Controlador que maneja el inicio de sesión

@WebServlet(name = "LoginServlet", urlPatterns = "/login.do")
public class LoginServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");
        //先从缓存中拿出users
        ServletContext sc = request.getServletContext();
        List<User> users = (List<User>) sc.getAttribute("users");
       for (User u : users) {
    
    
           if(u.getUserName().equals(username)&&u.getPwd().equals(pwd)){
    
    
               //跳转到index.jsp
               HttpSession session = request.getSession();
               session.setAttribute("session_user",u);
               request.getRequestDispatcher("index.jsp").forward(request,response);
           }
        }
       //提示用户名密码不正确
        request.setAttribute("tip","用户名密码不正确!");
        request.getRequestDispatcher("login.jsp").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

4.2.2 Controlador que maneja la salida

@WebServlet(name = "LoginOutServlet",urlPatterns = "/loginOut")
public class LoginOutServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        HttpSession session  = request.getSession();
        session.removeAttribute("session_user");
        request.setAttribute("tip","退出成功!");
        request.getRequestDispatcher("index.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

4.2.3 Controlador con función de registro

@WebServlet(name = "RegisterServlet",urlPatterns = "/register.do")
public class RegisterServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //接收参数
       String username =  request.getParameter("username");
       String pwd =  request.getParameter("pwd");
        String sex = request.getParameter("sex");
        User user = new User(username,pwd,Integer.parseInt(sex));
       //把注册用户存储起来
       ServletContext sc =  request.getServletContext();
       List<User> users = (List<User>) sc.getAttribute("users");
        //把user存到缓存中(application)
        users.add(user);
        sc.setAttribute("users",users);
        request.setAttribute("tip","注册成功!请登录");
        request.getRequestDispatcher("login.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

4.3 Preparación del oyente

En el oyente, Guagua escribió muchos comentarios. Conciso y fácil de entender, puede leerlo con confianza.

/**
 *在线用户监听器
 */
@WebListener()
public class OnLineListener implements ServletContextListener,
        HttpSessionListener, HttpSessionAttributeListener {
    
    
    //创建一个application变量
    ServletContext  application = null;

    // Public constructor is required by servlet spec
    public OnLineListener() {
    
    
    }

    //监听服务器启动的method
    public void contextInitialized(ServletContextEvent sce) {
    
    

        System.out.println("------------服务器启动了---------------");
        //创建一个List<user>,并把该list存到application中
        List<User> users = new ArrayList<>();
        application =  sce.getServletContext();
        //创建一个onlineUser来存在线用户
        List<String> onlineUser = new ArrayList<>();
        application.setAttribute("users",users);
        application.setAttribute("onlineUser",onlineUser);
    }

    public void contextDestroyed(ServletContextEvent sce) {
    
    
        System.out.println("--------------服务器关闭了----------------");
    }

    // HttpSessionListener implementation
    //session是基于服务器端创建的。当一个浏览器访问服务器就会创建一个唯一session
    public void sessionCreated(HttpSessionEvent se) {
    
    
        System.out.println("-----session被创建了-----------");
        /**
         * 可以统计当前有多少人连接我们的服务器。(统计在线访问人数)
         */
    }

    public void sessionDestroyed(HttpSessionEvent se) {
    
    
        /* Session is destroyed. */
        System.out.println("--------session被销毁了------------");
        /**
         * 可以统计当前有多少人连接我们的服务器。(统计在线访问人数)
         */
    }

   /*
      attributeAdded()方法:监听session执行setAttr()时触发
      统计登录到该系统的用户
    */
    public void attributeAdded(HttpSessionBindingEvent sbe) {
    
    
        System.out.println("-----session设值----"+sbe.getName()+","+sbe.getValue());
        User user = (User) sbe.getValue();
        //创建一个list来记录在线用户
        HttpSession session = sbe.getSession();
        application  = session.getServletContext();
        //先从缓存application域中拿到  onlineUser
        List<String> onlineUser = (List<String>) application.getAttribute("onlineUser");
        if(onlineUser.indexOf(user.getUserName())==-1){
    
    //新增加的userName在onlineUser中不存在
            onlineUser.add(user.getUserName());
            //存储到application中
            application.setAttribute("onlineUser",onlineUser);
        }
    }

    /**
     * attributeRemoved方法:监听session.removeAttr(key,val)
     * 当用户退出时,则注销,并且更新在线用户数量与列表
     */
    public void attributeRemoved(HttpSessionBindingEvent sbe) {
    
    
        System.out.println("-----session销毁----"+sbe.getName()+","+sbe.getValue());
        //创建一个list来记录在线用户
        HttpSession session = sbe.getSession();
        application  = session.getServletContext();
        User user = (User) sbe.getValue();
        //先从缓存application域中拿到  onlineUser
        List<String> onlineUser = (List<String>) application.getAttribute("onlineUser");
        onlineUser.remove(user.getUserName());
        application.setAttribute("onlineUser",onlineUser);
    }

    public void attributeReplaced(HttpSessionBindingEvent sbe) {
    
    
      
    }
}

5. Resumen de puntos de conocimiento

5.1 El oyente nos permite comprender mejor los 4 ámbitos

El oyente puede monitorear la creación y destrucción de Session; también puede monitorear la creación y destrucción del dominio de la aplicación; también puede monitorear los métodos setAttribute (key, val) y removeAttribute (key, val) del dominio Session. Todo esto requiere que tengamos cierta comprensión y conocimiento de los 4 ámbitos para poder utilizar mejor el Listener en el desarrollo. (¿ La diferencia entre los 4 visores todavía no es? Date prisa y haz clic en mí )

5.2 Oyente otras extensiones

5.2.1 Lograr la tasa de clics en el sitio web

sessionCreated(HttpSessionEvent se){
    
    }
sessionDestroyed(HttpSessionEvent se){
    
    }

Al abrir un navegador para acceder al proyecto 127.0.0.1:8080/project name, se ejecutará el método sessionCreated () {}. Cuando se cierra el navegador, se ejecutará sessionDestroyed () {}. Por lo tanto, podemos lograr un número de visitantes o una función de tasa de clics a través de estos dos métodos.

5.2.2 Registro del servidor

contextInitialized(ServletContextEvent sce){
    
    }
contextDestroyed(ServletContextEvent sce){
    
    }

Estos dos métodos se utilizan para monitorear el dominio de la aplicación En este blog, Guagua también usa estos dos métodos para crear una lista de personas que inician sesión en línea. Estos dos métodos monitorean el ciclo de vida de todo el contenedor web y podemos expandir muchas funciones.

6. Adjunte el código fuente completo

Descarga del código fuente: https://download.csdn.net/download/u010312671/12562328

Supongo que te gusta

Origin blog.csdn.net/u010312671/article/details/107029776
Recomendado
Clasificación