【发布时间】:2018-06-22 07:31:17
【问题描述】:
我想在 servlet 上下文中动态添加和删除 servlet。我知道如何使用 ContextHandlerCollection 动态添加多个 servlet 上下文。但是,我需要对上下文中的多个 servlet 执行相同的操作。一旦启动了 servlet 上下文,是否可以添加更多 servlet?
【问题讨论】:
我想在 servlet 上下文中动态添加和删除 servlet。我知道如何使用 ContextHandlerCollection 动态添加多个 servlet 上下文。但是,我需要对上下文中的多个 servlet 执行相同的操作。一旦启动了 servlet 上下文,是否可以添加更多 servlet?
【问题讨论】:
Servlet 只能添加,不能删除。
查看各种ServletContext.addServlet() 方法。
但是请注意,您只能在 ServletContextListener.contextInitialized() 期间更改 ServletContext(请参阅 ServletContext.addServlet() 中的 javadoc 以了解 UnsupportedOperationException throwable)
【讨论】:
几年前我确实在 ECM 组件中实现了它,因此可以通过 ConfigAdmin 设置添加和删除 servlet,而无需在 OSGi 环境中重新启动 Jetty。
因为是两年多前的事了,我不记得每一个细节,但你可以自己检查代码。在此处查看 CustomServletHandler 类的 updateServletsAndFilters() 函数:https://github.com/everit-org/jetty-server-ecm/blob/master/component/src/main/java/org/everit/jetty/server/ecm/internal/CustomServletHandler.java#L88
一些提示:
上面的函数是从 ServletContextHandlerFactoryComponent 类的 updateServletHandlerWithDynamicSettings() 函数调用的(这是根据配置预先收集映射、servlet 和过滤器的地方):https://github.com/everit-org/jetty-server-ecm/blob/master/component/src/main/java/org/everit/jetty/server/ecm/internal/ServletContextHandlerFactoryComponent.java#L86
【讨论】: