监听器(Listener)的概念
监听器就是一个实现特定接口(ServletContextListener,HttpSessionListener,ServletRequestListener等)的普通java程序,这个程序专门用于监听另一个java对象的方法的创建,销毁,调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
- 事件源:被监听的对象 ----- 三个域对象 request session servletContext
- 监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器
- 注册监听器:将监听器与事件源进行绑定
- 响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码
监听器的工作原理
- 操作事件源,产生事件对象,将事件对象传递给监听器,并且执行监听器相应监听方法
监听的对象
- ServletContext:application,整个应用只存在一个
- HttpSession:session,针对每一个对话
- ServletRequest:request,针对每一个客户请求
- 监听作用:可以在事件发生前、发生后进行一些处理,一般可以用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等。
- 除了上述的,还有如下表所示:
ServletContextListener | 用于监听 ServletContext 对象的创建与销毁过程 |
---|---|
HttpSessionListener | 用于监听 HttpSession 对象的创建和销毁过程 |
ServletRequestListener | 用于监听 ServletRequest 对象的创建和销毁过程 |
ServletContextAttributeListener | 用于监听 ServletContext 对象中的属性变更 |
HttpSessionAttributeListener | 用于监听 HttpSession 对象中的属性变更 |
ServletRequestAttributeListener | 用于监听 ServletRequest 对象中的属性变更 |
HttpSessionBindingListener | 用于监听 JavaBean 对象绑定到 HttpSession 对象和从 HttpSession 对象解绑的事件 |
HttpSessionActivationListener | 用于监听 HttpSession 中对象活化和钝化的过程 |
监听器的基本使用
创建步骤:
创建步骤:
1、创建一个实现监听器接口的类
2、配置web.xml文件,注册监听器
<listener>
<listener-class>自定义类名</listener-class>
</listener>
-
监听器的启动顺序:按照web.xml的配置顺序来启动
-
加载顺序:监听器>过滤器>Servlet
示例代码:
这是servlet的代码:
package src.com.wdhcr.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class Servlet05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是servlet的请求方法");
HttpSession session = req.getSession();
session.setAttribute("user","张三");
System.out.println(session.getAttribute("user"));
session.invalidate();
}
@Override
public void init() throws ServletException {
System.out.println("这是servlet的初始化方法");
}
@Override
public void destroy() {
System.out.println("这是servlet的销毁方法");
}
}
这是过滤器的代码
package src.com.wdhcr.filter;
import javax.servlet.*;
import java.io.IOException;
public class Filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("这是filter的初始化方法");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("这是filter的拦截方法");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("这是过滤器放行后");
}
@Override
public void destroy() {
System.out.println("这是filter的销毁方法。");
}
}
ServletRequestListener 监听器的代码
package src.com.wdhcr.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/*
* servletrequest的监听器类
*
* */
public class Listener01 implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("这是request监听器的销毁方法");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("这是request监听器的初始化方法");
}
}
ServletContextListener 监听器的代码
package src.com.wdhcr.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/*
ServletContext的监听器
* */
public class Listener02 implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("这是ServletContext的监听器初始化方法");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("这是ServletContext的监听器销毁方法");
}
}
HttpSessionListener 监听器的代码
package src.com.wdhcr.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/*
* session监听器的类
*
* */
public class Listener03 implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("这是session的初始化方法");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("这是session的销毁方法");
}
}
web.xml文件的配置:
<servlet>
<servlet-name>Servlet05</servlet-name>
<servlet-class>src.com.wdhcr.servlet.Servlet05</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet05</servlet-name>
<url-pattern>/Servlet05</url-pattern>
</servlet-mapping>
<filter>
<filter-name>Filter01</filter-name>
<filter-class>src.com.wdhcr.filter.Filter01</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>src.com.wdhcr.listener.Listener01</listener-class>
</listener>
<listener>
<listener-class>src.com.wdhcr.listener.Listener02</listener-class>
</listener>
<listener>
<listener-class>src.com.wdhcr.listener.Listener03</listener-class>
</listener>
- 运行结果如下图所示:
Servlet监听器分为三大类
1、数据域对象创建和销毁监听器
监听域对象自身的创建和销毁的事件监听器,如:
- ServletRequestListener的创建和销毁
public class Listener01 implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("这是request监听器的销毁方法");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("这是request监听器的初始化方法");
}
web.xml文件:
<listener>
<listener-class>src.com.wdhcr.listener.Listener01</listener-class>
</listener>
- HttpSessionListener的创建和销毁
public class Listener03 implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("这是session的初始化方法");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("这是session的销毁方法");
}
}
web.xml文件设置:
<listener>
<listener-class>src.com.wdhcr.listener.Listener03</listener-class>
</listener>
- ServletContext的创建和销毁
public class Listener02 implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("这是ServletContext的监听器初始化方法");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("这是ServletContext的监听器销毁方法");
}
}
web.xml文件设置:
<listener>
<listener-class>src.com.wdhcr.listener.Listener02</listener-class>
</listener>
2、数据域对象和属性变更监听器
-
ServletContextAttributeListener 监听ServletContext中属性变化
-
HttpSessionAttributeListener 监听HttpSession中属性变化
-
ServletRequestAttributeListener 监听ServletRequest中属性变化
-
attributeAdded 监听属性添加 —- 当数据范围对象没有该属性,第一次添加时调用执行
-
attributeRemoved 监听属性移除 —- 从一个数据范围对象删除一个已经存在属性执行
-
attributeReplaced 监听属性替换 —– 当一个数据范围已经存在一个属性,向数据范围添加相同名称属性触发替换方法
3、绑定到 HttpSession 域中的某个对象的状态的事件监听器(对象感知监听器) -
即将要被绑定到session中的对象有几种状态
-
HttpSessionBindingListener接口
- 绑定状态:一个对象被放到session域中
valueBound()方法//绑定 - 解绑状态:就是这个对象从session域中移除了
valueUnbound()方法//解除绑定
- 绑定状态:一个对象被放到session域中
-
HttpSessionActivationListener接口
- 钝化状态:是将session内存中的对象持久化(序列化)到磁盘
sessionWillPassivate()方法//被钝化了 - 活化状态:就是将磁盘上的对象再次恢复到session内存中
sessionDidActivate()方法//活化
- 钝化状态:是将session内存中的对象持久化(序列化)到磁盘
-
-
session钝化机制:
①把服务器不常使用的session对象暂时序列化到系统文件或者是数据库中,当使用时反 序列化到内存中,整个过程由服务器自动完成;
②session的钝化机制由SessionManager管理,创建一个普通的JavaBean绑定和接触需要实现HttpSessionBindingListener接口
- 注意:
①要实现钝化和活化必须实现Serializable接口
②不需要在web.xml中注册
Servlet监听器的生命周期
-
ServletContextListener监听器
- requestInitialized 在容器(tomcat)启动时被调用(在servlet被实例化前执行)
- requestDestroyed 在容器(tomcat)销毁时调用(在servlet被销毁后执行)
-
HttpSessionListener监听器
-
sessionCreated 在HttpSession创建后调用
-
sessionDestroyed 在HttpSession销毁前调用(执行session.invalidate();方法)
-
【注】
web.xml配置session超时参数,单位:分,session超时的时间并不是精确的
<session-config> <session-timeout>10</session-timeout> </session-config>
-
-
ServletRequestListener监听器
- requestDestroyed 在request对象创建后调用(本次发起请求)
- requestInitialized 在request对象销毁前调用(本次请求结束)