3.10.4. Servlet 和过滤器的注册
ServletRegistrationManager
bean 能够使用正确的 ClassLoader
动态注册 servlet 和 filter,并允许使用类似于AppContext的静态类。它还能保证对于各种部署选项,都能正确工作。
ServletRegistrationManager
有两个方法:
-
createServlet()
- 创建给定 servlet 类的 servlet。它使用从应用程序上下文对象获取的正确的ClassLoader
加载 servlet 类。这意味着新的 servlet 将能够使用平台的一些静态类,例如,AppContext
或Messages bean。 -
createFilter()
- 以相同的方式创建过滤器.
要使用这个 bean,建议在应用程序组件中创建一个初始化 bean。这个 bean 需要包含监听 ServletContextInitializedEvent 和 ServletContextDestroyedEvent
的监听器。
示例:
@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部分。