7 Listener(从Servlet学到JSP)

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>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值