如何以编程方式为 Servlet 添加监听器?

How to add a Listener programatically for Servlets?

在 Servlet 3.0 中,有一种方法可以在 ServletContextListener 的 contextInitialized() 方法中以编程方式添加侦听器。 Servlets 和 Filters 可以通过编程方式添加如下(如果我错了请更正下面的代码

public void contextInitialized(ServletContextEvent sce) {

        ServletContext sc = sce.getServletContext();

        // Register Servlet
        ServletRegistration sr = sc.addServlet("DynamicServlet",
            "com.sample.DynamicServlet");
        sr.setInitParameter("servletInitName", "servletInitValue");
        sr.addMapping("/dynamic");

// Register Filter
FilterRegistration fr = sc.addFilter("DynamicFilter","com.sample.TestFilter");
fr.setInitParameter("filterInitName", "filterInitValue");
fr.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST),
                                     true, "DynamicServlet");
    }

同样,我希望是否有人可以分享一个以编程方式添加监听器的示例,因为我不知道该怎么做。

是否可以通过编程方式添加 ServletContextListener 本身?如果是,那么我应该在哪里添加它?由于所有 Servlet、Listeners、Filter 及其实例化都是从 contextInitialized() 方法完成的。所以如果我必须以编程方式实例化它,我应该在哪里声明它?

提前致谢

从 Servlet 3.0 开始,您可以通过调用 ServletContext.addListener(Class<? extends EventListener>).

以编程方式添加 ServletContextListener

然而,这只能从 ServletContainerInitializer.onStartup 完成,即 运行 在任何 ServletContextListeners 被调用之前。


ServletContext.addListener(Class<? extends EventListener>) 的 Javadoc 内容如下:

Adds a listener of the given class type to this ServletContext.
The given listenerClass must implement one or more of the following interfaces:

ServletContextAttributeListener
ServletRequestListener
ServletRequestAttributeListener
HttpSessionAttributeListener
HttpSessionIdListener
HttpSessionListener 

If this ServletContext was passed to ServletContainerInitializer.onStartup(...), then the given listenerClass may also implement ServletContextListener, in addition to the interfaces listed above.