在前面我们学习了servletconfig和servletContext 知道了他们的应用方式,以及servletcontext 相关的监听后我们下面来看看httpsession 相关的监听
Httpsession 相关的监听有: HttpSessionListener,HttpSessionAttributeListener,HttpSessionBindingListener以及HttpSessionActivationListener 下面我们就来一个个看看相关实现:
一、HttpSessionListener 会话生命周期的监听
1、HttpSessionListener 实现这个接口并实现sessionCreated(HttpSessionEventarg0)和sessionDestroyed(HttpSessionEvent arg0)这两个方法就可以实现session 生命周期的监听,也就是在session创建的时候会调用sessionCreated(HttpSessionEvent arg0) 方法而通过HttpSessionEvent 这个类可以获取session对象。同样在session过期时会调用sessionDestroy(HttpSessionEvent arg0)通过方法的参数HttpSessionEvent对象可以获取session对象
2、配置方式有两种:第一使用java的注解:javax.servlet.annotation.WebListener
第二种就是web.xml 配置文件中配置监听
<listener>
<listener-class>soufun.com.HttpSessionL</listener-class>
</listener>
3、实例:在session创建或销毁时会调用这个类的相应方法
package soufun.com;
importjavax.servlet.http.HttpSession;
importjavax.servlet.http.HttpSessionEvent;
importjavax.servlet.http.HttpSessionListener;
/**
*@author WHD
*data 2015年8月5日
*/
public classHttpSessionL implements HttpSessionListener{
privatestatic int count=0;
@Override
publicvoid sessionCreated(HttpSessionEvent arg0) {
//TODO Auto-generated method stub
System.out.println("getthe session object");
HttpSessionsession=arg0.getSession();
HttpSessionL.count++;
session.setAttribute("count",count);
System.out.println("sessionstart:"+count);
}
@Override
publicvoid sessionDestroyed(HttpSessionEvent arg0) {
//TODO Auto-generated method stub
System.out.println("get out of session ");
HttpSessionL.count--;
HttpSessionsession= arg0.getSession();
session.setAttribute("count",count);
System.out.println("sessionconfigsessiontimeout:"+count);
}
publicstatic int getCount() {
returncount;
}
publicstatic void setCount(int count) {
HttpSessionL.count= count;
}
}
二、HttpSessionAttributeListener :
1、session属性变化的监听,也就是session中添加,修改,删除的时候会触发这个监听类,并且会调用相应的方法。
2、监听的配置:第一种使用java注释配置,javax.servlet.annotation.WebListener
第二种使用web.xml配置文件进行配置:
<listener>
<listener-class>soufun.com.HttpSessionAL</listener-class>
</listener>
3、实例:
(1)、使用javax.servlet.annotation.WebListener实现监听
package soufun.com;
importjavax.servlet.http.HttpSessionAttributeListener;
importjavax.servlet.http.HttpSessionBindingEvent;
importjavax.servlet.http.HttpSession;
importjavax.servlet.annotation.WebListener;
/**
*@author WHD
*data 2015年8月16日
*/
@WebListener()
public classHttpSessionAL implements HttpSessionAttributeListener {
@Override
publicvoid attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("session 中添加了属性-----");
}
@Override
publicvoid attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("session 中移除了属性----");
}
@Override
publicvoid attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("session 中替换了属性-----");
}
}
(2)、使用web.xml配置文件进行配置
package soufun.com;
importjavax.servlet.http.HttpSessionAttributeListener;
importjavax.servlet.http.HttpSessionBindingEvent;
importjavax.servlet.http.HttpSession;
/**
*@author WHD
*data 2015年8月16日
*/
public classHttpSessionAL implements HttpSessionAttributeListener {
@Override
publicvoid attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("session 中添加了属性");
}
@Override
publicvoid attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("session 中移除了属性");
}
@Override
publicvoid attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("session 中替换了属性");
}
}
三、HttpSessionBindingListener
1、监听session中绑定实现这个接口的类的时候触发响应函数
2、HttpSessionBindingListener是session中添加实例了这个接口的类的时候会调用这个类的相关方法
3、实例,注意这个和之前的不同不用配置监听,而是向session中添加,移除实现了这个接口的类的时候,就会执行这个类ValueBound(HttpSessionBindingEvent arg0) 和 valueUnbound(HttpSessionBindingEvent arg0) 这两个方法
package soufun.com;
importjavax.servlet.http.HttpSessionBindingEvent;
importjavax.servlet.http.HttpSessionBindingListener;
/**
*@author WHD
*data 2015年8月10日
*/
// 注意这个类和其他的绑定的类不同这里不用配置,是要session中添加或移除就会触发这个类
public classUser implementsHttpSessionBindingListener {
public User(){};
@Override
publicvoid valueBound(HttpSessionBindingEvent arg0) {
//TODO Auto-generated method stub
System.out.print("在session中添加实现了httpsessionbindinglistener这个接口的类的时候会执行这个方法");
}
@Override
publicvoid valueUnbound(HttpSessionBindingEvent arg0) {
//TODO Auto-generated method stub
System.out.print("从session中移除实现了httpsessionbindinglistener这个接口的类的时候会执行这个方法");
}
}
// session 中添加实现了接口的类
protected voiddoPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
// 创建对象
User user= new User();
//获取session
HttpSessionsession=request.getSession();
Stringid= session.getId();
System.out.println("session 中添加valuebound 属性" +"sessionid"+id);
session.setAttribute("user",user);
System.out.println("hsbl 的valueBound方法在执行");
// 从session会话中移除这个值
session.removeAttribute("user");
System.out.println("hsbl 的valueunBound 方法在执行");
}