用监听器实现在线用户列表
需求:显示当前都有哪些用户在线,将用户名显示在页面上。
思路:
1,首先建立JavaBean,例如Manager对象,建立username,password字段,在数据库中添加若干条信息,
2, 做一个登录页面,填写用户名和密码,提交后会找一个servlet,这个servlet会根据用户提交的用户名和密码查询数据库,看是否有相应的用户,有则登陆成功,将用户名和密码封装成manager对象,并存储到session域中,重定向到首页;没有则失败,转发到登录页面重新登陆,并给出友好提示信息。
3, 在主页中从session域中获取用户名,显示在页面上,还有一个<退出>超链接,点击会提交到一个servlet,这个servlet会把用户在session中存的数据清除,并重定向到登陆页面。首页下面还有一个查询所有在线用户的超链接,
4, 这个超链接会连接一个servlet,servlet从维护在线用户列表的工具类中获得当前在线用户集合,存储在request域中,转发到现实页面。
5, 显示页面通过<c:forEach>标签显示所有在线用户名后面有一个<踢出用户>的超链接,点击会提交到一个servlet,这个servlet会调用工具类的移除方法,将相应用户从列表中移除,根据的是用户的用户名。
核心:服务器是如何知道一个用户登录了呢?是通过监听机制,通过JavaBean的监听类HttpSessionBindingListener实现。
具体方法是:将需要监听的javabean实现HttpSessionBindingListener监听器并实现里面的方法。里面的方法有两个:public voidvalueBound(HttpSessionBindingEvent event),public voidvalueUnbound(HttpSessionBindingEvent event),前者是当这个javabean对象被存入session中是调用,所以,在这个方法里调用工具类的添加如列表集合的方法,就可以自动将这个用户添加进在线用户列表了,实现了动态自动获取的能力;后者是在这个javabean对象被从session域中移除的时候被调用的,所以在这个方法里调用工具类的从列表中移除方法,就可以将用户从列表中移除了,即当会话结束时调用,移除用户。
6,踢出用户的功能:因为列表map中维护的是当前用户对象和当前用户的session组成的键值对,所以可以根据username获取出对应的键,再根据相应的键获取当前用户对应的session,再将session中的manager属性移除。所以我们管理员可以帮助用户“退出”,即强制将其踢出会话。