利用servlet的监听器实现在线人数监控的功能

1、分析:

做一个网站在线人数统计,可以通过ServletContextListener监听,当Web应用上下文启动时,在ServletContext中添加一个List.用来准备存放在线的用户名,然后通过HttpSessionAttributeListener监听,当用户登录成功,把用户名设置到Session中。同时将用户名方法到ServletContext的List中,最后通过HttpSessionListener监听,当用户注销会话时,讲用户名从应用上下文范围中的List列表中删除。

2、注意事项

测试时,需要启动不同的浏览器来登陆不同的用户,只有点击注销按钮才能减少在线用户,关闭浏览器不能减少在线用户。

3、项目源代码

(1)java代码

OnlineListener类

  1. package com.smalle.listener;  
  2.   
  3. import java.util.LinkedList;  
  4. import java.util.List;  
  5.   
  6. import javax.servlet.ServletContext;  
  7. import javax.servlet.ServletContextEvent;  
  8. import javax.servlet.ServletContextListener;  
  9. import javax.servlet.http.HttpSessionAttributeListener;  
  10. import javax.servlet.http.HttpSessionBindingEvent;  
  11. import javax.servlet.http.HttpSessionEvent;  
  12. import javax.servlet.http.HttpSessionListener;  
  13.   
  14. public class OnlineListener implements   
  15.     ServletContextListener, HttpSessionAttributeListener, HttpSessionListener {  
  16.       
  17.     private ServletContext application = null;  
  18.   
  19.     //应用上下文初始时会回调的方法  
  20.     @Override  
  21.     public void contextInitialized(ServletContextEvent e) {  
  22.         //初始化一个application对象  
  23.         application = e.getServletContext();  
  24.         //设置一个列表属性,用于保存在线用户名  
  25.         this.application.setAttribute(“online”new LinkedList<String>());  
  26.     }  
  27.       
  28.     //往会话中添加属性时的回调方法  
  29.     @Override  
  30.     public void attributeAdded(HttpSessionBindingEvent e) {  
  31.         //取得用户名列表  
  32.         List<String> onlines = (List<String>) this.application.getAttribute(“online”);  
  33.         if(“username”.equals(e.getName())){  
  34.             onlines.add((String) e.getValue());  
  35.         }  
  36.         //将添加后的列表重新设置列application属性中.  
  37.         this.application.setAttribute(“online”, onlines);  
  38.     }  
  39.   
  40.     //会话销毁时会回调的方法  
  41.     @Override  
  42.     public void sessionDestroyed(HttpSessionEvent e) {  
  43.         //取得用户名列表  
  44.         List<String> onlines = (List<String>) this.application.getAttribute(“online”);  
  45.         //取得当前用户名  
  46.         String username = (String) e.getSession().getAttribute(”username”);  
  47.         //将此用户从列表中删除  
  48.         onlines.remove(username);  
  49.         //讲删除后的列表重新设置到application属性中.  
  50.         this.application.setAttribute(“online”, onlines);  
  51.     }  
  52.       
  53.     public void sessionCreated(HttpSessionEvent e) {}  
  54.     public void attributeRemoved(HttpSessionBindingEvent e) {}  
  55.     public void attributeReplaced(HttpSessionBindingEvent e) {}  
  56.     public void contextDestroyed(ServletContextEvent e) {}  
  57.   
  58. }  
package com.smalle.listener;

import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineListener implements 
    ServletContextListener, HttpSessionAttributeListener, HttpSessionListener {

    private ServletContext application = null;

    //应用上下文初始时会回调的方法
    @Override
    public void contextInitialized(ServletContextEvent e) {
        //初始化一个application对象
        application = e.getServletContext();
        //设置一个列表属性,用于保存在线用户名
        this.application.setAttribute("online", new LinkedList<String>());
    }

    //往会话中添加属性时的回调方法
    @Override
    public void attributeAdded(HttpSessionBindingEvent e) {
        //取得用户名列表
        List<String> onlines = (List<String>) this.application.getAttribute("online");
        if("username".equals(e.getName())){
            onlines.add((String) e.getValue());
        }
        //将添加后的列表重新设置列application属性中.
        this.application.setAttribute("online", onlines);
    }

    //会话销毁时会回调的方法
    @Override
    public void sessionDestroyed(HttpSessionEvent e) {
        //取得用户名列表
        List<String> onlines = (List<String>) this.application.getAttribute("online");
        //取得当前用户名
        String username = (String) e.getSession().getAttribute("username");
        //将此用户从列表中删除
        onlines.remove(username);
        //讲删除后的列表重新设置到application属性中.
        this.application.setAttribute("online", onlines);
    }

    public void sessionCreated(HttpSessionEvent e) {}
    public void attributeRemoved(HttpSessionBindingEvent e) {}
    public void attributeReplaced(HttpSessionBindingEvent e) {}
    public void contextDestroyed(ServletContextEvent e) {}

}


