0 Listener简介
当web应用在web容器中运行时,web应用内部会不断地发生各种事件:如web应用被启动,web应用被停止,用户session开始、用户session结束、用户请求到达等,通常来说,这些web事件对开发者是透明的。
实际上, Servlet API提供了大量监听器来监听Web应用的内部事件,从而允许当Web内部事件发时回调事件监听器内的方法
使用 Listener只需要两个步骤
-
定义 Listener实现类
-
通过 Annotation或在 web. xml文件中配置 Listener
1 实现 Listener类
常用的Web事件监听器接口有如下几个
1.1 监听器分类
根据监听作用域的不同分为3种监听器
//3个listener类
// 1 web监听器
ServletContextlistener:监听Web应用的启动和关闭
ServletContextAttributelistener:监听 Servletcontext范围( application)内属性的改变
// 2 请求监听器
ServletRequestListener:监听用户请求。
ServletRequestAttributeListener:监听 ServletRequest范围( request)内属性的改变
// 3 会话监听器
HttpSessionListener:监听用户 session的开始和结束
HttpSessionAttributeListener:监听 Httpsession范围( session)内属性的改变
1.2 监听器使用
监听器通常有initialized(对应事件参数)
和destoryed(对应事件参数)
方法,在对应的事件发生的时候会调用者两个方法,比如web应用启动的时候就会调用前者再启动,要销毁web应用的时候就调用后者再销毁
对应的三组方法为:
// 1 web监听器
contextInitialized( ServletContextEvent sce);//启动Web应用时,系统调用 Listener的该方法
contextDestroyed( ServletcontextEvent sce);//关闭Web应用时,系统调用 Listener的该方法
// 2 请求监听器
requestinitialized(ServletRequest Event sre)//用户请求到底,被初始化时触发该方法
requestDestroyed( ServletRequestEvent sre)//用户请求结束、被销毁时触发该方法,
// 3 会话监听器
sessionCreated( (htTp session Event se)//用户与服务器的会话开始、创建时时触发该方法
sessionDestroyed( Http sessioneVent se)//用户与服务器的会话断开、销毁时触发该方法
attributeAdded( ServletContextAttribute Event event)//当程序把一个属性存入 application范围时触发该方法
attributeRemoved( ServletcontextAttribute Event event)//当程序把一个属性从 application范围删除时触发该方法
attributeReplaced( ServletContextAttribute Event even)//当程序替换 application范围内的属性时将触发该方法
通过上面的介绍不难看出,ServletcontextListener的作用有点类似于load-on-startup Servlet,都可以用于在Web应用启动时,回调方法来启动某些后台程序,这些后台程序负责为系统运行提供支持。
下面将创建一个获取数据库连接的 Listener,该 Listener会在应用启动时获取数据库连接,并将获取到的连接设置成 application范围内的属性。下面是该 Listener的代码
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实例
ServletContext application = sce.getServletContext();
//从配置参数中获取驱动
String driver = application.getInitParameter("driver");
//从配置参数中获取数据库url
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 ex){
System.out.println("Listener中获取数据库连接出现异常"
+ ex.getMessage());
}
}
//应该关闭时,该方法被调用。
public void contextDestroyed(ServletContextEvent sce){
//取得该应用的ServletContext实例
ServletContext application = sce.getServletContext();
Connection conn = (Connection)application.getAttribute("conn");
//关闭数据库连接
if (conn != null){
try{
conn.close();
}
catch (SQLException ex){
ex.printStackTrace();
}
}
}
}
上面代码重写看ServletContextListener的两个方法,分别在应用启动、关闭时被触发。上面 ServletContextListener的两个方法分别实现获取数据库连接、关闭数据库连接的功能,这些功能都是为整个Web应用提供服务的。
2 注册 Listener
为Web应用注册 Listener同样也有两种方式
-
使用
@WebListener
修饰 Listener实现类 -
在 web.xml文档中使用
<listener>
元素进行配置。<listeners> !-指定 Listener的实现类-> <listener-class>lee.GetConnListener</listener-class> </listeners>