2012-10-11 53 views
0

我有一個支持struts的java web應用程序。我想在運行時訪問struts-config.xml文件中的數據。Struts Java:如何從我的Java代碼讀取struts-config.xml?

我試圖像訪問一個簡單文件一樣訪問它,但由於它位於應用程序的根目錄之外,所以無法訪問該應用程序。

struts本身如何讀取文件?我怎樣才能在運行時模仿它?我只需要像一個簡單的XML文件一樣閱讀它。

謝謝。

回答

2

Struts通過簡單地使用ServletContext來做到這一點。

由於Struts的ActionServlet延伸HttpServlet,他們只是做:

URL resource = getServletContext().getResource("/WEB-INF/struts-config.xml"); 

從那裏,你可以得到一個InputStreamresource讀取數據。

如若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

在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,它會得到所有配置文件網址:

try { 
    urls = getConfigurationUrls(fileName); 
} catch (IOException ex) { 
    ioException = ex; 
} 

而下面的實現是如何獲取配置文件網址:

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文件的文件。