Tomcat8webapp,动态添加PostResources



我有一个webapp,它使用监听器来动态添加servlet实例。每个servlet实例都由用户定义的配置文件定义,并封装一个不同的数据集。这些数据集中的每一个还可能包括一些用户定义的静态web文件(HTML、JPG、CSS等)。每个servlet实例的静态资源都存储在webapp文件夹之外(以避免在重新部署时删除),并且每个servlet实例都有一个单独的文件夹层次结构。

在侦听器上下文初始化方法中,我使用javax.servlet.ServletContext.addServlet添加我的每个servlet实例,以及javax.servlet.ServletRegistration.Dynamic.addMapping以添加此servlet的URL映射。

我想为外部文件夹中的静态内容添加其他映射。在Tomcat7中,我扩展了org.apache.catalina.servlets.DefaultServlet将relativePath更改为我的新文档根,但是这个类在Tomcat 8 0-ClassNotFoundException(org.apache.namening.resources.FileDirContext)中不起作用。

Tomcat8有一个新的"Resources"框架,这将使这一点更加简单明了。

我的问题是,如何在不编辑web.xml的情况下(在web应用程序启动时,在侦听器内部)将PostResources元素动态添加到上下文中?

在我的听众中,我应该能够做这样的事情:

WebResourceRoot root = new StandardRoot(context);
root.createWebResourceSet(WebResourceRoot.ResourceSetType.POST, 
    "/my/url", "my/filesystem/path", null, "/");

但我不知道如何获得所需的上下文(org.apache.catalina.context),它与侦听器contextInitialized方法中的servlet ContextEvent提供的类似名称的javax.servlet.ServletContext是完全不同的类型。

有什么建议吗?谢谢

我想我已经使用MBeanServer解决了这个问题。不过,这似乎是一种迂回的方法——难道没有办法从ServletContext获取StandardRoot或StandardContext对象吗?

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.servlet.ServletContext;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.core.StandardEngine;
import org.apache.catalina.Container;
import org.apache.catalina.Server;
import org.apache.catalina.Service;
import org.apache.catalina.WebResourceRoot;
...
private void addPostResources(ServletContext servletContext)
    throws Exception /* just for debugging */ {
    MBeanServer mbs = MBeanServerFactory.findMBeanServer(null).get(0);
    ObjectName name = new ObjectName("Catalina","type","Server");
    Server server = (Server)mbs.getAttribute(name, "managedResource");
    Service service = server.findService("Catalina");
    StandardEngine engine = service.getContainer();
    Container hostContainer = engine.findChild(engine.getDefaultHost());
    StandardContext standardContext = (StandardContext)hostContainer.findChild(servletContext.getContextPath());
    WebResourceRoot root = standardContext.getResources();
    root.createWebResourceSet(WebResourceRoot.ResourceSetType.POST, 
        "/my/url", "my/filesystem/path", null, "/");
}

相关内容

  • 没有找到相关文章

最新更新