【Java.Web】监听器 —— Listener(*** 使用自定义Listener进行初始化工作 ***)

本文详细介绍了Servlet Listener的概念及其在JavaWeb中的应用方式。包括如何通过web.xml配置Listener,以及各种Listener如ServletContextListener、HttpSessionListener等的功能和触发时机。

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

Listener是基于观察者模式设计的,Listener为Servlet应用程序提供一种控制程序和数据的手段。

Listener的注册

Java Web的listener注册比较简单,因为其监听的对象及事件都是Servlet容器创建的,如果需要它们的监听器的话,只需要在web.xml中配置即可:

<!-- web.xml-->
<listener>
    <listener-class>... ...实现特定接口的自定义监听器1</listener-class>
    <listener-class>... ...实现特定接口的自定义监听器2</listener-class>
    ... ...
</listener>


对于多个实现相同接口的listener,在执行时按照在web.xml中注册的顺序来决定


listener也可以在应用程序中动态添加。


Listener相关接口

Servlet规范中定义了多种类型的listener,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象

Servlet规范针对这三个对象上的操作,又把这写监听器分为三种类型:

  • 监听三个域对象的创建和销毁的事件监听器

Listener类

含有的接口

接口说明

ServletContextListener

contextInitialized(ServletContextEvent sce);


contextDestroyed(ServletContextEvent sce);

Context容器初始化时触发,在所有的Filter和Servlet的init方法调用之前contextInitialized接口先被调用;


Context容器销毁,在所有的Filter和Servlet的destroy方法调用之后contextDestroyed接口被调用;

HttpSessionListener

SessionCreated(HttpSessionEvent se);
SessionDestroyed(HtppSessionEvent se);

当一个session对象被创建时触发;
当一个session对象被失效时触发;

ServletRequestListener

requestInitialized(ServletRequestEvent sre);
requestDestroyed(ServletRequestEvent sre);

当HttpServletRequest对象被传递到用户的Servlet的service方法之前该方法被触发;

当HttpServletRequest对象在调用完用户的Servlet的service方法之后该方法被触发;


注意:ServletContextListener在容器启动之后就不能再添加新的了,因为它所监听的事件已经不会再出现了。


  • 听三个域对象中属性的增,删,改的事件监听器

Listener类

含有的接口

接口说明

ServletContextAttributeListener

AttributeAdded(ServletContextAttributeEvent scab);


AttributeRemoved(ServletContextAttributeEvent scab);


AttributeReplaced(ServletContextAttributeEvent scab);

当调用servletContext.setAttribute方法时触发这个方法;


当调用servletContext.removeAttribute方法时触发这个方法;


如果在调用servletContext.setAttribute之前该attribute已经存在,则替换这个attribute时,这个方法被触发

HttpSessionAttributeListener

attributeAdded(HttpSessionBindingEvent se);


attributeRemoved(HttpSessionBindingEvent se);


attributeReplaced(HttpSessionBindingEvent se);

session.setAttribute方法被调用时该方法被触发;


session.removeAttribute方法被调用时该方法被触发;


如果在调用session.setAttribute之前该attribute已经存在,则替换这个attribute时这个方法被触发;

ServletRequestAttributeListener

AttributeAdded(ServletRequestAttributeEvent srae);


AttributeRemoved(ServletRequestAttributeEvent srae);


AttributeReplaced(ServletRequestAttributeEvent srae);

当调用request.setAttribute方法时触发这个方法;


当调用request.removeAttribute方法时触发这个方法;


如果在调用request.setAttribute之前该attribute已经存在,则替换attribute时这个方法被触发;


  • 感知型监听器

这种监听器不需要注册。

某个java bean实现这个接口后就可以监听何时被绑定,解绑或被激活或钝化。

HttpSessionBindingListener:实现该接口的类,能检测自己何时被HttpSession绑定,解绑;

HttpSessionActivationListener:实现该接口的类,能检测自己何时随着HttpSession一起激活和钝化;


Listener的应用示例

比如:

  • 应用的初始化工作 —— 在自定义继承的ServletContextListener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放