LoginServlet类

  1. package com.smalle.listener;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. public class LoginServlet extends HttpServlet {  
  13.   
  14.     private static final long serialVersionUID = 1L;  
  15.   
  16.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  17.             throws ServletException, IOException {  
  18.         this.doPost(request, response);  
  19.     }  
  20.    
  21.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  22.             throws ServletException, IOException {  
  23.         request.setCharacterEncoding(”utf-8”);    //设置响应内容类型  
  24.                    
  25.                 String username= request.getParameter(”username”);    //获取请求参数中的用户名  
  26.            
  27.                 //往session中添加属性,会触发HttpSessionAttributeListener中的attributeAdded方法  
  28.                 if(username != null && !username.equals(“”)) {    
  29.                     request.getSession().setAttribute(”username”,username);      
  30.                 }  
  31.                 //从应用上下文中获取在线用户名列表  
  32.                 List<String> online = (List<String>)getServletContext().getAttribute(”online”);    
  33. System.out.println(”LoginServlet” + online);  
  34.                 response.setContentType(”text/html;charset=utf-8”);  
  35.                 PrintWriter out = response.getWriter();  
  36.                 out.println(”“);  
  37.                 out.println(”  <title>用户列表</title>”);  
  38.                 out.println(”  ”);  
  39.                 out.println(”当前用户是:” + username);  
  40.                 out.print(”    <hr><h3>在线用户列表</h3>”);  
  41.            
  42.                 int size = online == null ? 0 : online.size();  
  43.                 for (int i = 0; i < size; i++) {  
  44.                     if(i > 0){  
  45.                         out.println(”<br>”);  
  46.                     }  
  47.                     out.println(i + 1 + “.” + online.get(i));  
  48.                 }  
  49.                    
  50.                 //注意: 要对链接URL进行自动重写处理  
  51.                 out.println(”<hr/><a href=\”“ + response.encodeURL(“logoutListener”) + “\”>注销</a>”);  
  52.                 out.println(”  ”);  
  53.                 out.println(”“);  
  54.                 out.flush();  
  55.                 out.close();  
  56.     }     
  57. }  
package com.smalle.listener;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

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

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");    //设置响应内容类型

                String username= request.getParameter("username");    //获取请求参数中的用户名

                //往session中添加属性,会触发HttpSessionAttributeListener中的attributeAdded方法
                if(username != null && !username.equals("")) {  
                    request.getSession().setAttribute("username",username);    
                }
                //从应用上下文中获取在线用户名列表
                List<String> online = (List<String>)getServletContext().getAttribute("online");  
System.out.println("LoginServlet" + online);
                response.setContentType("text/html;charset=utf-8");
                PrintWriter out = response.getWriter();
                out.println("");
                out.println("  <title>用户列表</title>");
                out.println("  ");
                out.println("当前用户是:" + username);
                out.print("    <hr><h3>在线用户列表</h3>");

                int size = online == null ? 0 : online.size();
                for (int i = 0; i < size; i++) {
                    if(i > 0){
                        out.println("<br>");
                    }
                    out.println(i + 1 + "." + online.get(i));
                }

                //注意: 要对链接URL进行自动重写处理
                out.println("<hr/><a href=\"" + response.encodeURL("logoutListener") + "\">注销</a>");
                out.println("  ");
                out.println("");
                out.flush();
                out.close();
    }   
}

