一、什么是监听器
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条评论
点击登录参与评论