javaee Listener
Servlet API 中定义了几种监听器,大多数尽管不是全部,都将监听某种形式的会话活动,通过实现对应事件的监听器接口订阅某个事件,然后在部署描述符中添加 <listener> 配置,或者在该类中添加注释
@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 <br />aaaa");
System.out.println("add"+event.getName()+event.getValue());
application.setAttribute("aa","f33333 aaa <br />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>