一、什么是监听器
Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。
监听对象:
1、ServletContext:application,整个应用只存在一个
2、HttpSession:session,针对每一个对话
3、ServletRequest:request,针对每一个客户请求
监听内容:创建、销毁、属性改变事件
监听作用:可以在事件发生前、发生后进行一些处理,一般可以用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等。
二、监听器的基本使用
1、创建一个实现监听器接口的类,并实现接口中的方法
public class TestListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("创建application对象"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("销毁application对象"); } }
2、添加注解@WebListener 或者配置web.xml文件,注册监听器
<listener> <listener-class>com.example.listenerdemo2.TestListener</listener-class> </listener>
三、常用监听器
1、ServletContextListener
(1)ServletContextListener
用于对ServletContext进行监听(创建、销毁)。
常用方法:
public void contextInitialized(ServletContextEvent sce);//ServletContext初始化 public void contextDestroyed(ServletContextEvent sce);//ServletContext销毁 //ServletContextEvent事件 public ServletContext getServletContext();取得一个ServletContext(application)对象
(2)ServletContextAttributeListener
对Servlet上下文属性的监听(增删改属性)。
常用方法:
public void attributeAdded(ServletContextAttributeEvent scab);//增加属性 public void attributeRemoved(ServletContextAttributeEvent scab);//属性删除 public void attributeRepalced(ServletContextAttributeEvent scab);//属性替换(第二次设置同一属性) public String getName();//得到属性名称 public Object getValue();//取得属性的值
示例代码:
@WebListener public class TestListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("创建application对象"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("销毁application对象"); } }
2、HttpSessionListener
(1)HttpSessionListener
对Session的整体状态的监听。
public void sessionCreated(HttpSessionEvent se);//session创建 public void sessionDestroyed(HttpSessionEvent se);//session销毁 //HttpSessionEvent事件 public HttpSession getSession();//取得当前操作的session
(2)HttpSessionAttributeListener
对session的属性监听。
public void attributeAdded(HttpSessionBindingEvent se);//增加属性 public void attributeRemoved(HttpSessionBindingEvent se);//删除属性 public void attributeReplaced(HttpSessionBindingEvent se);//替换属性 //HttpSessionBindingEvent事件 public String getName();//取得属性的名称 public Object getValue();//取得属性的值 public HttpSession getSession();//取得当前的session
示例代码:
@WebListener public class TestListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("创建session对象"); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("销毁session对象"); } }
HttpSession的销毁时机需要在web.xml中进行配置,如下:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
这样配置就表示session在1分钟之后就被销毁
3、ServletRequestListener
(1)ServletRequestListener
用于对Request请求进行监听(创建、销毁)。
public void requestInitialized(ServletRequestEvent sre);//request初始化 public void requestDestroyed(ServletRequestEvent sre);//request销毁 //ServletRequestEvent事件 public ServletRequest getServletRequest();//取得一个ServletRequest对象 public ServletContext getServletContext();//取得一个ServletContext(application)对象
(2)ServletRequestAttributeListener
对Request属性的监听(增删改属性)。
public void attributeAdded(ServletRequestAttributeEvent srae);//增加属性 public void attributeRemoved(ServletRequestAttributeEvent srae);//属性删除 public void attributeReplaced(ServletRequestAttributeEvent srae);//属性替换(第二次设置同一属性) //ServletRequestAttributeEvent事件:能取得设置属性的名称与内容 public String getName();//得到属性名称 public Object getValue();//取得属性的值
示例代码:
@WebListener public class TestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent sre) { System.out.println("销毁request对象"); } @Override public void requestInitialized(ServletRequestEvent sre) { System.out.println("创建request对象"); } }
综合例子:
获取在线用户数量
@WebListener public class TestListener implements ServletContextListener,HttpSessionListener { @Override public void contextInitialized(ServletContextEvent sce) { ServletContext servletContext=sce.getServletContext(); servletContext.setAttribute("count",0); } @Override public void contextDestroyed(ServletContextEvent sce) { } @Override public void sessionCreated(HttpSessionEvent se) { HttpSession session=se.getSession(); ServletContext servletContext=session.getServletContext(); int count=(int)servletContext.getAttribute("count"); count++; servletContext.setAttribute("count",count); } @Override public void sessionDestroyed(HttpSessionEvent se) { HttpSession session=se.getSession(); ServletContext servletContext=session.getServletContext(); int count=(int)servletContext.getAttribute("count"); count--; servletContext.setAttribute("count",count); } }
jsp页面:
<%
out.write("在线人数:"+application.getAttribute("count"));
%>
<a href="hello-servlet">Hello Servlet</a>
0条评论
点击登录参与评论