servlet里不得不说一下监听器,因为servlet里对象众多,比如:HttpRequestServlet、 HttpResponseServlet、HttpSession、ServletConfig、ServletContext等基本每一个都有其对应的Listener(监听器)而监听器顾名思义是作为辅助类让我们更好的观察Servlet的各个对象,它能帮我们从第三方角度(第一角度客户端,第二角度servlet容器)获取一个web服务器小程序的矢量考究。
这里举个例子:监听session,计算访问在线的用户量。session学过javaweb的都应该知道,这里不再做详细解释,如果有兴趣可以看我随笔,后面我会慢慢整理,由于今天是第一次编撰,还是以监听器为主。言归正传,session属于状态管理,记录用户状态,为了统计有多少个用户在线我们需要Session监听器,步骤如下:
1)创建一个war包的Maven工程(Maven如何管理后续会整理)注意: groupId 域名反写
artifactId:webapp应用名
注:创建完报错需要右键generate...stub最长的那个自动生成webapp下的web.xml映射文件
2)将项目部署到Tomcat服务器上,以eclipse为例 右键properties––>Targeted Runtimes选中已经配置好的Tomcat服务器––>Finish
3)创建一个java类实现HttpSessionListener接口
注:会让重写两个方法sessionCreated(HttpSessionEvent se)
sessionDestroyed(HttpSessionEvent se)
一个是写session创建时产生的事件监听处理逻辑
一个是session销毁时监听事件的处理逻辑
4)在session创建监听方法里 进行逻辑判断
首先定义一个全局的计数对象count 然后获取session对象用session获取Servlet上下文用上下文监听 (ps:因为监听session,而session本身只能监听自己即只能看见自己,直接用session绑定数据,统计用户时一直都为一个)
ServletContext ctx = event.getSession( ).getServletContext();
ctx.getAttribute("count");//假设count为绑定的
//在线用户数量
获取后应该考虑是否为空,有可能用户未访问 此时应该将count赋值一 并且绑定数据
ctx.setAttribute("count",count);
如果有值count++
在销毁session监听方法里 写计数减减逻辑
第一步同样获取servlet上下文 不用判断session因为要销毁肯定曾经拥有
接着ctx.setAttribute("count",--count);
5)在web.xml里配置
web.listener.SessionCounter
6)考虑用户及时下线处理,如果用户下线则立即统计用户下线量,减去并重新计算。因为session保存在服务器端,默认配置超时30分钟(session-timeout 超时可以设置 需要配置)正因为如此,如果不做处理,需要30分钟后才会重新统计,这时候可以使用session提供的失效方法
// 销毁session
request.getSession().invalidate();
此代码可以在Servlet类service(..,..)里或者doGet()、doPost()方法里
因为调用此方法会触发sessionDestroyed方法可以做到迅速重新统计在线用户列表人数
7)写一个jsp页面 用application内置对象获取绑定的数据count即统计值然后运行 最后观察结果(可以使用多个浏览器测试 一个浏览器可以当做一个用户 浏览器本身就是一个代理用户)
application.getAttribute("count");
–WriteByJson(纯手打 新手上路 不喜勿喷)