统计在线人数和登录人数

思想:

 

      1:统计在线人数。

              只是访问了这个网页的人员。 session的创建就是一个在线人数+1。让所有人都可以看到。把在线人数到ServletContext中。

       2:统计登录人数。

              是指输出的正确的用户名和密码以后用户的数量。

            登录以后:将用户以xxxkey(如以userkey)放到session的属性中去。监听器监听到此session属性的变化,

             当属性名为user时,登录人数+1并放到ServletContext

第一步:先开发统计在线人数

      
        
session的创建就是一个在线人数+1。让所有人都可以看到。把在线人数放到ServletContext中。

 

思想:实现HttpSessionListener,在sessionCreated的方法中+1sessionDestroyed的方法中-1.

publicclass SListener implements HttpSessionListener {

    /**

     * 当有人访问时,就会有一个session被创建,监听到session创建,count+1

     */

    publicvoidsessionCreated(HttpSessionEvent se) {

    //application中获取已经存在的数量

        ServletContext app =se.getSession().getServletContext();

        AtomicInteger count = (AtomicInteger)app.getAttribute("online");

        if(count==null){

        count= newAtomicInteger(1);

        }else{

        count.addAndGet(1);

        }

        //再把count放到application中去

         app.setAttribute("online",count);

  publicvoidsessionDestroyed(HttpSessionEvent se) {

       ServletContextapp = se.getSession().getServletContext();

       AtomicIntegercount = (AtomicInteger) app.getAttribute("online");

       count.addAndGet(-1);

       app.setAttribute("online",count);

  }

}

 

 

 

第二步:什么是登录人数(用session的属性监听)

    是指输入了用户名和密码的用户。

    登录以后:将用户以xxxkey(如以userkey)放到session的属性中去。

    就可以监听登录人数。
   

应该是实现一个HttpSessionAttributeListner监听器。

监听属性的变化:

 

1:开发登录页面

<body>

    主页:<br/>

    在线人数:${online.get()}<br/>

    <!-- 以后要以loginedkey放到application -->

    登录人数:${logined.get()}<br/>

    <c:choose>

       <c:when test="${empty sessionScope.user}">

           <form name="x"action="<c:url value='/LoginServlet'/>"

                method="post">

              Name:<input type="text"name="name"><br/>

              <input type="submit"value="登录">   

           </form>

       </c:when>

       <c:otherwise>

           欢迎你:${user}

           <br/>

           <a href="<c:url value='/LoginServlet'/>">退出</a>

       </c:otherwise>

    </c:choose>  

</body>

</html>

 

开发以一的界面如下:

 

 

2:开发登录的servlet

publicclass LoginServlet extends HttpServlet {

    /**

     * 此方法操作用户的退出

     */

    publicvoid doGet(HttpServletRequest request, HttpServletResponseresponse)

           throws ServletException, IOException {

       // 删除自己放到session中的数据

       request.getSession().removeAttribute("user");

       // 重定向到登录页面

       response.sendRedirect(request.getContextPath() + "/index.jsp");

    }

 

    /**

     * 此方法操作用户的登录

     */

    publicvoid doPost(HttpServletRequest request, HttpServletResponseresponse)

           throws ServletException, IOException {

       request.setCharacterEncoding("UTF-8");

       // 获取用户名

       String name = request.getParameter("name");

       if (name != null && !name.trim().equals("")) {

           System.err.println("登录成功");

           request.getSession().setAttribute("user", name.trim());

       } else {

           System.err.println("你的用户名和密码不对");

       }

       // 重定向到登录页面

       response.sendRedirect(request.getContextPath() + "/index.jsp");

    }

}

 

3:开发属性监听器,用户计算登录人数

package czb.listener;

import java.util.concurrent.atomic.AtomicInteger;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpSessionAttributeListener;

import javax.servlet.http.HttpSessionBindingEvent;

publicclassSAListener implementsHttpSessionAttributeListener {

    // 执行了session.setAttribute("user","")

    publicvoidattributeAdded(HttpSessionBindingEvent se) {

        // 1判断是否有与userkey

        Stringkey = se.getName();

        if (key.equals("user")) {

            // 2获取这个ServletContext对象,读取登陆人数

            ServletContextapp = se.getSession().getServletContext();

            // 3.先获取登陆人数

            AtomicIntegercount = (AtomicInteger) app.getAttribute("logined");

            if (count == null) {

                count= newAtomicInteger(1);

            }else{

                count.addAndGet(1);

            }

            // 4.把登陆人数放回到ServletContext

            app.setAttribute("logined",count);

        }

    }

    publicvoidattributeRemoved(HttpSessionBindingEvent se) {

        // 1判断是否有与userkey

        Stringkey = se.getName();

        if (key.equals("user")) {

            // 2.获取ServletContext,读取登陆人数

            ServletContextapp = se.getSession().getServletContext();

            //3.读取登陆人数

             AtomicInteger count = (AtomicInteger)app.getAttribute("logined");

             count.addAndGet(-1);

             //4.修改后的登陆人数放回到app

             app.setAttribute("logined",count);

        }

    }

    publicvoid attributeReplaced(HttpSessionBindingEventse) {

    }

 

}

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值