Listener(监听器)

简介: Listener(监听器)

Listener和ServletContext


补充:
  1.ServletContext 表示上下文对象,属于接口,代表整个web项目,可以使用方法获取当前web项目的所有文件的MIME类型
  2.之前学习能够共享数据的对象:
    1)request: 只能在一次请求一次响应中进行数据的共享 ===》请求转发
    2)session:只能在一次会话过程中,可以有多次请求和响应,
    3)ServletContext:只要项目存在就可以共享数据,多次会话,多次请求和响应都可以共享数据:操作整个项目的配置文件
    范围大小: ServletContext > session > request


1.0 ServletContext对象介绍


ServletContext对象:当tomcat服务器启动的时候,会为每个web项目创建一个唯一的ServletContext对象,该对象代表当前整个Web应用项目。该对象不仅封装了当前web应用的所有信息,而且实现了多个servlet的数据共享.在ServletContext中可以存放共享数据,ServletContext对象是真正的一个全局对象,凡是web容器中的Servlet都可以访问。


在每个项目中可以有多个Servlet程序,每个Servlet程序都是独立的。当前这个项目的配置信息,就必须使用描述这个项目的ServletContext对象获取。

方法名 描述
setAttribute(String name,Object object) 向ServletContext中存数据
getAttribute(String name) 从ServletContext中取数据
removeAttribute(name) 从ServletContext中移除数据
String getRealPath(String path) 返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)
getMimeType(fileName) 获取服务器中文件类型.txt text/plain .html text/html

ServletContext对象,tomcat为每一个web项目单独创建的一个上下文(知上知下贯穿全文)对象。有如下功能:

1.可以在多个servlet之间共享数据

存放:setAttribute()

获得:getAttribute()

删除:removeAttribute()

2.可以获得当前WEB项目中的指定资源(文件)

String path = getRealPath( String string);

需求1:如何获取上下文servletContext对象。

使用HttpServlet类的父类 GenericServlet 中的方法:getServletContext();

代码如下:

/*
    获取上下文ServletContext对象:
    使用HttpServlet类的父类 GenericServlet 中的方法:getServletContext();
 */
@WebServlet("/servletContextDemoServlet")
public class ServletContextDemoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ServletContext类的对象
        ServletContext servletContext = getServletContext();
    }
}

需求2:如何获取服务器中每个文件的路径。例如,在当前项目下的web文件夹下放一个1.jpg的图片,获取其真实路径(绝对路径)。

@WebServlet("/servletContextDemoServlet")
public class ServletContextDemoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        //如何获取服务器中每个文件的路径。
        // 例如,在当前项目下的web文件夹下放一个1.jpg的图片,获取其真实路径(绝对路径)。
        String realPath = servletContext.getRealPath("/1.jpg");
        /*
            输出结果:
            realPath =      F:\ideawork\jiuyeban2\heima60\heima03\out\artifacts\web_war_exploded\1.jpg
            说明:我们的项目在发布的时候会被打成一个war包,这个war包下的class文件会被放在tomcat下被运行。
            所以这里获取的真实路径是这个war包下的1.jpg所在的路径。
         */
        System.out.println("realPath = " + realPath);
    }
}

说明:

获取结果:

realPath =  ''
说明:我们的项目在发布的时候会被打成一个war包,这个war包下的class文件会被放在tomcat下被运行。
     所以这里获取的真实路径是这个war包下的1.jpg所在的路径。

需求3:获取当前项目下的1.jpg在服务器中的文件类型。

/*
    需求3:获取当前项目下的1.jpg在服务器中的文件类型。
    getMimeType("1.jpg");这里书写获取文件类型的文件名和后缀名即可
 */
  String mimeType = servletContext.getMimeType("1.jpg");
  System.out.println("mimeType = " + mimeType);//mimeType = image/jpeg

注意:对于方法 getMimeType(“1.jpg”);这里书写获取文件类型的文件名和后缀名即可


总结:


1.ServletContext表示上下文对象,代表整个web项目,tomcat一启动就会创建该接口对象,关闭tomcat就会消失


2.ServletContext属于对象,多次会话,多次请求限制,三个域对象范围:ServletContext > HttpSession > HttpServletRequest


3.ServletContext其他作用:


1)获取文件真实路径: String getRealPath(String path) 参数path如果书写的是相对路径相对的是webapp

2)获取文件的MIME类型: String getMimeType(String file) 参数file只书写文件名+后缀名即可,不会判断是否存在


