从多个servlet上下文中获取属性文件

时间:2011-12-09 00:18:36

标签: java tomcat servlets classloader

我正在开发一个遍布在tomcat的一个实例中运行的多个上下文的Web应用程序。上下文标有crossContext="true",以便我们可以在不同的上下文之间共享一些jsp。还有一组公共类是tomcat common.loader的一部分。我们要远离这个项目来改变这个结构,所以在回答这个问题时请对这个结构保持敏感。

我想要做的是获取所有资源,比如说com.something.messages,它们存在于所有不同的上下文中。这是可能吗?我应该为每个创建的上下文记录类加载器并使用它来加载资源吗?你推荐什么?

1 个答案:

答案 0 :(得分:1)

如果您已经在Servlet 3.0上,那么您可以使用ServletContext#getClassLoader()来获取servlet上下文自己的类加载器:

ServletContext otherContext = servletContext.getContext("/other");
ClassLoader otherClassLoader = otherContext.getClassLoader();
// ...

(如果这会引发安全性异常,请相应地编辑策略文件)

然后,您可以将此类加载器传递给例如ResourceBundle#getBundle()

ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale, otherClassLoader);
// ...

如果由于各种原因(例如还没有使用Servlet 3.0,或者不愿意摆弄政策文件(非常合理......)等),那是不可能的,那么最好的办法是给每个Web应用程序自己ServletContextListener加载所需的捆绑包,并在ServletContext方法中将其存储为contextInitialized()的属性。通过这种方式,您可以通过常规方式将其作为属性。