Servlet监听器
一、监听三个域对象创建和销毁的事件监听器
1. ServletContextListener接口
MyServletContextListener
public class MyServletContextListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent arg0) { System.out.println(arg0.getServletContext() + "被创建了"); }
public void contextInitialized(ServletContextEvent arg0) { System.out.println(arg0.getServletContext() + "被销毁了"); } } |
Web.xml
<listener> <listener-class>cn.class3g.web.listener.MyServletContextListener </listener-class> </listener> |
应用:在web服务的启动时提供或创建资源,结束时回收。如web应用启动时利用ServletContextListener将数据表和数据准备好,则将创建表和数据的代码写在其中。Spring框架就是以监听器的形式启动的。
问:如果有多个监听器,在web.xml中注册时,怎样判断监听器的监听对象的?
答:利用java的反射机制
If(Object instanceOf ServletContextListener){
}else if( Object instanceOf HttpSessionListener){
}
…
2. HttpSessionListener接口
MySessionListener
public class MyHttpSessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent arg0) { System.out.println(arg0.getSource() + "被销毁了"); } public void sessionDestroyed(HttpSessionEvent arg0) { System.out.println(arg0.getSource() + "被创建了"); } } |
注册这个监听器
问:这两句打印什么时候会输出?
直接访问index.jsp或index.html会不会输出
引申出:session对象何时被创建???
答:访问index.html时不会创建session,但是jsp文件被访问是会创建session,因为session对象在getSession()方法被调用是才会创建,而jsp文件被译成servlet时java代码中有此方法的调用
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
。。。
如jsp页面中的page命令如下
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" session="false" %>
则servlet中不会调用getSession()
刷新jsp页面会不会打印
开心的浏览器访问jsp会不会打印
浏览器被关闭会不会摧毁session??不会,因为session默认存在30分钟
HttpSessionListener的作用:统计在线人数
3. ServletRequestListener接口
MyServletRequestListener
public class MyServletRequestListener implements ServletRequestListener { public void requestDestroyed(ServletRequestEvent arg0) { System.out.println("请求对象"+arg0.getSource() + "被销毁了"); }
public void requestInitialized(ServletRequestEvent arg0) { System.out.println("请求对象"+arg0.getSource() + "被创建了"); |