LogoutServlet类

  1. package com.smalle.listener;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import java.util.List;  
  6.    
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. public class LogoutServlet extends HttpServlet{  
  13.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  14.             throws ServletException, IOException {  
  15.         this.doPost(request, response);  
  16.     }  
  17.    
  18.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  19.             throws ServletException, IOException {  
  20.         request.setCharacterEncoding(”utf-8”);    //设置响应内容类型  
  21.            
  22.         //销毁会话,会触发SessionLinstener中的sessionDestroyed方法  
  23.         request.getSession().invalidate();  
  24.            
  25.         //从应用上下文中获取在线用户名列表  
  26.         List<String> online = (List<String>)getServletContext().getAttribute(”online”);      
  27.         response.setContentType(”text/html;charset=utf-8”);  
  28.         PrintWriter out = response.getWriter();  
  29.         out.println(”“);  
  30.         out.println(”  <title>用户列表</title>”);  
  31.         out.println(”  ”);  
  32.         out.print(”    <h3>在线用户列表</h3>”);  
  33.    
  34.         int size = online == null ? 0 : online.size();  
  35.         for (int i = 0; i < size; i++) {  
  36.             if(i > 0){  
  37.                 out.println(”<br>”);  
  38.             }  
  39.             out.println(i + 1 + “.” + online.get(i));  
  40.         }  
  41.            
  42.         out.println(”<hr><a href=’\’index.html\”>主页</a>”);  
  43.         out.println(”  ”);  
  44.         out.println(”“);  
  45.         out.flush();  
  46.         out.close();  
  47.     }  
  48. }  
package com.smalle.listener;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogoutServlet extends HttpServlet{
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");    //设置响应内容类型

        //销毁会话,会触发SessionLinstener中的sessionDestroyed方法
        request.getSession().invalidate();

        //从应用上下文中获取在线用户名列表
        List<String> online = (List<String>)getServletContext().getAttribute("online");    
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("  <title>用户列表</title>");
        out.println("  ");
        out.print("    <h3>在线用户列表</h3>");

        int size = online == null ? 0 : online.size();
        for (int i = 0; i < size; i++) {
            if(i > 0){
                out.println("<br>");
            }
            out.println(i + 1 + "." + online.get(i));
        }

        out.println("<hr><a href='\'index.html\''>主页</a>");
        out.println("  ");
        out.println("");
        out.flush();
        out.close();
    }
}

(2)web.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>testServlet</display-name>  
  4.       
  5.     <listener>  
  6.         <listener-class>com.smalle.listener.OnlineListener</listener-class>  
  7.     </listener>  
  8.       
  9.     <servlet>  
  10.         <servlet-name>LoginServlet</servlet-name>  
  11.         <servlet-class>com.smalle.listener.LoginServlet</servlet-class>  
  12.     </servlet>  
  13.     <servlet-mapping>  
  14.         <servlet-name>LoginServlet</servlet-name>  
  15.         <url-pattern>/loginListener</url-pattern>  
  16.     </servlet-mapping>  
  17.       
  18.     <servlet>  
  19.         <servlet-name>LogoutServlet</servlet-name>  
  20.         <servlet-class>com.smalle.listener.LogoutServlet</servlet-class>  
  21.     </servlet>  
  22.     <servlet-mapping>  
  23.         <servlet-name>LogoutServlet</servlet-name>  
  24.         <url-pattern>/logoutListener</url-pattern>  
  25.     </servlet-mapping>  
  26.           
  27.       
  28.   <welcome-file-list>  
  29.     <welcome-file>index.jsp</welcome-file>  
  30.   </welcome-file-list>  
  31. </web-app>  
<?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>testServlet</display-name>

    <listener>
        <listener-class>com.smalle.listener.OnlineListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.smalle.listener.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginListener</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>com.smalle.listener.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <url-pattern>/logoutListener</url-pattern>
    </servlet-mapping>


  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

(3)表现层代码

  1. <!DOCTYPE html>  
  2. <html>  
  3.   <head>  
  4.     <title>index.html</title>  
  5.     <meta name=“content-type” content=“text/html; charset=UTF-8”>  
  6.   
  7.   </head>  
  8.     
  9.   <body>  
  10.     <form action=“loginListener” method=“post”>  
  11.         用户名:<input type=“text” name=“username”>  
  12.     <input type=“submit” value=“登录”><br><br>  
  13.     </form>  
  14.   
  15.   </body>  
  16. </html>  
<!DOCTYPE html>
<html>
  <head>
    <title>index.html</title>
    <meta name="content-type" content="text/html; charset=UTF-8">

  </head>

  <body>
    <form action="loginListener" method="post">
        用户名:<input type="text" name="username">
    <input type="submit" value="登录"><br><br>
    </form>

  </body>
</html>



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值