发表于: 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的。
评论