3.10.4. Servlet 和过滤器的注册

应用程序组件中定义的 servlet 和 filter,需要以编程的方式进行注册。一般来说,它们在web.xml配置文件中注册过了,但是组件的 web.xml 配置在目标应用程序中不会生效。

ServletRegistrationManager bean 能够使用正确的 ClassLoader 动态注册 servlet 和 filter,并允许使用类似于AppContext的静态类。它还能保证对于各种部署选项,都能正确工作。

ServletRegistrationManager 有两个方法:

  1. createServlet() - 创建给定 servlet 类的 servlet。它使用从应用程序上下文对象获取的正确的 ClassLoader 加载 servlet 类。这意味着新的 servlet 将能够使用平台的一些静态类,例如,AppContextMessages bean。

  2. createFilter() - 以相同的方式创建过滤器.

要使用这个 bean,建议在应用程序组件中创建一个初始化 bean。这个 bean 需要包含监听 ServletContextInitializedEventServletContextDestroyedEvent 的监听器。

示例:

@Component
public class WebInitializer {

    @Inject
    private ServletRegistrationManager servletRegistrationManager;

    @EventListener
    public void initializeHttpServlet(ServletContextInitializedEvent e) {
        Servlet myServlet = servletRegistrationManager.createServlet(
                e.getApplicationContext(), "com.demo.comp.MyHttpServlet");

        e.getSource().addServlet("my_servlet", myServlet)
                .addMapping("/myservlet/*");
    }
}

这里的 WebInitializer 类只有一个事件监听器,用于从组件中为目标应用程序注册 HTTP servlet。

createServlet() 方法使用从 ServletContextInitializedEvent 获取的应用程序上下文和 HTTP servlet 的完全限定名。然后使用名称(my_servlet)注册 servlet 并定义 HTTP-mapping(/myservlet/)。现在,如果将此应用程序组件添加到应用程序中,将在初始化 servlet 和应用程序上下文后会立即注册 MyHttpServlet

Servlet 是用 myservlet 映射进行注册的,则根据应用程序上下文的不同,访问路径可以是: /app/myservlet 或者 /app-core/myservlet/

相关更复杂的示例,请参阅在应用程序组件中注册 DispatcherServlet部分。