Java Servlet 详解:(十九)Listener 监听器-10700字匠心出品


监听器用于监听 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 的配置。
第一个案例就是注解开发。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地球村公民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值