Servlet-listener监听器

本文详细介绍了JavaWeb中的监听器,包括ServletContextListener、HttpSessionListener和ServletRequestListener的使用方法及其实现机制。通过实例展示了如何监听ServletContext、HttpSession和ServletRequest对象的创建与销毁。

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

基本概念  

JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

Servlet监听器的分类

  在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象
  Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

1. 监听域对象自身的创建和销毁的事件监听器。
2. 监听域对象中的属性的增加和删除的事件监听器。
3. 监听绑定到HttpSession域中的某个对象的状态的事件监听器。
监听ServletContext域对象的创建和销毁

  ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。实现了ServletContextListener接口的类都可以对ServletContext对象的创建和销毁进行监听。
  当ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法。
  当ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。

  ServletContext域对象创建和销毁时机:
    创建:服务器启动针对每一个Web应用创建ServletContext
    销毁:服务器关闭前先关闭代表每一个web应用的ServletContext

范例:编写一个MyServletContextListener类,实现ServletContextListener接口,监听ServletContext对象的创建和销毁

  1、编写监听器,代码如下:

1 package me.gacl.web.listener;
2
3 import javax.servlet.ServletContextEvent;
4 import javax.servlet.ServletContextListener;
5
6 /**
7 * @ClassName: MyServletContextListener
8 * @Description: MyServletContextListener类实现了ServletContextListener接口,
9 * 因此可以对ServletContext对象的创建和销毁这两个动作进行监听。
10 *
11 *
12 *
13 */
14 public class MyServletContextListener implements ServletContextListener {
15
16 @Override
17 public void contextInitialized(ServletContextEvent sce) {
18 System.out.println("ServletContext对象创建");
19 }
20
21 @Override
22 public void contextDestroyed(ServletContextEvent sce) {
23 System.out.println("ServletContext对象销毁");
24 }
25 }

  2、在web.xml文件中注册监听器
  我们在上面的中讲到,要想监听事件源,那么必须将监听器注册到事件源上才能够实现对事件源的行为动作进行监听,在JavaWeb中,监听的注册是在web.xml文件中进行配置的,如下:

1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0"
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
7 <display-name></display-name>
8 <welcome-file-list>
9 <welcome-file>index.jsp</welcome-file>
10 </welcome-file-list>11
12 <!-- 注册针对ServletContext对象进行监听的监听器 -->
13 <listener>
14 <description>ServletContextListener监听器</description>
15 <!--实现了ServletContextListener接口的监听器类 -->
16 <listener-class>me.gacl.web.listener.MyServletContextListener</listener-class>17 </listener>18
19 </web-app>

  经过这两个步骤,我们就完成了监听器的编写和注册,Web服务器在启动时,就会自动把在web.xml中配置的监听器注册到ServletContext对象上,这样开发好的MyServletContextListener监听器就可以对ServletContext对象进行监听了。监听HttpSession域对象的创建和销毁

HttpSessionListener 接口用于监听HttpSession对象的创建和销毁

  创建一个Session时,激发sessionCreated (HttpSessionEvent se) 方法
  销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se) 方法。

范例:编写一个MyHttpSessionListener类,实现HttpSessionListener接口,监听HttpSession对象的创建和销毁

  1、编写监听器,代码如下:

1 package me.gacl.web.listener;
2
3 import javax.servlet.http.HttpSessionEvent;
4 import javax.servlet.http.HttpSessionListener;
5
6 /**
7 * @ClassName: MyHttpSessionListener
8 * @Description: MyHttpSessionListener类实现了HttpSessionListener接口,
9 * 因此可以对HttpSession对象的创建和销毁这两个动作进行监听。
10 *
11 *
12 *
13 */
14 public class MyHttpSessionListener implements HttpSessionListener {
15
16 @Override
17 public void sessionCreated(HttpSessionEvent se) {
18 System.out.println( se.getSession() + "创建了!!");
19 }
20
21 /* HttpSession的销毁时机需要在web.xml中进行配置,如下:
22 * <session-config>
23 <session-timeout>1</session-timeout>
24 </session-config>
25 这样配置就表示session在1分钟之后就被销毁
26 */
27 @Override
28 public void sessionDestroyed(HttpSessionEvent se) {
29 System.out.println("session销毁了!!");
30 }
31 }

  2、在web.xml文件中注册监听器

1 <!--注册针对HttpSession对象进行监听的监听器-->
2 <listener>
3 <description>HttpSessionListener监听器</description>
4 <listener-class>me.gacl.web.listener.MyHttpSessionListener</listener-class>
5 </listener>
6 <!-- 配置HttpSession对象的销毁时机 -->
7 <session-config>
8 <!--配置HttpSession对象的1分钟之后销毁 -->
9 <session-timeout>1</session-timeout>
10 </session-config>

  当我们访问jsp页面时,HttpSession对象就会创建,此时就可以在HttpSessionListener观察到HttpSession对象的创建过程了,我们可以写一个jsp页面观察HttpSession对象创建的过程。

