Java Web基础知识之Listener:监控Servlet的每个动作

本文介绍了Java Web中的监听器,包括ServletContext、HttpSession和ServletRequest监听器。ServletContext监听器关注初始化和销毁事件,HttpSession监听器涉及创建、销毁以及在分布式环境下的迁移。此外,HttpSessionBindingListener和HttpSessionAttributeListener分别用于特定属性的监听和全局属性监听。ServletRequest监听器则监控请求的创建和销毁。文章还提到了监听器的配置方式和在不同场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响应,从本质上来说这些都是观察者模式的具体实现,在web程序中的监听器也不例外。

在Java Web程序中使用监听器可以通过以下两种方法:

  • 通过注解@WebListener来标识一个自定义的监听器;

@WebListener
public class CustomListener implements Listener {
	
}
  • 通过在web.xml中配置来使用监听器;
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

在Java Web程序中,主要是对ServletContext、HttpSession和ServletRequest三个对象提供支持。

一、 ServletContext监听器

有两类监听器用来监听ServletContext对象:
  1. ServletContextListener:该监听器用来监听ServletContext的初始化和销毁事件;
  2. ServletContextAttributeListener:该监听器用来监听ServletContext中属性的删除、添加和替换事件;
实例如下:
@WebListener
public class MyServletListener implements ServletContextListener, ServletContextAttributeListener {
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("ServletContextEvent source: " + sce.getSource());
		System.out.println("context created");
	}

	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("ServletContextEvent source: " + sce.getSource());
		System.out.println("context destroyed");
	}
	
	public void attributeAdded(ServletContextAttributeEvent event) {
		System.out.println("ServletContextAttributeEvent source: " + event.getSource());
		System.out.println("attribute added:  " + event.getName() + "--" + event.getValue());
	}

	public void attributeRemoved(ServletContextAttributeEvent event) {
		System.out.println("ServletContextAttributeEvent source: " + event.getSource());
		System.out.println("attribute removed:  "+ event.getName() + "--" + event.getValue());
	}

	public void attributeReplaced(ServletContextAttributeEvent event) {
		System.out.println("ServletContextAttributeEvent source: " + event.getSource());
		System.out.println("attribute replaced:  "+ event.getName() + "--" + event.getValue());
	}
}
该类实现了上述的两个接口,启动Servlet容器,分析结果,输出如下:

可以看到在启动的过程中首先创建了ServletContext,这激发了contextInitialized监听器方法,然后调用了每一个Servlet的init()方法对每一个Servlet进行初始化,对所有的Servlet(这里有两个自定义Servlet,MyServlet,TestServlet)初始化完成后则会向ServletContext添加一个属性,不管是事件对象还是添加的属性都是Servlet容器提供的。
当关闭Servlet容器的时候,分析结果,输出如下:

首先会调用所有Servlet的destroy方法,然后销毁ServletContext实例。
在对属性进行增加、替换、删除时,会调用相应的监听器,代码如下:
ServletContext context = req.getServletContext();
context.setAttribute("country", "zn");
con
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值