一.什么是监听器
监听器可以接收事件,并完成相关的处理.
二.监听器分类
三.如何使用监听器
3.1>定义一个类来实现Listener不同的接口;监听不同Web事件的监听器不相同,
常用的Web事件监听器接口有如下几个:
- ServletContextListener:用于监听Web应用的启动和关闭。
- ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变。
- ServletRequestListener:用于监听用户请求。
- ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变。
- HttpSessionListener:用于监听用户session的开始和结束。
- HttpSessionAttributeListener:用于监听HttpSesssion范围(session)内属性的改变。
案例1: 创建一个Listener,用于在启动时获取数据库连接,设置到application中,关闭应用时,关闭连接。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 应用上下文所有的 :连接数据库
*
* @author Administrator
*
* ServletContextListener:用于监听Web应用的启动和关闭
*
*/
public class ConnectionListen implements ServletContextListener {
// 开始
@Override
public void contextInitialized(ServletContextEvent sce) {
try {
System.out.println("contextInitialized==>数据库连接");
// 取得应用的ServletContext实例
ServletContext application = sce.getServletContext();
// 从配置参数中获取数据库信息
String driver = application.getInitParameter("driver");
String url = application.getInitParameter("url");
String user = application.getInitParameter("user");
String pass = application.getInitParameter("pass");
// 注册驱动
Class.forName(driver);
// 获取数据库连接
Connection conn = DriverManager.getConnection(url, user, pass);
// 将数据库连接设置成application范围内的属性
application.setAttribute("conn", conn);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
// 结束
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed==>关闭数据库连接");
// 取得该应用的ServletContext实例
ServletContext application = sce.getServletContext();
Connection conn = (Connection) application.getAttribute("conn");
// 关闭数据库连接
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3.2>配置文件web.xml
<!-- 全局参数 -->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/food</param-value>
</context-param>
<context-param>
<param-name>user</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>pass</param-name>
<param-value>***</param-value>
</context-param>
<!-- 监听器 -->
<listener>
<listener-class>com.hlx.lis.ConnectionListen</listener-class>
</listener>
3.3>启动Tomcate
2>使用ServletContextAttributeListener
ServletContextAttributeListener用于监听ServletContext(application)范围内属性的变化,实现该接口的监听器需要实现三个方法:
- attributeAdded(ServletCOntextAttributeEvent event);当程序把一个属性存入application范围时出发该方法。
- attributeRemoved(ServletContextAttributeEvent event);当程序把一个属性从application范围删除时出发该方法。
- attributeReplaced(ServletContextAttributeEvent event);当程序替换application范围内的属性时将出发该方法。
3>使用ServletRequestListener和ServletRequestAttributeListener
ServletRequestListener用于监听用户请求的到达,实现该接口的监听器需要实现如下两个方法:
- requestInitialized(ServletRequestEvent sre);用户请求到底、被初始化是出发该方法。
- requestDestroyed(ServletRequestEvent sre); 用户请求结束、被销毁时触发该方法。
ServletRequestAttributeListener则用于监听ServletRequest(request)范围内属性的变化,
实现该接口的监听器需要实现attributeAdded、attributeRemoved、attributeReplaced三个方法。
应用程序完全可以采用一个监听器来监听多个事件,只要让该监听器实现类同时实现多个监听器接口即可,不如同时实现 ServletRequestListener、ServletRequesetAttributeListener。
使用HttpSessionListener和HttpSessionAttributeListener与使用ServletRequestListener和ServletRequestAttributeListener非常相似。
4>HttpSessionListener用于监听用户session的创建和销毁,实现该接口的监听器需要实现:
- sessionCreate(HttpSessionEvent se);用户与服务器的会话开始、创建时触发该方法。
- sessionDestroyed(HttpSessionEvent se);用户与服务器的会话断开、销毁时触发该方法。