发表于: 2017-10-06 23:33:00

1 849



今天完成的事情:

1.了解监听器

2.监听在线人数和


明天计划的事情

1.监听session的数量。

2.了解事物管理器


遇到的问题:

1. 什么是监听器

现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动
而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些

以上解释来自于:http://blog.csdn.net/reggergdsg/article/details/52821502


2. 监听在线人数的原理是森马?

对每一个正在访问的用户,J2EE应用服务器会为其建立一个对应的HttpSession对象。
* 当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象 ,
* 并触发 HttpSession创建事件 ,如果注册了HttpSessionListener事件监听器,
* 则会调用HttpSessionListener事件监听器的sessionCreated方法。
* 相反,当这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,
* 触发 HttpSession销毁事件,同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。


收获:

监听在线人数


import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
* 对每一个正在访问的用户,J2EE应用服务器会为其建立一个对应的HttpSession对象。
* 当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象 ,
* 并触发 HttpSession创建事件 ,如果注册了HttpSessionListener事件监听器,
* 则会调用HttpSessionListener事件监听器的sessionCreated方法。
* 相反,当这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,
* 触发 HttpSession销毁事件,同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。
* Created by Administrator on 2017-10-06.
*/
public class SessionListener implements HttpSessionListener{

private static Logger loggerSL = Logger.getLogger(SessionListener.class);


   /* Session创建事件 */
   public void sessionCreated(HttpSessionEvent httpSessionEvent) {

//        loggerSL.info("Session创建事件");
       /**
        * ServletContext
        * ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。
      * servletContext,所有用户共用一个。所以,为了节省空间,提高效率,ServletContext中,
     * 要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。
       */

       /**
        * httpSessionEvent.getSession()
        * HttpSession对象初始化或结束前,会分别调用sessionCreated()session- Destroyed()方法,

     * 可以通过传入的HttpSessionEvent,使用getSession()取得HttpSession

          以针对会话对象作出相对应的创建或结束处理操作。

        */

       /*getServletContext() , 获取HttpSession中的ServletContext对象*/
       ServletContext servletContext = httpSessionEvent.getSession().getServletContext();
//        loggerSL.info("servletContext"+ servletContext);
       //获取名为TOTAL_ONLINE_USERS共享的数据
       Integer usersNumber = (Integer) servletContext.getAttribute("TOTAL_ONLINE_USERS");
//        loggerSL.info("当前登录用户数量:"+ usersNumber);
       // 如果用户登陆,TOTAL_ONLINE_USERS 自增1
       if (usersNumber == null) {
servletContext.setAttribute("TOTAL_ONLINE_USERS",1);
           loggerSL.info("当前登录用户数量:"+ servletContext.getAttribute("TOTAL_ONLINE_USERS"));
       }
else {
usersNumber ++;
           loggerSL.info("当前登录用户数量:"+ usersNumber);
           servletContext.setAttribute("TOTAL_ONLINE_USERS",usersNumber);
       }
}



/* Session失效事件 */
   public void sessionDestroyed(HttpSessionEvent httpSessionEvent){

//        loggerSL.info("Session失效事件");
       ServletContext servletContext = httpSessionEvent.getSession().getServletContext();
       loggerSL.info("servletContext"+ servletContext);
       Integer usersNumber = (Integer) servletContext.getAttribute("TOTAL_ONLINE_USERS");
       //如果用户推出,TOTAL_ONLINE_USERS自减1
       if(usersNumber == null ){
servletContext.setAttribute("TOTAL_ONLINE_USERS",1);
           loggerSL.info("当前登录用户数量:"+ servletContext.getAttribute("TOTAL_ONLINE_USERS"));
       }
else {
usersNumber --;
           loggerSL.info("当前登录用户数量:"+ usersNumber);
           servletContext.setAttribute("TOTAL_ONLINE_USERS",usersNumber);
       }
}
}



配置文件web.xml里:

<!--监听在线人数-->

session的过期时间

<session-config>

 <session-timeout>1</session-timeout>

</session-config>


监听的路径

<listener>
 <listener-class>task.jnshu.SessionListener.SessionListener</listener-class>
</listener>


结果:


有一个问题,当运行程序时自动,在线人数会多出两个,我认为有可能是在应用运行初期,即使没有浏览器打开网页,应用会创造两个HttpSession对象,直到session过期。



进度: 

         任务开始时间:8.14

         预计完成时间:10.8

         是否有延期风险:监听器还没有完成、事务管理器

禅道:http://task.ptteng.com/zentao/project-task-264.html


PS:监听器还有一个监听session的。











返回列表 返回列表
评论

    分享到