1.1 Listener概述


说明:


javaweb中的监听器是监听 ServletContext HttpSession HttpServletRequest 三个对象创建和销毁的,同时监听是哪个对象中数据的变化,就是监听属性的变化:setAttribute removeAttribute


1.ServletContext 是在tomcat启动创建,关闭tomcat销毁

2.HttpSession 是在浏览器第一次访问执行request.getSession()创建,销毁时间:1)30min 2)执行invalidate()

3.HttpServletRequest 是浏览器第一次访问创建,浏览器接收到服务器的响应就销毁

# 监听
1. 设置监听器的人
2. 监听器 
2. 监听器目标: 被监听的对象 
3. 监听器工作: 被监听的对象执行某种行为,监听器就开始工作

# web里面
1. 雇佣人 : web程序开发者
2. 监听器例子A
  1). 监听器A: ServletContextListener ****
  2). 目标 :  监听ServletContext对象
  3). 执行 : 监听ServletContext对象创建和销毁
3. 监听器例子B
  1). 监听器A: HttpSessionListener
  2). 目标 : HttpSession对象
  3). 执行 : 监听HttpSession对象创建和销毁
4. 监听器例子C
  1). 监听器A: HttpRequestListener
  2). 目标 : HttpRequest对象
  3). 执行 : 监听HttpRequest对象创建和销毁 
5.  监听器例子D
  1). 监听器A: ServletContextAttributeListener ****
  2). 目标 : ServletContext对象
  3). 执行 : 监听ServletContext对象增删改数据 (add,remove) 当我们向ServletContext对象中添加数据(setAttribute())和删除数据(removeAttribute())就会被ServletContextAttributeListener监听器监听
  
 HttpSessionAttributeListener HttpRequestAttributeListener

生活中的监听器


我们很多商场有摄像头,监视着客户的一举一动。如果客户有违法行为,商场可以采取相应的措施。


javaweb中的监听器


在我们的java程序中,有时也需要监视某些事情,一旦被监视的对象发生相应的变化,我们应该采取相应的操作。


监听web三大域对象:HttpServletRequest、HttpSession、ServletContext (创建和销毁)


场景


历史访问次数、统计在线人数、系统启动时初始化配置信息

监听器的接口分类

事件源 监听器接口 时机
ServletContext ServletContextListener 上下文域创建和销毁
ServletContext ServletContextAttributeListener 上下文域属性增删改的操作
HttpSession HttpSessionListener 会话域创建和销毁
HttpSession HttpSessionAttributeListener 会话域属性增删改的操作
HttpServletRequest ServletRequestListener 请求域创建和销毁
HttpServletRequest ServletRequestAttributeListener 请求域属性增删改的操作


1.2 Listener快速入门


监听器在web开发中使用的比较少,见的机会就更少了,今天我们使用ServletContextListenner来带领大家学习下监听器,因为这个监听器是监听器中使用率最高的一个,且监听器的使用方式都差不多。


我们使用这个监听器可以在项目启动和销毁的时候做一些事情,例如,在项目启动的时候加载配置文件。

步骤分析

1. 创建一个普通类,实现ServletContextListenner

2. 重写方法
  监听ServletContext创建
  监听ServletContext销毁
  
3. 配置
  web.xml
  注解 掌握
① xml版本
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/*
    设置监听器的人: 开发者
    监听器 : MyListener
    监听器目标 : ServletContext 对象
    监听器的工作:
        1). 当ServletContext 对象创建的时候就会执行contextInitialized方法
            ServletContext是tomcat启动时就会创建 (早于Filter和Servlet)
        2). 当ServletContext 对象销毁的时候就会执行contextDestroyed方法
             ServletContext是tomcat关闭时销毁 (晚于Filter和Servlet)

        这两个方法是事件驱动
 */
public class MyListener implements ServletContextListener {
    //tomcat一启动,此方法就会运行
        //运用场景: spring底层封装了一个ServletContextListener加载配置文件
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed");
    }
}

<listener>
    <listener-class>com.baidu.MyServletContextListener</listener-class>
</listener>
② 注解版本
@WebListener
public class MyListener implements ServletContextListener {
    //tomcat一启动,此方法就会运行
        //运用场景: spring底层封装了一个ServletContextListener加载配置文件
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed");
    }
}


1.3 案例:模拟spring框架


需求:可以在项目启动时读取配置文件。获取配置文件的名字。

