ストラットで動作するJava Webアプリケーションがあります。実行時に struts-config.xml ファイルのデータにアクセスしたいと考えています。
単純なファイルのようにアクセスしようとしましたが、アプリのルート ディレクトリの外にあるため、アプリケーションに到達できません。
struts 自体はどのようにファイルを読み取りますか? そして、実行時にそれをどのように模倣できますか? 単純なxmlファイルのように読むだけです。
ありがとう。
Struts は、 を使用するだけでこれを行いServletContext
ます。
Struts ActionServlet
extendsHttpServlet
であるため、単純に次のことを行います。
URL resource = getServletContext().getResource("/WEB-INF/struts-config.xml");
そこから、 を取得してInputStream
からデータを読み取ることができますresource
。
null の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構成の初期化を担当します。struts-default.xml、struts-plugin.xml、struts.xmlの3つのファイルを検索します(これらは定数バリアント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ファイルのようにファイルを読み取ることができます。