这是否可能?如果可以,如何实现?是否有办法通过Servlet API获取运行在servlet容器实例上的所有servlet上下文的列表?
[编辑:这并没有帮助,因为每个web.xml都必须具有相同的侦听器]
您可以使用ServletContextAttributeListener监听标准的WebApplicationContext属性插入,并通知一些集中的监视器?
未经过测试:
public class SpringWACListener implements ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent scab) {
if (WebApplicationContext.
ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE.
equals(scab.getName()) {
myCentralisedMonitor.notify("added");
}
}
// same for others
}
不行 - 对于这两个问题都不行。
访问所有servlet上下文将是一个安全问题。您将能够检查和/或操作其他Web应用程序。唯一知道所有servlet上下文的是容器本身。但这是内部实现,没有api可用。
Spring上下文访问类似,但如果您指的是一个webapp中的所有spring上下文,则它们将创建一个层次结构 - 例如控制器的上下文。在根Spring上下文中(由配置在web.xml
中的org.springframework.web.context.ContextLoaderListener
初始化)作为bean实现org.springframework.context.ApplicationListener
可以通知您有关启动、停止、关闭或刷新的上下文信息。
曾经有一个方法叫做[getServlets](http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/ServletContext.html#getServlet(java.lang.String)),但是现在已经被弃用了,没有任何替代方法,这意味着拥有这样的方法可能会使实现规范过于繁琐。从规范的JavaDoc中可以看到:
getServlets
public java.util.Enumeration getServlets()
已弃用。自Java Servlet API 2.0起,没有替代方法。
此方法最初定义为返回此servlet上下文中已知的所有servlet的枚举。在此版本中,此方法始终返回一个空枚举,并仅保留二进制兼容性。此方法将在未来的Java Servlet API版本中永久删除。
您的容器可能实现了类似的方法,但它是非标准的,您需要深入研究其文档或告诉我们您正在使用哪个容器。