步骤:

1.在web.xml进行配置文件的配置

2.创建自定义监听器类监听ServletContext的创建和销毁

3.在自定义监听器类中实现监听器的方法

4.实现的方法体中读取web.xml文件中关于当前项目配置文件的信息

5.输出结果

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

//2.创建自定义监听器类监听ServletContext的创建和销毁
//别忘记注册监听器
@WebListener
public class SpringContextListener implements ServletContextListener{
    //3.在自定义监听器类中实现监听器的抽象方法
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //4.实现的方法体中读取web.xml文件中关于当前项目配置文件的信息
        //4.1根据事件类对象servletContextEvent调用方法获取ServletContext上下文对象
        ServletContext servletContext = servletContextEvent.getServletContext();
        //4.2使用上下文对象调用方法获取web.xml配置文件中的数据
        /*
            <context-param>
                <param-name>jdbc</param-name>
                <param-value>jdbc.properties</param-value>
            </context-param>
         */
        String str = servletContext.getInitParameter("jdbc");
        System.out.println("str = " + str);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("释放资源....销毁。。。。");
    }
}

 <!--配置当前项目的配置文件信息-->
    <!--1.在web.xml进行配置文件的配置-->
    <context-param>
        <param-name>jdbc</param-name>
        <param-value>jdbc.properties</param-value>
    </context-param>
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

//2.创建自定义监听器类监听ServletContext的创建和销毁
//别忘记注册监听器
@WebListener
public class SpringContextListener implements ServletContextListener{
    //3.在自定义监听器类中实现监听器的抽象方法
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //4.实现的方法体中读取web.xml文件中关于当前项目配置文件的信息
        //4.1根据事件类对象servletContextEvent调用方法获取ServletContext上下文对象
        ServletContext servletContext = servletContextEvent.getServletContext();
        //4.2使用上下文对象调用方法获取web.xml配置文件中的数据
        /*
            <context-param>
                <param-name>jdbc</param-name>
                <param-value>jdbc.properties</param-value>
            </context-param>
         */
        String str = servletContext.getInitParameter("jdbc");
        System.out.println("str = " + str);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("释放资源....销毁。。。。");
    }
}

 <!--配置当前项目的配置文件信息-->
    <!--1.在web.xml进行配置文件的配置-->
    <context-param>
        <param-name>jdbc</param-name>
        <param-value>jdbc.properties</param-value>
    </context-param>
相关文章
|
7月前
|
XML Java 数据格式
Filter&Listener(过滤器和监听器)
Java中的过滤器(Filter)和监听器(Listener)是两种不同的概念。过滤器(Filter)是在Java Web应用程序中,用来拦截和修改进入或离开web应用程序的请求和响应的对象。监听器(Listener)是一种用于监听和响应特定事件的Java对象。
81 3
Filter&Listener(过滤器和监听器)
|
Java
25JavaWeb基础 - 监听器
25JavaWeb基础 - 监听器
65 1
|
5月前
|
存储 程序员
JavaWeb之Listener监听器
JavaWeb之Listener监听器
94 0
Listener 监听器
监听器是专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。Servlet监听器:Servlet规范中定义的一种特殊类,它用于监听Web应用程序中的ServletContext,HttpSession和HttpServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
|
7月前
javaWeb监听器Listener(一)
javaWeb监听器Listener(一)
|
7月前
javaWeb监听器Listener -自定义监听器类实现
javaWeb监听器Listener -自定义监听器类实现
|
缓存 应用服务中间件 数据库
【JavaWeb】 三大组件之监听器 Listener
在JavaWeb应用程序中,Listener(监听器)是一种机制,用于监听和响应特定的事件。它可以感知并响应与应用程序相关的事件,从而执行相应的逻辑处理。事件是在应用程序运行过程中发生的特定动作或状态改变。例如,Web应用程序的启动和关闭、请求的到达和完成、会话的创建和销毁等都被认为是事件。监听器会注册对这些事件的感兴趣,并在事件发生时调用相应的回调方法来执行预定的业务逻辑。
|
XML 数据库连接 数据格式
JavaWeb-监听器Listener
监听器Listener 1.功能 2.监听器分类 3.监听器的配置 4.ServletContext监听 5.HttpSession监听 6.ServletRequest监听
85 0
|
程序员
JavaWeb监听器Listener
JavaWeb监听器Listener
70 0
|
程序员
监听器
监听器
121 0