Struts Java:如何从我的java代码中读取struts-config.xml?

时间:2012-10-11 07:56:58

标签: java xml struts

我有一个处理struts的java web应用程序。我想在运行时访问struts-config.xml文件中的数据。

我试图像一个简单的文件一样访问它,但它无法访问应用程序,因为它位于应用程序的根目录之外。

struts本身如何读取文件?我怎样才能在运行时模仿它?我只需要像简单的xml文件一样阅读它。

感谢。

2 个答案:

答案 0 :(得分:2)

Struts只需使用ServletContext即可完成此操作。

因为Struts ActionServlet扩展了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();
}

上面的代码只是简化

答案 1 :(得分:1)

在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文件一样阅读该文件。