一、监听
1、事件监听机制
-
-
- 事件: 一件事情
- 事件源: 事件发生的地方
- 监听器: 一个对象
- 注册监听: 将事件、事件源、监听器绑定在一起。
-
2、监听器概念
当事件源上发生某个事件后,执行监听器代码。
监听器的作用是,监听某种事物的变化。 然后通过回调函数, 反馈给客户(程序) 去做一些相应的处理
二、Listener
1、概述
Listener 用于监听 JavaWeb 程序中的事件。(如:ServletContext、HttpSession、ServletRequest的创建、修改和删除)
Listener 它是 JavaEE 的规范,就是接口。
监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。
在 JavaWeb 中,可以为某些事件来设置监听器,当事件被触发时,监听器中的指定方法会被调用。
扩展:Servlet程序、Filter 过滤器 和 Listener 监听器 并称 WEB 的三大组件。
2、观察者模式
Listener 的原理是基于观察者模式的,所谓的观察者模式简单来说,就是当被观察者的特定事件被触发(一般在某些方法被调用后),会通知观察者(调用观察者的方法),观察者可以在自己的的方法中来对事件做一些处理。
在 JavaWeb 中,观察者就是 Listener,而被观察者可能有三个 ServletContext、HTTPSession、ServletRequest,而事件指的就是这些对象的创建、修改和删除等。
JavaWeb 中一共三类11个监听器。
二、ServletContextListener 监听器
1、概述
ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。
ServletContext 对象在 web 工程启动的时候创建, 在 web 工程停止的时候销毁。
监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。
1、常用方法:
public interface ServletContextListener extends EventListener {
/**
* 在 ServletContext 对象创建之后马上调用,做初始化
*/
public void contextInitialized(ServletContextEvent sce);
/**
* 在 ServletContext 对象销毁之前调用
*/
public void contextDestroyed(ServletContextEvent sce);
}
2、使用ServletContextListener 监听器监听 ServletContext 对象。
使用步骤:
(1)定义一个类,实现 ServletContextListener接口
(2)实现两个回调方法
(3)配置
① web.xml方式:配置类的全类名即可。
<!-- 配置监听器 -->
<listener>
<listener-class>cn.ks.web.listener.ContextLoaderListener</listener-class>
</listener>
② 注解方式:在类上添加 @WebListener 即可。
3、 监听器实现
(1)监听器实现类
1 public class MyServletContextListenerImpl implements ServletContextListener {
2
3 @Override
4 public void contextInitialized(ServletContextEvent sce) {
5 System.out.println("ServletContext对象被创建了");
6 }
7
8 @Override
9 public void contextDestroyed(ServletContextEvent sce) {
10 System.out.println("ServletContext对象被销毁了");
11 }
12 }
(2)web.xml 中的配置
1 <!--配置监听器-->
2 <listener>
3 <listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
4 </listener>
三、从指定文件找那个加载数据案例
创建一个类实现 ServletContextListener 接口
1 import javax.servlet.ServletContext;
2 import javax.servlet.ServletContextEvent;
3 import javax.servlet.ServletContextListener;
4 import javax.servlet.annotation.WebListener;
5 import java.io.FileInputStream;
6
7
8 @WebListener
9 public class ContextLoaderListener implements ServletContextListener {
10
11 /**
12 * 监听ServletContext对象创建的。ServletContext对象服务器启动后自动创建。
13 *
14 * 在服务器启动后自动调用
15 * @param servletContextEvent
16 */
17 @Override
18 public void contextInitialized(ServletContextEvent servletContextEvent) {
19 //加载资源文件
20 //1.获取ServletContext对象
21 ServletContext servletContext = servletContextEvent.getServletContext();
22
23 //2.加载资源文件:从下面的 web.xml中根据键获取对应的值(获取配置文件的位置)
24 String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
25
26 //3.获取真实路径
27 String realPath = servletContext.getRealPath(contextConfigLocation);
28
29 //4.加载进内存
30 try{
31 FileInputStream fis = new FileInputStream(realPath);
32 System.out.println(fis);
33 }catch (Exception e){
34 e.printStackTrace();
35 }
36 System.out.println("ServletContext对象被创建了。。。");
37 }
38
39 /**
40 * 在服务器关闭后,ServletContext对象被销毁。当服务器正常关闭后该方法被调用
41 * @param servletContextEvent
42 */
43 @Override
44 public void contextDestroyed(ServletContextEvent servletContextEvent) {
45 System.out.println("ServletContext对象被销毁了。。。");
46 }
47 }
在 web.xml 中指定初始化参数位置:
1 <!-- 指定初始化参数 -->
2 <context-param>
3 <param-name>contextConfigLocation</param-name>
4 <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
5 </context-param>