观察者设计模式(监听器)
1.事件源:发生事件的对象
2、监听器:监听事件源上的发送的事件
3、事件对象:每发生一个事件都会产生一个事件对象,事件对象中封装了事件源
七、Servlet规范中的8个监听器
1监听ServletContext、HttpSession、ServletRequest对象的创建和销毁的监听器
注册监听:web.xml
ServletContextListener
/*
非常有用:
ServletContext初始化一次,contextInitialized也就调用一次
完成系统启动时的初始化工作。
比如:
一个配置文件中定义了很多的JavaBean
<beans>
<bean id="xxDao1" class="XXXDao1Impl"/>
<bean id="xxDao2" class="XXXDao2Impl"/>
...
</beans>
问题:用某个dao。在用dao实例时已经创建好的对象效率要高
在启动时,读取xml配置文件,把所有的bean都实例化,并放到内存中。
Spring:
*/
public class MyServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
System.out.println("ServletContext对象创建了"+sc);
}
public void contextDestroyed(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
System.out.println("ServletContext对象销毁了"+sc);
}
}
/*
统计当前有多少个客户端在访问
*/
public class MyHttpSessionListener implements HttpSessionListener {
//第一次调用 request.getSession()时
public void sessionCreated(HttpSessionEvent se) {
System.out.println(se.getSession()+"创建了一个会话对象");
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println(se.getSession()+"会话对象销毁了");
}
}
ServletRequestListener:统计网站中资源的访问次数
Map<String,Integer> key:资源的URL,value:访问次数
2监听ServletContext、HttpSession、ServletRequest对象中域中数据变化的监听器
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
public class MyServletContextAttributeListener implements
ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent scab) {
System.out.println("添加了新数据");
}
public void attributeRemoved(ServletContextAttributeEvent scab) {
System.out.println("移除了数据");
}
public void attributeReplaced(ServletContextAttributeEvent scab) {
System.out.println("数据被替换了");
}
}
3感知型监听器:不需要注册。谁实现了该类型的监听器,就能检测到自身的变化
HttpSessionBindingListener:感知自己何时被绑/解绑HttpSession域中。
HttpSessionActivationListener:感知自己何时随着HttpSession钝化/激活。
//当调用session.setAttribute("user", new User());时就会触发user中的方法
public class User implements Serializable, HttpSessionBindingListener,
HttpSessionActivationListener {
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("被钝化了");
}
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("被激活了");
}
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("绑定到了HttpSession域中");
}
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("从HttpSession域中解绑了");
}
}
web.xml
//配置session的会话时间
<session-config>
<session-timeout>30</session-timeout>
</session-config>
//注册监听器
<listener>
<listener-class>com.itheima.listener.MyServletContextListener</listener-class>
</listener>
<listener>
<listener-class>com.itheima.listener.MyHttpSessionListener</listener-class>
</listener>
<listener>
<listener-class>com.itheima.listener.MyServletContextAttributeListener</listener-class>
</listener>