【问题标题】:Tomcat 8 webapp, dynamically add PostResourcesTomcat 8 webapp,动态添加 PostResources
【发布时间】:2016-04-11 23:12:53
【问题描述】:

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

在监听器 contextInitialized 方法中,我使用的是 javax.servlet.ServletContext.addServlet 添加我的每个 servlet 实例,以及 javax.servlet.ServletRegistration.Dynamic.addMapping 为这个 servlet 添加 URL 映射。

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

Tomcat 8 有一个新的“资源”框架,它应该让这更简单。

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

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

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

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

有什么建议吗? 谢谢。

【问题讨论】:

    标签: servlets tomcat8


    【解决方案1】:

    我想我已经使用 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, "/");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2015-07-17
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多