【发布时间】: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 完全不同。
有什么建议吗? 谢谢。
【问题讨论】: