Servlet API 中定义了几种监听器,大多数尽管不是全部,都将监听某种形式的会话活动,通过实现对应事件的监听器接口订阅某个事件,然后在部署描述符中添加 配置,或者在该类中添加注释
@javax.servlet.annotation.WebListener (但不需要同事使用这两种方式)
如果需要,可以在单个类中实现多个监听器接口,当然,你不会希望将不同业务的代码添加到同一个类中。当某个事件发生时,将触发事件发布,然后容器将调用对应事件监听器中的方法。
Listener
监听三个域对象
ServletContext
ServletRequest
HttpSession
监听三个对象的创建和销毁
ServletContextListener
servlet 启动 和 销毁的时候会触发
ServletRequestListener
每次request 请求来 会触发, 刷新下页面就会触发
HttpSessionListener
一个浏览器只创建一次session
创建:java中第一次调用 request.getSession 的时候
销毁:
session超时
手动销毁 session
服务器非正常关闭
监听三个对象的属性变化 (添加 替换 删除)
ServletContextAttributeListener
application.setAttribute("aa","fffffff 66666 aaa
aaaa");
System.out.println("add"+event.getName()+event.getValue());
application.setAttribute("aa","f33333 aaa
aaaa");
application.removeAttribute("aa");
ServletRequestAttributeListener
HttpSessionAttributeListener
监听session中javabean的状态
这2个接口需要javabean实现,是让javabean感知到自己的状态
HttpSessionActivationListener (钝化(session 写入 磁盘)和活化 (磁盘写入session))
钝化: javabean 从session 持久化到磁盘上
活化: javabean 从磁盘写入session 中
也是要写到指定的类上 要实现2个接口
implements
HttpSessionActivationListener,Serializable{
可以通过配置文件修改 javabean 钝化 活化 的时间
/META-INFO/context.xml
maxIdleSwap="1" 多长时间不用
directory 目录下
xml version
="1.0"
encoding
="UTF-8"
?>
< Context >
< Manager className ="org.apache.catalina.session.PersistentManager" maxIdleSwap ="1" >
< Store className ="org.apache.catalina.session.FileStore" directory ="gwyy" />
Manager >
Context >
HttpSessionBindingListener (session的绑定和解绑 )
需要往session里面new 哪个类就在哪个类上加绑定接口
session.setAttribute(
"p"
,
new
Person(
1
,
"tom"
));
要往 Person 类上加接口
让容器继承监听器 ,然后加上@WebListener
@WebListener
public class SessionListener implements HttpSessionListener, HttpSessionIdListener{}
web.xml 注册
<
listener
>
<
listener-class
>
me.liangtian.web.servlet.myServletLis
listener-class
>
listener
>
<
listener
>
<
listener-class
>
me.liangtian.web.servlet.myRequestLis
listener-class
>
listener
>
<
listener
>
<
listener-class
>
me.liangtian.web.servlet.mySessionLis
listener-class
>
listener
>