<think>好的,用户想了解Servlet中的注解列表及用法,以及注解与web.xml的配合使用方法。首先,我需要回顾一下Servlet相关的注解,特别是常用的几个,比如@WebServlet,@WebInitParam,@WebListener,@WebFilter等。用户可能想知道这些注解的具体参数和用法,以及它们如何替代或与web.xml配置结合使用。 首先,要列出Servlet中常用的注解,并解释每个注解的作用和参数。例如,@WebServlet用于定义Servlet的访问路径和初始化参数,需要说明urlPatterns、name、initParams等属性的用法。然后,可能需要给出代码示例,展示如何用注解配置一个Servlet,这样用户更直观。 接下来,用户提到注解与web.xml的配合使用。这里需要注意,当同时使用注解和web.xml配置同一个Servlet时,容器如何处理。根据Servlet规范,如果存在web.xml的配置,它会覆盖注解中的设置。需要解释这种覆盖规则,并举例说明,比如在web.xml中设置不同的url-pattern会替换注解中的值。 然后,用户可能想知道如何混合使用两种配置方式。例如,部分Servlet用注解,部分用web.xml,或者在一个应用中同时使用的情况。需要说明两者可以共存,但要注意避免冲突,比如重复映射同一路径。 另外,可能需要提到一些注意事项,比如Servlet 3.0及以上版本支持注解,而旧版本需要依赖web.xml。还有部署描述符的metadata-complete属性,当设置为true时,容器会忽略注解,这时必须使用web.xml配置。 还需要检查提供的引用内容,确保回答符合引用中的信息。例如,引用[1]提到使用WebServlet注解和web.xml配置的区别及注意事项,引用[2]和[3]给出了具体的配置示例,可能需要引用这些来说明覆盖情况。 最后,生成相关问题,帮助用户深入理解,比如注解的优势,版本兼容性问题,配置覆盖的优先级,以及如何选择配置方式等。确保问题覆盖用户可能感兴趣的扩展内容。 总结步骤: 1. 列举Servlet常用注解及其参数和用法。 2. 提供注解配置的代码示例。 3. 解释注解与web.xml的配合使用,特别是覆盖规则。 4. 混合配置的注意事项。 5. 注意事项,如版本支持、metadata-complete属性。 6. 生成相关问题,引导进一步学习。</think>### Servlet注解与web.xml配置详解 #### 一、Servlet常用注解列表及用法 1. **@WebServlet** 定义Servlet的访问路径和初始化参数,支持以下属性: ```java @WebServlet( name = "demoServlet", //Servlet名称(可选) urlPatterns = {"/demo", "/test"}, //URL映射路径(必填) initParams = { @WebInitParam(name = "encoding", value = "UTF-8") }, //初始化参数 loadOnStartup = 1 //启动优先级 ) ``` 等价于web.xml中的: ```xml <servlet> <servlet-name>demoServlet</servlet-name> <servlet-class>com.example.DemoServlet</servlet-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>demoServlet</servlet-name> <url-pattern>/demo</url-pattern> <url-pattern>/test</url-pattern> </servlet-mapping> ``` 2. **@WebFilter** 定义过滤器,可指定拦截路径: ```java @WebFilter( filterName = "logFilter", urlPatterns = "/*", initParams = @WebInitParam(name = "logLevel", value = "DEBUG") ) ``` 3. **@WebListener** 声明事件监听器: ```java @WebListener public class SessionListener implements HttpSessionListener {...} ``` #### 二、注解与web.xml配合规则 1. **覆盖原则** 当同一个Servlet同时通过注解和web.xml配置时: - `web.xml`的`<servlet-class>`会覆盖注解中的类声明 - `web.xml`的`<url-pattern>`会替换注解的`urlPatterns`[^1] ```xml <!-- web.xml配置将覆盖注解 --> <servlet> <servlet-name>overrideDemo</servlet-name> <servlet-class>com.example.NewServlet</servlet-class> <url-pattern>/newpath</url-pattern> </servlet> ``` 2. **混合配置场景** - 基础配置(如数据库连接池)建议使用web.xml - 业务层Servlet推荐使用注解 - 可通过`metadata-complete="true"`强制禁用注解[^3] ```xml <!-- web.xml头部声明 --> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" metadata-complete="true"> ``` #### 三、开发建议 1. **版本适配** | 特性 | Servlet 3.0+ | Servlet 2.5 | |---|---|----| | 注解支持 | ✔️ | 需web.xml | | 动态注册 | ✔️ | ✖️ | 2. **路径冲突检测** 使用工具检查重复映射: ```bash mvn clean install -DcheckMapping=true ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值