Listener学习笔记
本文参考了部分学友的文章,对这位朋友的辛勤劳动表示敬意,谢谢!
原文链接:http://just-do-myself.iteye.com/blog/654979
监听器常用在application对象及session对象创建时:
1)如果一个类实现了ServletContextListener接口,则需要重写init方法及destroy方法,当服务器启动的时候init方法被调用,当服务器关闭的时候destroy方法被调用
2)如果一个类实现了ServletContextAttributeListener接口,则需要重写attributeAdded方法attributeRemoved方法及attributeReplaced方法,当往application里放值的时候attributeAdded方法被调用,当从application里删值的时候attributeRemoved方法被调用,当替换application里的值的时候attributeReplaced方法被调用
3)如果一个类实现了HttpSessionListener接口,则需要重写init方法及destroy方法,当session创建的时候init方法被调用,当session销毁的时候destroy方法被调用
4)如果一个类实现了HttpSessionAttributeListener接口,则需要重写attributeAdded方法及attributeRemoved方法及attributeReplaced方法,当往session里放值的时候attributeAdded方法被调用,当从session里删值的时候attributeRemoved方法被调用,当替换session里的值的时候attributeReplaced方法被调用
如要统计一下网站的同时在线用户数量及最高在线数量,可以使用HttpSessionListener实现,当用户访问的时候创建session,session数量加一,将session数量放入application里,当用户离开的时候session销毁,session数量减一
举例:
1、用户登录表单Login.jsp
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>用户登录表单</title>
</head>
<body>
<%--表单,提交方式为post-,提交到DoGetDemo--%>
<form action="LoginConf.jsp" method="post">
用户名:<input type="text" name="username"/><br>
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</form>
</body>
</html>
2、用户登录处理页:LoginConf.jsp
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>登录判断</title>
</head>
<body>
<center>
<%
String username = request.getParameter("username") ; //接受用户名参数
//登录判断省略
session.setAttribute("username",username);
%>
//跳转到用户列表页
<jsp:forward page="ShowAllUser.jsp"></jsp:forward>
</center>
</body>
</html>
3、用户列表显示页面:ShowAllUser.jsp
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*"%>
<html>
<head>
<title>在线用户列表</title>
</head>
<body>
<%=session.getAttribute("username")%>
欢迎你的登录,你可以<a href="Logout.jsp">注销</a>。
<h3>在线用户列表</h3><hr>
<%
ArrayList<String> allUser = (ArrayList<String>)application.getAttribute("allUser");
Iterator<String> iter = allUser.iterator();
while(iter.hasNext()) {
out.println("★" + iter.next() + "★ ");
}
%>
</body>
</html>
4、用户注销页面Logout.jsp
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>注销</title>
</head>
<body>
<%
//注销时进行session销毁
session.invalidate() ;
%>
</body>
</html>
5.自定义Listener:OnlineUserListener
package listener;
import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineUserListener implements
ServletContextListener,HttpSessionListener,HttpSessionAttributeListener{
// 声明一个ServletContext对象
private ServletContext application = null ;
//ServletContext创建时调用该方法
public void contextInitialized(ServletContextEvent sce) {
//储存所用用户名
ArrayList<String> allUser = new ArrayList<String>();
//获得当前application对象
application = sce.getServletContext();
//设置到application范围
application.setAttribute("allUser", allUser);
}
//ServletContext销毁时调用该方法
public void contextDestroyed(ServletContextEvent sce) {
}
//session创建时调用该方法
public void sessionCreated(HttpSessionEvent se) {
}
//session销毁时调用该方法
public void sessionDestroyed(HttpSessionEvent se) {
//获得当前所有的用户
ArrayList<String> allUser = (ArrayList<String>) application.getAttribute("allUser");
//获得删除的用户
String user = (String)se.getSession().getAttribute("username");
//删除该用户
allUser.remove(user);
//重新设置到application范围中
application.setAttribute("allUser", allUser);
}
//session范围属性添加时调用
public void attributeAdded(HttpSessionBindingEvent se) {
//获得当前所有的用户
ArrayList<String> allUser = (ArrayList<String>) application.getAttribute("allUser");
//获得添加的用户
String user = (String) se.getValue();
//添加到所有用户中
allUser.add(user);
}
//session范围属性移除时调用
public void attributeRemoved(HttpSessionBindingEvent se) {
}
//session范围属性替换时调用
public void attributeReplaced(HttpSessionBindingEvent se) {
}
}
6.Listener配置
<listener>
<listener-class>listener.OnlineUserListener</listener-class>
</listener>
上一篇: 论文实现:处理数据之生成batch
下一篇: netty的jar包依赖
推荐阅读
-
Web前端新人笔记之height、min-height的区别_html/css_WEB-ITnose
-
Redis 学习 redis 下载 redis 集群 redis可视化工具
-
php学习笔记 面向对象中[接口]与[多态性]的应用
-
php SQLite学习笔记与常见问题分析第1/2页_php技巧
-
Android进阶学习:移动端开发重点学习的十点,不能再得过且过的写业务代码了
-
学习python第三天
-
运营笔记:网站收录所有的问题,只看这一篇文章就够了!
-
ThreadLocal和InheritableThreadLocal学习笔记
-
框架修炼之ssm-Mybatis学习笔记一
-
Python学习之旅:使用virtualenv创建Python环境及PyQT5环境配置