Listener 监听器
监听器用于监听 web 应用中某些对象的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器会自动调用监听 器对象中的方法。
1.监听器分类
按监听的对象划分,可以分为:
- ServletContext 对象生命周期监听器与属性操作监听器
- HttpSession 对象生命周期监听器与属性操作监听器
- ServletRequest 对象生命周期监听器与属性操作监听器
2.ServletContext 对象的生命周期监听器
ServletContextListener 接口定义了 ServletContext 对象生命周期的监听行为:
- void contextInitialized(ServletContextEvent sce)
ServletContext 对象创建后会触发该监听方法,并将 ServletContext 对象传递到该方法中 - void contextDestroyed(ServletContextEvent sce)
ServletContext 对象在销毁之前会触发该监听方法,并将 ServletContext 对象传递到该方法中
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* ServletContext对象生命周期监听器
*/
@WebListener
public class ServletContextLifeCycleListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
System.out.println(servletContext);
System.out.println("ServletContext Init......");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
System.out.println(servletContext);
System.out.println("ServletContext Destroy......");
}
}
运行结果:
在启动项目时:
在关闭项目时:
3.ServletContext 对象的属性操作监听器
ServletContextAttributeListener 接口定义了对于 ServletContext 对象属性操作的监听行为
- void attributeAdded(ServletContextAttributeEvent scae)
向 ServletContext 对象中添加属性时会触发该监听方法,并将 ServletContext 对象传递到该方法中。触发事件的方法 servletContext.setAttribute(“key”,“value”)。 - void attributeRemoved(ServletContextAttributeEvent scae)
当从 ServletContext 对象中删除属性时会触发该监听方法,并将 ServletContext 对象传递到该方法中。触发事件方法 servletContext.removeAttribute(“key”)。 - void attributeReplaced(ServletContextAttributeEvent scae)
当从 ServletContext 对象中属性的值发生替换时会触发该监听方法,并将 ServletContext 对象传递到该方法中。触发事件的方法 servletContext.setAttribute(“key”,“value”)。
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
/**
* ServletContext对象属性操作监听器
*/
public class ServletContextAttrListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("-----------Added Start---------------");
System.out.println(scae.getName()+"-----"+scae.getValue());
System.out.println(scae.getServletContext());
System.out.println("------------Added End--------------");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("-----------Removed Start---------------");
System.out.println(scae.getName()+"-----"+scae.getValue());
System.out.println(scae.getServletContext());
System.out.println("------------Removed End--------------");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("-----------Replaced Start---------------");
System.out.println(scae.getName()+"-----"+scae.getValue());
System.out.println(scae.getServletContext());
System.out.println("------------Replaced End--------------");
}
}
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* ServletContext对象触发
*/
@WebServlet("/attr.do")
public class ServletContextAttrServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("key","DQCGM");
servletContext.setAttribute("key","DQC");
servletContext.removeAttribute("key");
}
}
<listener>
<listener-class>com.listener.ServletContextAttrListener</listener-class>
</listener>
运行结果:
4.HttpSession 对象的生命周期监听器、
HttpSessionListener 接口定义了 HttpSession 对象生命周期的监听行为
- void sessionCreated(HttpSessionEvent se)
HttpSession 对象创建后会触发该监听方法,并将已创建 HttpSession 对象传递到该方法中 - void sessionDestroyed(HttpSessionEvent se)
HttpSession 对象在销毁之前会触发该监听方法,并将要销毁的 HttpSession 对象传递到该方法中
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* HttpSession对象的生命周期监听器
*/
public class HttpSessionLifeCycleListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println(se.getSession());
System.out.println("Http Session Created....");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println(se.getSession());
System.out.println("Http Session Destroyed....");
}
}
<listener>
<listener-class>com.listener.HttpSessionLifeCycleListener</listener-class>
</listener>
运行结果:
项目启动时:
动用代码消除session:
5.HttpSession 对象的属性操作监听器
HttpSessionAttributeListener 接口定义了对于 HttpSession 对象属性操作的监听行为。
- void attributeAdded(HttpSessionBindingEvent se)
向 HttpSession 对象中添加属性时会触发该监听方法,并将 HttpSession 对象传递到该方法中。触发事件的方法 HttpSession.setAttribute(“key”,“value”) - void attributeRemoved(HttpSessionBindingEvent se)
当从 HttpSession 对象中删除属性时会触发该监听方法,并将 HttpSession 对象传递到该方法中。触发事件方法 HttpSession.removeAttribute(“key”) - void attributeReplaced(HttpSessionBindingEvent se)
当从 HttpSession 对象中属性的值发生替换时会触发该监听方法,并将 HttpSession 对象传递到该方法中。触发事件的方法 HttpSession.setAttribute(“key”,“value”)
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/**
* HttpSession对象属性监听器
*/
public class HttpSessionAttrListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("---HttpSessionAttr--------Added Start---------------");
System.out.println(se.getName()+"-----"+se.getValue());
System.out.println(se.getSession());
System.out.println("----HttpSessionAttr--------Added End--------------");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("---HttpSessionAttr--------Removed Start---------------");
System.out.println(se.getName()+"-----"+se.getValue());
System.out.println(se.getSession());
System.out.println("----HttpSessionAttr--------Removed End--------------");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("---HttpSessionAttr--------Replaced Start---------------");
System.out.println(se.getName()+"-----"+se.getValue());
System.out.println(se.getSession());
System.out.println("----HttpSessionAttr--------Replaced End--------------");
}
}
<listener>
<listener-class>com.listener.HttpSessionAttrListener</listener-class>
</listener>
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/sessionAttr.do")
public class HttpSessionAttrServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.setAttribute("key","DQCGM");
session.setAttribute("key","DQC");
session.removeAttribute("key");
}
}
运行结果:
6.HttpServletRequest 对象的生命周期监听器
ServletRequestListener 接口定义了 ServletReqest(是 HttpServletRequest 接口的父接口类型)对象生命周期的监听行为
- void requestInitialized(ServletRequestEvent sre)
HttpServletRequest 对象创建后会触发该监听方法,并将已创建 ServletRequest 对象传递到该方法中 - void requestDestroyed(ServletRequestEvent sre)
HttpServletRequest 对象在销毁之前会触发该监听方法,并将要销毁的 ServletRequest 对象传递到该方法中
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
/**
* 监听HttpServletRequest对象生命周期监听器
*/
public class HttpServletRequestLifeCycleListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println((HttpServletRequest)sre.getServletRequest());
System.out.println("HttpServletRequest....Destroyed");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println((HttpServletRequest)sre.getServletRequest());
System.out.println("HttpServletRequest....Initialized");
}
}
<listener>
<listener-class>com.listener.HttpServletRequestLifeCycleListener</listener-class>
</listener>
运行结果:
在项目启动时:
7.HttpServletRequest 对象的属性操作监听器
ServletRequestAttributeListener 接口定义了对于 HttpServletRequest 对象属性操作的监听行为
- void attributeAdded(ServletRequestAttributeEvent srae)
向 HttpServletRequest 对象中添加属性时会触发该监听方法,并将 ServletRequest 对象传递到该方法中。触发事件的方法 HttpServletRequest.setAttribute(“key”,“value”)。 - void attributeRemoved(ServletRequestAttributeEvent srae)
当从 HttpServletRequest 对象中删除属性时会触发该监听方法,并将 ServletRequest 对象传递到该方法中。触发事件方法 HttpServletRequest.removeAttribute(“key”) - void attributeReplaced(ServletRequestAttributeEvent srae)
当 从 HttpServletRequest 对 象 中 属 性 的 值 发 生 替 换 时 会 触 发 该 监 听 方 法 , 并 将 ServletRequest 对象传递到该方法中。 触发事件的方HttpServletRequest.setAttribute(“key”,“value”)
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.HttpServletRequest;
/**
* HttpServletRequest属性操作监听器
*/
public class HttpServletRequestAttrListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("---HttpServletRequestAttr--------Added Start---------------");
System.out.println(srae.getName()+"-----"+srae.getValue());
System.out.println((HttpServletRequest)srae.getServletRequest());
System.out.println("----HttpServletRequestAttr--------Added End--------------");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("---HttpServletRequestAttr--------Removed Start---------------");
System.out.println(srae.getName()+"-----"+srae.getValue());
System.out.println((HttpServletRequest)srae.getServletRequest());
System.out.println("----HttpServletRequestAttr--------Removed End--------------");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("---HttpServletRequestAttr--------Replaced Start---------------");
System.out.println(srae.getName()+"-----"+srae.getValue());
System.out.println((HttpServletRequest)srae.getServletRequest());
System.out.println("----HttpServletRequestAttr--------Replaced End--------------");
}
}
<listener>
<listener-class>com.listener.HttpServletRequestAttrListener</listener-class>
</listener>
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/requestAttr.do")
public class HttpServletRequestAttrServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("key","DQCGM");
req.setAttribute("key","DQC");
req.removeAttribute("key");
}
}
运行结果:
8.基于注解式开发监听器
支持注解式开发,通过@WebListener 注解替代 web.xml 中 Listener 的配置。
第一个案例就是注解开发。。。