概念
- 事件监听机制:
1.事件:一件事情(如点击按钮)
2.事件源:事件发生的地方(如被点击的按钮)
3.监听器:一个对象
4.注册监听:将事件、事件源、监听器绑定在一起,当事件源上发生某个事件后,执行监听器代码
JavaWeb的监听器对象有很多,我们只讲其中的ServletContextListener - ServletContextListener:
void contextInitialized(ServletContextEvent sce)
:ServletContext对象创建之后会调用该方法
void contextDestroyed(ServletContextEvent sce)
:ServletContext对象被销毁之前会调用该方法
步骤
- 定义一个类,实现ServletContextListener接口
- 复写方法
- 配置
web.xml
<listener>
<listener-class>com.zzq.listener.ContextLoaderListrner</listener-class>
</listener>
指定初始化参数<context-param>
注解:
@WebListener
代码实现(一)
配置xml测试
ContextLoaderListrner.java:
public class ContextLoaderListrner implements ServletContextListener {
/**
* 监听ServletContext对象的创建。ServletContext对象会在服务器启动后自动被创建
* 在服务器启动后自动调用
*
* @param servletContextEvent
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象创建了。。。");
}
/**
* 监听ServletContext对象的销毁。ServletContext对象会在服务器正常关闭后自动被销毁
* 在服务器正常关闭后自动调用
*
* @param servletContextEvent
*/
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象销毁了");
}
}
服务器启动:
服务器正常关闭:
代码实现(二)
假设有一个xml文件,想要被加载进内存,如图:
web.xml:
<!-- 指定初始化参数-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
ContextLoaderListrner.java:
/**
* 监听ServletContext对象的创建。ServletContext对象会在服务器启动后自动被创建
* 在服务器启动后自动调用
*
* @param servletContextEvent
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//加载资源文件
//1.获取ServletContext对象
ServletContext servletContext = servletContextEvent.getServletContext();
//2.加载资源文件
String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
//3.获取真实路径
String realPath = servletContext.getRealPath(contextConfigLocation);
//4.加载进内存
try {
FileInputStream fis = new FileInputStream(realPath);
System.out.println(fis);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("ServletContext对象创建了。。。");
}
服务器启动后:
这种使用Linstener的contextInitialized()方法加载资源文件通常被应用在该资源文件被全局使用,被多个Servlet所使用。当该资源文件需要修改时,只需要修改web.xml这一个文件,比较方便。
代码实现(三)
先把web.xml里面相关内容注释掉
然后直接加上注解
效果是一样的