servlet中的监听器接口

简介: servlet中的监听器接口

一.介绍

 (1)监听器接口是一组来自于Servlet规范下接口,共有8个接口。在Tomcat存在servlet-api.jar包


(2)监听器接口需要由开发人员亲自实现,Http服务器提供jar包,但是并没有对应的实现类


 (3)监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】


二.什么是作用域对象?

 1)在Servlet规范中,认为在服务端内存中可以在某些条件下为两个Servlet之间提供数据共享方案的对象,被称为【作用域,对象】


 2)Servlet规范下作用域对象:一共有三个。注意是没有cookie的,因为cookie出身不好,是因为其存储在客户端的浏览器缓存中,并不在服务端。

ServletContext:     全局作用域对象
HttpSession   :         会话作用域对象
HttpServletRequest:请求作用域对象

三.监听器接口实现类开发规范

这里面一共分为了三步:

1)根据监听的实际情况,选择对应监听器接口进行实现,
      例如看到底是想监听全局作用域对象的生命周期变化时刻,还是会话作用域对象的共享数据变化时刻,然后再从八个接口中选出来对应的接口来实现。
 2)重写监听器接口中所声明的【监听事件处理方法】,这些方法会在指定事件发生的时候自动调用,你只需要告诉这些方法在调用的时候要干嘛,不需要去考虑太是什么时候调用的。
3)在web.xml文件将监听器接口实现类注册到Http服务器



四.代码示例

此处的代码示例我们就拿ServletContext接口来举例,分别介绍关于这个接口的两个监听器方法:一个是ServletContextListener接口,一个是ServletContextAttributeListener接口


1.ServletContextListener接口(8个接口之一)

(1)作用

通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻


(2)监听事件处理方法

也就是ServletContextListener接口中所定义的两个方法:

public void contextInitlized()  在全局作用域对象被Http服务器初始化被调用
                    public void contextDestory():      在全局作用域对象被Http服务器销毁时候触发调用


(3)代码示例

第一步:确定了我们是想监听ServletContext接口所修饰的对象,也就是我们全局作用域对象何时被创建,何时被销毁,所以此时应该实现我们的ServeltContextListener接口。


第二步:我们此时定义一个监听类名为OneListener去实现我们的ServeltContextListener接口,重写接口中的两个方法:代码如下所示:

public class OneListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("全局作用域对象被创建了");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("全局作用域对象被销毁了");
    }
}

可以看到我们在重写的方法中加入输出语句,方便待会我们观察全局作用域对象的创建销毁时间。


第三步:将我们的监听器接口实现类注册到我们的http服务器当中去:此时需要去web.xml文件中配置如下语句:

<listener>
    <listener-class>com.bjpowernode.listener.OneListener</listener-class>
</listener>
注意class里面放入的是我们监听器接口实现类的地址的全限定名称 。


从之前的概念中我们得知我们全局作用域对象的声明周期为:


(1)在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象

(2)在Http服务器运行期间时,一个网站只有一个全局作用域对象


(3)在Http服务器运行期间,全局作用域对象一直处于存活状态


(4)在Http服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理


所以当我们启动tomcat的时候,我们的OneListener类中的contextInitialized方法此时便开始执行了,那么此时应该输出"全局作用域对象被创建了"这句话,如图所示:


2.png


当我们关闭tomcat的时候,我们的OneListener类中的contextDestroyed方法此时便开始执行了,那么此时应该输出"全局作用域对象被销毁了"这句话,如图所示:


2.png


2.ServletContextAttributeListener接口

1.作用

通过这个接口合法的检测全局作用域对象共享数据变化时刻


2.监听事件处理方法

也就是ServletContextListener接口中所定义的三个方法:

public void contextAdd():         在全局作用域对象添加共享数据时调用此方法
                 public void contextReplaced():在全局作用域对象更新共享数据调用此方法
                 public void contextRemove():  在全局作用域对象删除共享数据时调用此方法


3.全局作用域对象添加,更新,删除共享数据的方法

 

ServletContext application =  request.getServletContext();
                 application.setAttribute("key1",100); //新增共享数据
                 application.setAttribute("key1",200); //更新共享数据
                 application.removeAttribute("key1");  //删除共享数据

4.代码示例

第一步:确定了我们是想监听ServletContext接口所修饰的对象,也就是我们全局作用域对象的数据何时添加,何时被更新,何时被删除,所以此时应该实现我们的ServletContextAttributeListener接口


第二步:我们此时定义一个监听类名为OneListener去实现我们的ServletContextAttributeListener接口,重写接口中的三个方法:代码如下所示:


