public class MyHttpServletContextListener implements ServletContextListener { //初始化 @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("context创建了"); } //销毁 @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("context销毁了"); } }
<listener> <listener-class>com.david.listener.MyHttpServletContextListener</listener-class> </listener>
服务器启动时创建,服务器关闭时销毁。
然后就可以在contextInitialized中做一些任务调度了,如:每3秒钟 输出一段话。
public void contextInitialized(ServletContextEvent sce) { System.out.println("context创建了"); Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { System.out.println("输出一句话 3秒执行一次"); } },new Date(),3000); }
2.监听 HttpSession域的创建与销毁的监听器 HttpSessionListener
第一次使用session request.getSession时创建,服务器关闭销毁 session过期 手动销毁
创建myHttpSessionListener类 实现 HttpSessionListener接口 重写两个方法
public class myHttpSessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("session创建了" + se.getSession().getId()); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session销毁了"); } }
然后编写web.xml 配置一下
<listener> <listener-class>com.david.listener.myHttpSessionListener</listener-class> </listener>
3.监听ServletRequest域创建与销毁的监听器 ServletRequestListener
每一次请求都会创建request 请求结束后销毁
编写方法同上,生命周期太短,不常用。
监听三大域对象的属性变化的
域对象的通用方法:
setAttribute(name,value) --触发添加、修改属性的监听器方法
getAttribute(name) --触发获得
removeAttribute(name) --触发删除
ServletContextAttributeListener 监听器
编写myServletContextAttributeListener 实现 ServletContextAttributeListener接口 重写三个方法
public class MyServletContextAttributeListener implements ServletContextAttributeListener { //添加 @Override public void attributeAdded(ServletContextAttributeEvent scae) { System.out.println(scae.getName()); //放到域中的名 System.out.println(scae.getValue()); //放到域中的值 } //删除 @Override public void attributeRemoved(ServletContextAttributeEvent scae) { System.out.println(scae.getName()); //删除域中的名 System.out.println(scae.getValue()); //删除域中的值 } //修改 @Override public void attributeReplaced(ServletContextAttributeEvent scae) { System.out.println(scae.getName()); //修改域中的名 System.out.println(scae.getValue()); //修改域中的值 } }
配置xml
<listener> <listener-class>com.david.listener.MyServletContextAttributeListener</listener-class> </listener>
测试
ServletContext sc = request.getServletContext();
sc.setAttribute("name",userName);
HttpSessionAttributeListener监听器、ServletRequestAttributeListener监听器同上
对象感知监控器 --与session中的绑定对象相关的监听器
就是要被绑定到session中的对象有几种状态
绑定状态:一个对象被放到session域中了
解绑状态:就是这个对象从session域中删除了
钝化状态:是将session内存中对象持久化(序列化)到磁盘
活化状态:就是将磁盘上的对象再次恢复到session内存中
绑定域解绑的监听器 HttpSessionBindingListener
将user类实现HttpSessionBingdingListener接口 重写绑定 解绑方法
public class User implements HttpSessionBindingListener{ private int UserId; private String UserName; private String PassWord; private int Age; private String Sex; public int getUserId() { return UserId; } public void setUserId(int UserId) { this.UserId = UserId; } public String getUserName() { return UserName; } public void setUserName(String UserName) { this.UserName = UserName; } public String getPassWord() { return PassWord; } public void setPassWord(String PassWord) { this.PassWord = PassWord; } public int getAge() { return Age; } public void setAge(int Age) { this.Age = Age; } public String getSex() { return Sex; } public void setSex(String Sex) { this.Sex = Sex; } @Override public void valueBound(HttpSessionBindingEvent event) { System.out.println("user被放到session中了"); } @Override public void valueUnbound(HttpSessionBindingEvent event) { System.out.println("user从session中解绑了"); } }
测试
HttpSession session = request.getSession(); session.setAttribute("user",new User());
使用session钝化 活化 可以解决当用户很多时,对服务器进行优化
钝化与活化的监听器 HttpSessionActivationListener
继续使用user类 实现 HttpSessionActivationListener接口 重写两个方法
public class User implements HttpSessionBindingListener,HttpSessionActivationListener{ private int UserId; private String UserName; private String PassWord; private int Age; private String Sex; public int getUserId() { return UserId; } public void setUserId(int UserId) { this.UserId = UserId; } public String getUserName() { return UserName; } public void setUserName(String UserName) { this.UserName = UserName; } public String getPassWord() { return PassWord; } public void setPassWord(String PassWord) { this.PassWord = PassWord; } public int getAge() { return Age; } public void setAge(int Age) { this.Age = Age; } public String getSex() { return Sex; } public void setSex(String Sex) { this.Sex = Sex; } @Override public void valueBound(HttpSessionBindingEvent event) { System.out.println("user被放到session中了"); } @Override public void valueUnbound(HttpSessionBindingEvent event) { System.out.println("user从session中解绑了"); } @Override public void sessionWillPassivate(HttpSessionEvent se) { System.out.println("钝化了"); } @Override public void sessionDidActivate(HttpSessionEvent se) { System.out.println("活化了"); } }
测试
HttpSession session = request.getSession(); session.setAttribute("user",new User());
关闭程序后 激活钝化 文件存储在work/catalina/localhost/的文件 获取session时被活化了
可以通过配置文件 指定对象钝化的时间 --对象多长时间不用被钝化
在META-INF下创建一个context.xml
<?xml version="1.0" encoding="UTF-8"?> <Context> <!-- maxIdleSwap:session中的对象多长时间不使用就钝化 --> <!-- directory:钝化后的对象的文件写到磁盘的哪个目录下 配置钝化的对象文件在 work/catalina/localhost/钝化文件 --> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <Store className="org.apache.catalina.session.FileStore" directory="dist" /> </Manager> </Context>