1、监听域对象自身的创建和销毁时间的监听器,对应方法create和destroy
ServletContext(application:一个web应用只有一个)HttpSession ServletRequest
对应接口:在后面加上Listener
ServletContextListener主要用途:定时器、全局属性对象、全局数据库链接、加载缓存信息等。
Web-xml中只能配置一个
创建:启动服务器
销毁:关闭服务器
可以通过event获取servletContext,通过它可以调用getInitParameter(name)获得web.xml中context param(name、value)配置的参数;还可以调用set向application中设置属性
HttpSessionListener主要用途:统计在线人数、记录访问日志
Web-xml中可配置多个
创建:启动服务器并访问web应用的一个页面
销毁:1、关闭服务器 2、关闭浏览器直到session过期(时间不可量化)3、不关闭浏览器,session超时(可在web.xml中配置session-config下session-timeout单位为分钟 但该设置并不准确)
ServletRequestListener主要用途:读取地址栏参数、记录访问历史
也可在web.xml中配置多个
在接收请求时创建后自动销毁 访问后即销毁
2、监听域对象中的属性的增加和删除的事件监听器,对应方法added、removed、replaced
ServletContextAttributeListener、request、session
Event.getName()
Request.getContextPath()获得项目名称
<button οnclick=”location.href=’<%=request.getContextPath()%>/init.jsp’;”>init<button>
3、监听绑定到HttpSession域中的某个对象的状态的事件监听器
HttpSession中的对象状态:绑定(setAttribute)——>解除绑定(remove) 钝化(将session持久到存储器上)——>活化(将存储器上恢复session)
正常情况下session是存在于服务器内存中的,但当访问人数过大时会占用极大内存,这时有个机制就是将不经常使用的session暂时序列化到系统文件系统或是数据库系统中,当被使用时反序列化到内存中,整个过程由服务器自动完成
Tomcat中两种Session钝化管理器
Session钝化机制由SessionManager管理
Org。Apche。Catalina。Session。StandardManager
A、当Tomcat服务器被关闭或重启时,tomcat服务器会将当前内存中的Session对象钝化到服务器文件系统中;
B、另一种情况是web应用程序被重新加载(reload)时,内存中的Session对象也会被钝化到服务器的文件系统中。
C、钝化后的文件被保存到:Tomcat安装路径
/work/Catalina/hostname/applicationname/SESSION.ser
Org.apche.catalina.session.Persistentmanager
A、首先在钝化的基础上进行了扩张。第一种情况如上面1,第二种如上2,第三种情况,可以配置主流内存的Session对象数目,将不长使用的Session对象保存到文件系统或数据库,当用时再重新加载
B、默认情况下,Tomcat提供两个钝化驱动类
Org.apche.Catalina.FileStore和org.apche.Catalina.JDBCStore
两种接口:(不需要在web.xml中注册)
创建的实现类是一个javabean
HttpSessionBindingListene
绑定:valueBound方法
解除绑定:valueUnbound方法 event.getName
HttpSessionActivationListener
钝化:sessionWillPassivate方法
活化:sessionDidActivate event.getSource
在钝化活化时还务必要实现Serializable
Servlet3.0下监听器的使用
1、jre1.6 j2ee6.0 web.xml version=3.0
@WebListener(“This is my demo listener”)
该注解用于将类声明为监听器,被其标注的类必须实现至少实现上文1、2中的六个接口之一,这样就不用在web.xml中配置<listener>了
项目实战 在线用户(session数)和人数(IP数)统计
创建一个HttpSessionListener实现类,int变量保存session创建个数,每次创建(++)或销毁(--)后都将该变量重新设置到servletContext中。因为request方法可以获取IP地址(getRemoteAddr()),实现统计IP地址数(一个IP地址可以通过不同浏览器访问增加session数目)
代码示例:
User : sessionId ip firstAccessTime
public class JudgeSessionId {
public static User getUserBySessionId(ArrayList<User> userList,String sessionId){
if(userList != null){
for(int i = 0 ; i < userList.size() ; i++){
User user = (User)userList.get(i);
if(user.getSessionId().equals(sessionId)){
return user;
}
}
}
return null;
}
}
public class RequestListenerDemoimplements ServletRequestListener {
ArrayList<User> userList = null;
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
HttpServletRequest request = (HttpServletRequest)arg0.getServletRequest();
String sessionId = request.getSession().getId();
userList = (ArrayList<User>) request.getServletContext().getAttribute("userList");
if(userList ==null){
userList = new ArrayList<User>();
}
if(JudgeSessionId.getUserBySessionId(userList,sessionId) ==null){
User user = new User();
user.setFirstAccessTime(new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date()));
user.setIp(request.getRemoteAddr());IP地址
user.setSessionId(sessionId);
userList.add(user);
}
request.getServletContext().setAttribute("userList",userList);
}
}
public class SessionListenerDemoimplements HttpSessionListener {
private int sessionNumber = 0;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
this.sessionNumber++;
System.out.println(arg0.getSession().getId());
arg0.getSession().getServletContext().setAttribute("sessionNumber",this.sessionNumber);
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
this.sessionNumber--;
System.out.println("sessiondestroy");
arg0.getSession().getServletContext().setAttribute("sessionNumber",this.sessionNumber);
ArrayList<User> userList = (ArrayList<User>) arg0.getSession().getServletContext().getAttribute("userList");
String sessionId = arg0.getSession().getId();
User user = JudgeSessionId.getUserBySessionId(userList, sessionId);//集合为空或集合中没有该session就返回null
If(userList != null){
userList.remove(user);
}
}
}