listener介绍
Posted 李典的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了listener介绍相关的知识,希望对你有一定的参考价值。
当Web 应用在Web 容器中运行时, Web 应用内部会不断地发生各种事件: 如Web 应用被启动、
Web 应用被停止,用户session 开始、用户session 结束、用户请求到达等, 通常来说,这些Web 事件
对开发者是透明的。
实际上, Servlet API 提供了大量监昕器来监昕 Web 应用的内部事件, 从而允许当 Web 内部事件发生时回调事件监昕器内的方法。
使用 Listener 只需要两个步骤。
1、定义 Listener 实现类。
2、通过注解或在 web.xml 文件中配置 Listerner。
1、实现Listener类
与 AWT 事件编程完全相似, 监听不同引向事件的监昕器也不相同。 常用的 Web 事件监昕器接门有如下几个。
》ServletContextListener:用于监昕 Web 应用的启动和关闭。
》ServletContextAttributeListener:用于监昕 ServletContext 范围( application )内属性的改变。
》ServletRequestListener:用于监昕用户请求。
》ServletRequestAttributeListener:用于监听 ServletRequest 范围 (request )内属性的改变。
》HttpSessionListener:用于监昕用户 session 的开始和结束。
》HttpSessionAttributeListener:用于监昕 HttpSession 范围 (session )内属性的改变。
下面先以 ServletContextListener 为例来介绍 Listener 的开发和使用, ServletContextListener 用于监听
Web 应用的启动和关闭。 该 Listener 类必须实现 ServletContextListener 接口, 该接口包含如下两个方法。
》contextlnitialized(ServletContextEvent see): 启动 Web 应用时, 系统调用 Listener 的该方法。
》contextDestroyed(ServletContextEvent see): 关闭 Web 应用时, 系统调用 Listener 的该方法。
通过上面的介绍不难看出, ServletContextListener 的作用有点类似于 load-on-startup Servlet,都可川于在 Web 应用启动时-, 回调方法来启动某些后台程序, 这些后台程序负责为系统运行提供支持。
package listener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class GetConnListener implements ServletContextListener{ @Override public void contextDestroyed(ServletContextEvent sce) { ServletContext application = sce.getServletContext(); Connection conn = (Connection) application.getAttribute("conn"); if(conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } @Override public void contextInitialized(ServletContextEvent sce) { try { ServletContext application = sce.getServletContext(); Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hello?serverTimezone=UTC&useSSL=false", "root", "lidian1234"); application.setAttribute("conn", conn); System.out.println("数据库连接成功"); } catch (Exception e) { e.printStackTrace(); } } }
上面的程序中粗体字代码重写了 ServletContextListener 的 contextlnitialized()、 contextDestroyed()方法, 这两个方法分别在应用启动、 关闭时被触发。 上面 ServletContextListener 的两个方法分别实现获取数据库连接、 关闭数据库连接的功能, 这些功能都是为整个 Web 应用提供服务的。
程序中, contextlnitialized()方法中粗体字代码用于获取配置参数, 细心的读者可能已经发现 ServletContextListener 获取的是 Web 应用的配置参数, 而不是像 Serviet 和 Filter 获取本身的配置参数。这是因为配置 Listener 时十分简单, 只要简单地指定 Listener 实现类即可, 不能配置初始化参数。
2、配置Listener
配置 Listener 只要向 Web 应用注册 Listener 实现类即可,无须配置参数之类的东西,因此十分简单。 为 Web 应用配置 Listener 也有两种方式。
》使用@WebListener 修饰 Listener 实现类即可。
》在 web.xml 文档中使用<listener.. ./>元素进行配置。
使用@WebListener 时通常无须指定任何属性, 只要使用该注解修饰 Listener 实现类即可向 Web应用注册该监听器。
在 web.xml 中使用<listener.. ./>元素进行配置时只要配置如下子元素即可。
》 listener-class:指定 Listener 实现类。
<!-- 指定listener的实现类 --> <listener> <listener-class>listener.GetConnListener</listener-class> </listener>
以上是关于listener介绍的主要内容,如果未能解决你的问题,请参考以下文章
JSF:-DataType 和 Action Listener 的问题
servlet,filter,listener,intercepter区别
Python干货socket中的listen()参数(数字)到底代表什么?