如下:index.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
2
3 <!DOCTYPE HTML>
4 <html>
5 <head>
6 <title>HttpSessionListener监听器监听HttpSession对象的创建</title>
7 </head>
8
9 <body>
10 一访问JSP页面,HttpSession就创建了,创建好的Session的Id是:${pageContext.session.id}
11 </body>
12 </html>
监听ServletRequest域对象的创建和销毁

  ServletRequestListener接口用于监听ServletRequest 对象的创建和销毁
  Request对象被创建时,监听器的requestInitialized(ServletRequestEvent sre)方法将会被调用
  Request对象被销毁时,监听器的requestDestroyed(ServletRequestEvent sre)方法将会被调用

  ServletRequest域对象创建和销毁时机:
    创建:用户每一次访问都会创建request对象
    销毁:当前访问结束,request对象就会销毁

范例:编写一个MyServletRequestListener类,实现ServletRequestListener接口,监听ServletRequest对象的创建和销毁
  1、编写监听器,代码如下:

1 package me.gacl.web.listener;
2
3 import javax.servlet.ServletRequestEvent;
4 import javax.servlet.ServletRequestListener;
5
6 /**
7 * @ClassName: MyServletRequestListener
8 * @Description: MyServletRequestListener类实现了ServletRequestListener接口,
9 * 因此可以对ServletRequest对象的创建和销毁这两个动作进行监听。
10 *
11 *
12 *
13 */
14 public class MyServletRequestListener implements ServletRequestListener {
15
16 @Override
17 public void requestDestroyed(ServletRequestEvent sre) {
18 System.out.println(sre.getServletRequest() + "销毁了!!");
19
20 }
21
22 @Override
23 public void requestInitialized(ServletRequestEvent sre) {
24 System.out.println(sre.getServletRequest() + "创建了!!");
25 }
26 }

  2、在web.xml文件中注册监听器

1 <!--注册针对ServletRequest对象进行监听的监听器-->
2 <listener>
3 <description>ServletRequestListener监听器</description>
4 <listener-class>me.gacl.web.listener.MyServletRequestListener</listener-class>
5 </listener>

  用户每一次访问都会创建request对象,当访问结束后,request对象就会销毁。

### Spring MVC 中 web.xml 配置详解 在 Spring MVC 的应用中,`web.xml` 是一个关键的配置文件,用于定义 Web 应用的初始化参数和组件。以下是关于 `contextConfigLocation`、`CharacterEncodingFilter`、`ContextLoaderListener` 和 `DispatcherServlet` 的详细说明。 --- #### 1. `contextConfigLocation` 参数 `contextConfigLocation` 是一个初始化参数,用于指定 Spring 应用上下文的配置文件位置。如果未显式配置该参数,则框架会默认寻找名为 `[servlet-name]-servlet.xml` 的配置文件[^3]。 ```xml <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </context-param> ``` 上述代码片段表明,Spring 容器将从类路径下的 `springmvc-servlet.xml` 文件加载配置信息。通过设置 `contextConfigLocation`,可以灵活地指定多个配置文件的位置。 --- #### 2. `CharacterEncodingFilter` 过滤器 `CharacterEncodingFilter` 是 Spring 提供的一个过滤器,用于解决请求和响应中的字符编码问题。它可以通过以下方式配置: ```xml <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 上述配置确保所有请求和响应都使用 UTF-8 编码[^2]。`forceEncoding` 参数为 `true` 时,强制覆盖任何已设置的字符编码。 --- #### 3. `ContextLoaderListener` 监听器 `ContextLoaderListener` 是一个 Servlet 容器监听器,用于在 Web 容器启动时初始化 Spring 的根应用上下文(Root ApplicationContext)。它实现了 `ServletContextListener` 接口,因此在容器启动时会自动执行其方法。 ```xml <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> ``` 当 `ContextLoaderListener` 被配置后,Spring 会根据 `contextConfigLocation` 参数加载配置文件并创建根应用上下文。如果没有指定 `contextConfigLocation`,则默认查找 `[servlet-name]-servlet.xml` 文件。 --- #### 4. `DispatcherServlet` 前置控制器 `DispatcherServlet` 是 Spring MVC 的核心组件之一,作为前端控制器负责接收所有 HTTP 请求,并将其分发到相应的处理器(Controller)进行处理[^1]。 ```xml <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 上述配置中,`DispatcherServlet` 被命名为 `springmvc`,并映射到 `/` 路径下,拦截所有请求。`contextConfigLocation` 参数指定了 DispatcherServlet 的配置文件位置。`load-on-startup` 参数值为 `1`,表示在应用启动时立即加载该 Servlet--- ### 总结 - `contextConfigLocation` 参数用于指定 Spring 配置文件的位置。 - `CharacterEncodingFilter` 解决了请求和响应的字符编码问题。 - `ContextLoaderListener` 初始化了 Spring 的根应用上下文。 - `DispatcherServlet` 作为前端控制器,负责请求的分发和处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值