我有一个使用 struts 的 java web 应用程序。我想在运行时访问 struts-config.xml 文件中的数据。
我试图像访问一个简单的文件一样访问它,但是应用程序无法访问它,因为它位于应用程序的根目录之外。
struts 本身是如何读取文件的?以及如何在运行时模仿它?我只需要像一个简单的 xml 文件一样阅读它。
谢谢。
Struts 只需使用ServletContext
.
因为 Struts ActionServlet
extends HttpServlet
,它们只是做:
URL resource = getServletContext().getResource("/WEB-INF/struts-config.xml");
从那里,您可以获取InputStream
并从中读取数据resource
。
如果resource
为空,另一种选择是:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (loader == null) {
loader = this.getClass().getClassLoader();
}
Enumeration e = loader.getResources(path);
if (e != null && e.hasMoreElements()) {
resource = (URL)e.nextElement();
}
上面的代码只是简化了。
在 Stuts2 中,类 org.apache.struts2.dispatcher.Dispatcher 中的方法 init_TraditionalXmlConfigurations 负责初始化 xml 配置。它将搜索 3 个文件,struts-default.xml、struts-plugin.xml、struts.xml(它们在常量变量 DEFAULT_CONFIGURATION_PATHS 中定义)。
private void init_TraditionalXmlConfigurations() {
String configPaths = initParams.get("config");
if (configPaths == null) {
configPaths = DEFAULT_CONFIGURATION_PATHS;
}
String[] files = configPaths.split("\\s*[,]\\s*");
for (String file : files) {
if (file.endsWith(".xml")) {
if ("xwork.xml".equals(file)) {
configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));
} else {
configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
}
} else {
throw new IllegalArgumentException("Invalid configuration file name");
}
}
}
然后,在方法 loadConfigurationFiles 中,它将获取所有配置文件的 url:
try {
urls = getConfigurationUrls(fileName);
} catch (IOException ex) {
ioException = ex;
}
下面的实现是如何获取配置文件的 url:
protected Iterator<URL> getConfigurationUrls(String fileName) throws IOException {
return ClassLoaderUtil.getResources(fileName, XmlConfigurationProvider.class, false);
}
public static Iterator<URL> getResources(String resourceName, Class callingClass, boolean aggregate) throws IOException {
AggregateIterator<URL> iterator = new AggregateIterator<URL>();
iterator.addEnumeration(Thread.currentThread().getContextClassLoader().getResources(resourceName));
if (!iterator.hasNext() || aggregate) {
iterator.addEnumeration(ClassLoaderUtil.class.getClassLoader().getResources(resourceName));
}
if (!iterator.hasNext() || aggregate) {
ClassLoader cl = callingClass.getClassLoader();
if (cl != null) {
iterator.addEnumeration(cl.getResources(resourceName));
}
}
if (!iterator.hasNext() && (resourceName != null) && ((resourceName.length() == 0) || (resourceName.charAt(0) != '/'))) {
return getResources('/' + resourceName, callingClass, aggregate);
}
return iterator;
}
上面的代码是struts 加载配置的方式。
对你来说,如果你想手动加载 struts-config.xml,你可以使用下面的代码:
String filePath = "your struts-config.xml file path";
URL resource = Thread.currentThread().getContextClassLoader().getResource(filePath);
然后,您可以像读取一个简单的 xml 文件一样读取该文件。