JavaWeb学习记录(二十六)——在线人数统计HttpSessionListener监听实现
一、session销毁控制层代码
public class InvalidateSession extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession().invalidate();//执行销毁session的操作
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
二、监听代码
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent arg0) {
// 当前人数加1
// 看ServletContext域中是否已经存储了count 如果没有是第一个人访问 ,如果有就加1
// 获取存储域对 全局
ServletContext context = arg0.getSession().getServletContext();
// 获取指定属性名称的参数值
Object obj = context.getAttribute("count");
System.out.println(obj);
if (obj == null) {
context.setAttribute("count", 1);
} else {
int count = (Integer) obj;
count++;
context.setAttribute("count", count);
}
}
/**
* 当浏览器关闭的时候,不会调用此方法
* 1.当session失效 session默认有效时间 30分钟
* 2.执行了session.invalidate();
*/
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("--------sessionDestroyed------");
// 获取存储域对 全局
ServletContext context = arg0.getSession().getServletContext();
// 获取指定属性名称的参数值
Object obj = context.getAttribute("count");
if (obj != null) {
int count = (Integer) obj;
count--;
context.setAttribute("count", count);
}
}
}
三、显示层代码
<script type="text/javascript">
//当关闭窗体前
window.onbeforeunload = function(){
//调用这个请求 去销毁session 当前会话的session
window.location.href="http://localhost:8080/count/destorysession.do";
};
</script>
<body>
<%--
ServletContext setAttribute("count",count);
--%>
<h1>当前在线的人数是:${count}</h1>
</body>
当一个会话关闭时,在线人数会相应减少。如果没有一中的session销毁控制层代码和三中的javascript代码,则会话增多时,显示在线人数会增加,但会话减少时,没有响应,
这是因为浏览器关闭时不会调用sessionDestroyed方法。
JavaWeb学习记录(二十六)——在线人数统计HttpSessionListener监听实现的更多相关文章
- javaweb学习总结(二十六)——jsp简单标签标签库开发(二)
一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...
- JavaWeb学习记录(十六)——防止表单重复提交
产生随机字符串进行验证,如果产生的和Session存储的相同则可以提交,提交后删除session对应的属性值:否则表单提交不成功 一.产生随机字符串的工具类 package web10.util; i ...
- javaweb学习总结二十六(response对象的用法二 下载文件)
一:浏览器打开服务器上的文件 1:读取服务器上面的资源,如果在web层,可以直接使用servletContext,如果在非web层 可以使用类加载器读取文件 2:向浏览器写数据,实际上是把数据封装到r ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- 深度学习(二十六)Network In Network学习笔记
深度学习(二十六)Network In Network学习笔记 Network In Network学习笔记 原文地址:http://blog.csdn.net/hjimce/article/deta ...
- JavaWeb学习记录(十二)——商城购物之数据库操作的接口定义
一.基本接口,该项目中所有接口都继承它 package blank.dao; import java.util.List; public interface BaseDao<T,PK> { ...
- javaweb学习总结(二十五)——jsp简单标签开发(一)
一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...
- javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- Java基础学习笔记二十六 JDBC
什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据库,J ...
随机推荐
- Python标准库---子进程 (subprocess包)
这里的内容以Linux进程基础和Linux文本流为基础.subprocess包主要功能是执行外部的命令和程序.比如说,我需要使用wget下载文件.我在Python中调用wget程序.从这个意义上来说, ...
- STL-算法
#include <algorithm> 1. max_element(v.begin(), v.end()); 注意,所有的区间全部是半开区间,如果数组包含20-40,通过find找出2 ...
- PS通道抠图总结
看了那么多的通道抠图,总结几点就是 1.你要有很强的色彩意识,怎样调节对比色等才能增加主体和背景的色差 2.流水步骤 Ctrl+J复制背景图层 调整主体和背景的色差 进入通道面板,找到主体和背景对比最 ...
- poj 3264 Balanced Lineup (线段树)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 42489 Accepted: 20000 ...
- C++封装、继承、多态
C++封装继承多态总结 面向对象的三个基本特征 面向对象的三个基本特征是:封装.继承.多态.其中,封装可以隐藏实现细节,使得代码模块化:继承可以扩展已存在的代码模块(类):它们的目的都是为了--代码重 ...
- hdu3473 线段树 划分树
//Accepted 28904 KB 781 ms //划分树 //所求x即为l,r区间排序后的中位数t //然后求出小于t的数的和sum1,这个可以用划分树做 //求出整个区间的和sum,可以用O ...
- Ant、Maven、Gradle
android Gradle project http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ http://www.voge ...
- VS2013 JS 跟踪
VS2013JS 跟踪 1.在页面对应的cs文件中设置断点,F10单步执行. 2.单步执行调试会自然而然执行到JS里面.
- linux命令:cp
1.命令介绍: cp用来复制文件或目录,全称是copy 2.命令格式: cp [选项] [-T] 源 目的 或cp [选项] 源 目录 或cp [选项] -t 目录 源 3.命令参数: -a, --a ...
- (工作经验总结一二)队列--多个main的原因
1,项目创建最好有一个自己的继承于UIViewController的类,并且其他控制器继承这个控制器,灵活性较大,例如: 要给项目每个页面添加截图或用户操作轨迹记录等,这样就省去了到每个页面添加的麻烦 ...