public class OneListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("新增共享数据");
    }
    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("删除共享数据");
    }
    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        System.out.println("更新共享数据");
    }
}


此时我们在重写的方法中分别放入我们的业务逻辑,此处为了方便记录我们的全局作用域对象中的数据的变化情况,我们就分别写入不同的输出语句,在控制台观察数据变化时语句的输出顺序,从而通过语句的输出顺序便可以判断出全局作用域对象中数据都发生了什么变化。


下面我们继续去编写我们的controller包下的OneServlet类,这个类的作用就是为了执行我们全局作用域对象数据的添加,更新,删除操作。

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext application = request.getServletContext();
        application.setAttribute("key1",100); //新增共享数据
        application.setAttribute("key1",200); //更新共享数据
        application.removeAttribute("key1");  //删除共享数据
    }
}

执行完操作后,此时我们执行我们的项目,按照上述截图对于数据操作的编写情况,我们最终监听完成后的输出语句的顺序应该为


第一次执行setAttribute方法-------------------------》监听器此时监听到了全局作用域对象中数据的添加操作,然后会调用我们的attributeAdded方法,所以首先输出的语句为“新增共享数据”
第二次执行setAttribute方法-------------------------》监听器此时监听到了全局作用域对象中数据的更新操作,然后会调用我们的attributeReplaced方法,所以其次输出的语句为“更新共享数据”
最后执行removeAttribute方法----------------------》监听器此时监听到了全局作用域对象中数据的删除操作,然后会调用我们的attributeRemoved方法,所以最终输出的语句为“删除共享数据”


所以最终的输出结果如下所示:

2.png

相关文章
|
3月前
|
监控 前端开发 Java
揭秘Web开发神器:Servlet、过滤器、拦截器、监听器如何联手打造无敌博客系统,让你的用户欲罢不能!
【8月更文挑战第24天】在Java Web开发中,Servlet、过滤器(Filter)、拦截器(Interceptor,特指Spring MVC中的)及监听器(Listener)协同工作,实现复杂应用逻辑。以博客系统为例,Servlet处理文章详情请求,过滤器(如LoginFilter)检查登录状态并重定向,Spring MVC拦截器(如LoggingInterceptor)提供细粒度控制(如日志记录),监听器(如SessionListener)监控会话生命周期事件。这些组件共同构建出高效、有序的Web应用程序。
39 0
|
6月前
|
前端开发 Java 程序员
Servlet/过滤器/拦截器/监听器:
Servlet接口在Sun公司有两个默认的实现类:HttpServlet、GenericServlet。Servlet是一种运行服务器端的Java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。
|
存储 Java 数据安全/隐私保护
servlet过滤器与监听器
前言 Servlet 过滤器和监听器是 Java Web 应用程序中常见的两种组件,它们提供了各种扩展 Web 应用程序功能的方式。 总的来说,过滤器和监听器都可以通过 Java Web 应用程序的配置文件或注解进行使用,方便灵活,并可以很好地实现框架与业务逻辑的分离,提高代码可维护性和扩展性。 过滤器(Filter) 1. 参数验证和转换:可以拦截用户提交的数据,并对数据格式进行验证、修正或转换。 2. 访问控制和认证:可以拦截请求并检查用户是否有访问特定资源的权限。 3. 日志记录:可以拦截请求并输出相应的日志信息,用于系统运行时的监测与故障排除。 4. 资源压缩和解密: 可以拦截响应并对
82 0
|
存储 Java
【Java Web编程 十一】深入理解Servlet监听器
【Java Web编程 十一】深入理解Servlet监听器
119 0
【Java Web编程 十一】深入理解Servlet监听器
|
Java 应用服务中间件
如何在个人web项目中使用Servlet监听器?
如何在个人web项目中使用Servlet监听器?
|
Java 应用服务中间件 Apache
Servlet概述及接口
Servlet概述及接口
110 0
|
XML 设计模式 前端开发
Servlet、过滤器、监听器、拦截器
Servlet是javaEE规范中的一种,javaEE中的规范很多除了Servlet还有很多我们熟悉的JSP、JDBC、RMI、XML、EJB、JTS等等。
168 0
Servlet、过滤器、监听器、拦截器
|
前端开发 Java 应用服务中间件
servlet中的Filter接口(过滤器接口)
servlet中的Filter接口(过滤器接口)
201 0
servlet中的Filter接口(过滤器接口)
|
JavaScript
Servlet学习——监听器
Servlet学习——监听器
161 0
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
33 3