JSP的Listener介绍

当Web应用的web容器中运行时,web应用内部会不断地发生各种事件:如Web应用被启动、Web应用被停止,用户session开始、用户session结束、用户请求到达等,通常来说,这些web事件对开发者是透明的。今天笔者将向大家介绍几个常见的Listener类。

(1).        ServletContextListener:用于监听Web应用的启动和关闭

(2).        ServletContextAttrbuteListener:用于监听ServletContext范围(application)内属性的改变

(3).        ServletRequestListener:用于监听用户请求

(4).        ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变

(5).        HttpSessionListener:用于监听用户session的开始和结束

(6).        HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变

  同时,使用listener有两种方法,读者可以根据实际情况自己选择:

(1).        使用@Weblistener修饰listener实现类

(2).        在web.xml文档中使用<listener…>元素进行配置。如:

<listener>

  <listener-class>com.linjw.GetConnlistener</listener-class>

</listener>

 

1. ServletContextListener的使用

ServletContextListener主要是web应用的启动和关闭,所以当web启动时,调用的是contextInitialized()的方法,当web关闭时,则调用contextDestroyed()的方法。

@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();
			}
		}
	}
}

2.  ServletContextAttributeListener的使用

ServletContextAttributeListener用于监听ServletContext(application)范围属性的变化,实现该方法接口的监听器需要以下的三个方法:

(1).        attributeAdded(ServletContextAttributeEventevent):当程序把一个属性放入application范围时触发该方法

(2).        attributeRemoved(ServletContextAttributeEventevent):当程序把一个属性从application范围删除时触发该方法。

(3).        attributeReplaced(ServletContextAttributeEventevent):当程序替换application范围内的属性时将触发该方法。

 @WebListener
public class MyServletContextAttributeListener
	implements ServletContextAttributeListener
{
	// 当程序向application范围添加属性时触发该方法
	public void attributeAdded(ServletContextAttributeEvent event)
	{
		ServletContext application = event.getServletContext();
		// 获取添加的属性名和属性值
		String name = event.getName();
		Object value = event.getValue();
		System.out.println(application + "范围内添加了名为"
			+ name + ",值为" + value + "的属性!");
	}
	// 当程序从application范围删除属性时触发该方法
	public void attributeRemoved(ServletContextAttributeEvent event)
	{
		ServletContext application = event.getServletContext();
		// 获取被删除的属性名和属性值
		String name = event.getName();
		Object value = event.getValue();
		System.out.println(application + "范围内名为"
			+ name + ",值为" + value + "的属性被删除了!");
	}
	// 当application范围的属性被替换时触发该方法
	public void attributeReplaced(ServletContextAttributeEvent event)
	{
		ServletContext application = event.getServletContext();
		// 获取被替换的属性名和属性值
		String name = event.getName();
		Object value = event.getValue();
		System.out.println(application + "范围内名为"
			+ name + ",值为" + value + "的属性被替换了!");
	}
}

3. 关于ServletRequestListener和ServletRequestAttributeListener的使用

ServletRequestListener用于监听用户请求的到达,实现该接口的监听需要实现如下两个方法:

(1).        requestInitialized(ServletRequestEventsre):用户请求到达、被初始化时触发该方法

(2).        requestDestroyed(ServletRequestEventsre):用户请求结束、被销毁时触发该方法

ServletRequestAttributeListener则用于监听ServletRequest(request)范围内属性的变化,实现该接口要实现attribute         Added()、attributeRemoved()、attributeReplaced()三个方法。

@WebListener
public class RequestListener
	implements ServletRequestListener , ServletRequestAttributeListener
{
	// 当用户请求到达、被初始化时触发该方法
	public void requestInitialized(ServletRequestEvent sre)
	{
		HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
		System.out.println("----发向" + request.getRequestURI()
			+ "请求被初始化----");	}
	// 当用户请求结束、被销毁时触发该方法
	public void requestDestroyed(ServletRequestEvent sre)
	{
		HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
		System.out.println("----发向" + request.getRequestURI()
			+ "请求被销毁----");
	}
	// 当程序向request范围添加属性时触发该方法
	public void attributeAdded(ServletRequestAttributeEvent event)
	{
		ServletRequest request = event.getServletRequest();
		// 获取添加的属性名和属性值
		String name = event.getName();
		Object value = event.getValue();
		System.out.println(request + "范围内添加了名为"
			+ name + ",值为" + value + "的属性!");
	}
	// 当程序从request范围删除属性时触发该方法
	public void attributeRemoved(ServletRequestAttributeEvent event)
	{
		ServletRequest request = event.getServletRequest();
		// 获取被删除的属性名和属性值
		String name = event.getName();
		Object value = event.getValue();
		System.out.println(request + "范围内名为"
			+ name + ",值为" + value + "的属性被删除了!");
	}
	// 当request范围的属性被替换时触发该方法
	public void attributeReplaced(ServletRequestAttributeEvent event)
	{
		ServletRequest request = event.getServletRequest();
		// 获取被替换的属性名和属性值
		String name = event.getName();
		Object value = event.getValue();
		System.out.println(request + "范围内名为"
			+ name + ",值为" + value + "的属性被替换了!");
	}
}

4. 关于HttpSessionListener和HttpSessionAttributeListener的使用

HttpSessionListener用于用户监听session的创建和销毁,实现该接口的监听器需要实现如下方法:

(1).        sessionCreate(HttpSessionEventse):用户与服务器的会话开始、创建时触发该方法

(2).        sessionDestroyed(HttpSessionEventse):用与服务器的会话断开、销毁时触发该方法

HttpSessionAttributeListener则用于监听HttpSession(session)范围内属性的变化,实现监听器需要实现方法有:attributeAdded()、attributeRemoved()、attributeReplaced()三个方法。

@WebListener
public class OnlineListener
	implements HttpSessionListener
{
	// 当用户与服务器之间开始session时触发该方法
	public void sessionCreated(HttpSessionEvent se)
	{
		HttpSession session = se.getSession();
		ServletContext application = session.getServletContext();
		// 获取session ID
		String sessionId = session.getId();
		// 如果是一次新的会话
		if (session.isNew())
		{
			String user = (String)session.getAttribute("user");
			// 未登录用户当游客处理
			user = (user == null) ? "游客" : user;
			Map<String , String> online = (Map<String , String>)
				application.getAttribute("online");
			if (online == null)
			{
				online = new Hashtable<String , String>();
			}
			// 将用户在线信息放入Map中
			online.put(sessionId , user);
			application.setAttribute("online" , online);
		}
	}
	// 当用户与服务器之间session断开时触发该方法
	public void sessionDestroyed(HttpSessionEvent se)
	{
		HttpSession session = se.getSession();
		ServletContext application = session.getServletContext();
		String sessionId = session.getId();
		Map<String , String> online = (Map<String , String>)
			application.getAttribute("online");
		if (online != null)
		{
			// 删除该用户的在线信息
			online.remove(sessionId);
		}
		application.setAttribute("online" , online);
	}
}

5. 总结

    以上介绍的只是我们常见的监听类,其实在框架Strtuts2中有着比JSP更强大的监听器。但是我们对于JSP的监听的了解有助于我们学习struts2,同时也可对JSP的核心用法有更深入得知。





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值