2.10 Listener介绍
当Web
应用在web
容器中运行时,Web
应用内部会不断地发生各种事件:
如web
应用被启动web
应用被停止,用户session
开始、用户session
结束、用户请求到达等,通常来说,这些web
事件对开发者是透明的。
实际上,Servlet API
提供了大量监听器来监听Web
应用的内部事件,从而允许当Web
内部事件发生时回调事件监听器内的方法.
使用Listener步骤
使用Listener
只需要两个步骤。
- 定义
Listener
实现类。
- 通过注解或在
web.xml
文件中配置Listerner
2.10.1 实现Listener类
与AWT
事件编程完全相似,监听不同web
事件的监听器也不相同。常用的web
事件监听器接口有如下几个。
监听器 |
描述 |
ServletContextListener |
用于监听Web 应用的启动和关闭 |
ServletContextAttributeListener |
用于监听Servletcontext 范围(application )内属性的改变。 |
ServletRequestListener |
用于监听用户请求 |
ServletRequestAttributeListener |
用于监听Servletrequest 范围(request )内属性的改变。 |
HttpSessionListener |
用于监听用户session 的开始和结束 |
HttpSessionAttributeListener |
用于监听Httpsession 范围(session )内属性的改变。 |
下面先以ServletContextListener
为例来介绍Listener
的开发和使用,ServletContextListener
用于监听Web
应用的启动和关闭。
ServletContextListener接口方法
该Listener
类必须实现ServletContextListener
接口,该接口包含如下两个方法.
contextInitialized( ServletContextEvent sce)
:启动Web
应用时,系统调用Listener
的该方法。
contextDestroyed(ServletContextEvent sce)
:关闭Web
应用时,系统调用Listener
的该方法。
通过上面的介绍不难看出,ServletContextListener
的作用有点类似于load-on-startup Servlet
,都可用于在Web
应用启动时,回调方法来启动某些后台程序,这些后台程序负责为系统运行提供支持。
GetConnListener.java
下面将创建一个获取数据库连接的Listener
,该Listener
会在应用启动时获取数据库连接,并将获取到的连接设置成application
范围内的属性。
下面是该Listener
的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| package lee;
import java.sql.*; import javax.servlet.*; import javax.servlet.annotation.*;
@WebListener public class GetConnListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { try { 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.setAttribute("conn", conn); } catch (Exception ex) { System.out.println("Listener中获取数据库连接出现异常" + ex.getMessage()); } }
public void contextDestroyed(ServletContextEvent sce) { ServletContext application = sce.getServletContext(); Connection conn = (Connection) application.getAttribute("conn"); if (conn != null) { try { conn.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } }
|
上面的程序中重写了ServletContextListener
的contextInitialized
、contextDestroyed
方法,这两个方法分别在应用启动、关闭时被触发。
上面ServletContextListener
的两个方法分别实现获取数据库连接、关闭数据库连接的功能,这些功能都是为整个Web
应用提供服务的。
程序中,contextInitialized()
方法中代码:
1 2 3 4 5 6 7 8 9
| ServletContext application = sce.getServletContext();
String driver = application.getInitParameter("driver");
String url = application.getInitParameter("url");
String user = application.getInitParameter("user");
String pass = application.getInitParameter("pass");
|
用于获取配置参数,细心的读者可能已经发现ServletContextListener
获取的是web
应用的配置参数,而不是像Servlet
和Filter
获取本身的配置参数。这是因为配置Listener
时十分简单,只要简单地指定Listener
实现类即可,不能配置初始化参数:
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <?xml version="1.0" encoding="GBK"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <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/javaee</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>32147</param-value> </context-param>
<listener> <listener-class>lee.GetConnListener</listener-class> </listener>
</web-app>
|