侦听器、过滤器和 Servlet 的程序化配置

了解 Servlet 3.0 规范中引入的配置方法(addListener、addFilter 和 addServlet)。 这些方法是 ServletContext 接口的一部分,可以从 ServletContainerInitializer 或 ServletContextListener 调用这些方法。

详细描述了配置方法 addListener、addFilter 和 addServlet。 如果 ServletContext侦听器未在 web.xml 文件或 web-fragment.xml file中声明,或者未使用 @WebListener进行注释,那么 ServletContext侦听器无法以编程方式配置 Servlet ,过滤器或侦听器。 因此,为执行此类程序配置而对 ServletContext 进行的任何调用都会导致 UnsupportedOperationException。

addListener

WebSphere® Application Server V 9.0中不推荐使用 addGlobal侦听器方法。 此方法会替换为 addListener 方法。
  • 使用以下方法以将侦听器添加到此 servlet 上下文:
    void addListener(java.lang.String className)
  • 使用以下方法以将侦听器添加到此 servlet 上下文:
    <T extends java.util.EventListener> void addListener(T t)
  • 使用以下方法以将侦听器添加到此 servlet 上下文:
    void addListener(java.lang.Class<? extends java.util.EventListener> listenerClass)
侦听器类必须实现以下一个或多个接口:
  • ServletContextAttributeListener
  • ServletRequestListener
  • ServletRequestAttributeListener
  • HttpSessionListener
  • HttpSessionAttributeListener
  • javax.servlet.http.HttpSessionIdListener
  • javax.servlet.ServletContextListener
    注: 只能从 javax.servlet.ServletContainerInitializer的 onStartUp 方法添加 javax.servlet.ServletContextListener 。

addFilter

WebSphere Application Server V 9.0中不推荐使用 addMapping过滤器方法。 此方法会替换为 addFilter 方法。 此方法会将具有给定名称、描述和类名的过滤器添加到 Web 应用程序上下文。 可以使用返回的 FilterRegistration 对象对注册过滤器进行进一步配置。
  • 使用以下方法以将过滤器添加到此 servlet 上下文:
    addFilter(java.lang.String filterName, java.lang.Class<? extends Filter> filterClass)
  • 使用以下方法以将过滤器添加到此 servlet 上下文:
    addFilter(java.lang.String filterName, Filter filter) 
  • 使用以下方法以将过滤器添加到此 servlet 上下文:
    addFilter(java.lang.String filterName, java.lang.String className) 

addServlet

addServlet 方法会将 servlet 动态添加到 servletContext。 这些方法会将具有给定参数的 servlet 添加到 Web 应用程序上下文。 可以使用返回的 ServletRegistration 对象对注册的 servlet 进行进一步配置。

  • 使用以下方法以将 servlet 添加到此 servlet 上下文:
    addServlet(java.lang.String servletName, java.lang.Class<? extends Servlet> servletClass)
  • 使用以下方法以将 servlet 添加到此 servlet 上下文:
    addServlet(java.lang.String servletName, Servlet servlet)
  • 使用以下方法以将 servlet 添加到此 servlet 上下文:
    addServlet(java.lang.String servletName, java.lang.String className)

ServletContainerInitializer

为共享库配置 JAR 文件且在 JAR 中发现 ServletContainerInitializer 时,会为与共享库关联的每个应用程序调用 ServletContainerInitializer。

Servlet 3.0 中不推荐的类

com.ibm.websphere.servlet.context.IBMServletContext 中不推荐以下类:
  • public void addDynamicServlet(String servletName, String servletClass, String mappingURI, Properties initParameters) throws ServletException, java.lang.SecurityException;
  • public void removeDynamicServlet(String servletName) throws java.lang.SecurityException
由于移除 servlet 可能会在该请求同时为 servlet 提供服务的情况下导致计时问题,因此没有 removeDynamicServlet 方法的替代方法。 addServlet 和 createServlet 方法替换 addDynamicServlet 方法。