在 Struts2 中更改 struts.xml 的默认位置
Change default location of struts.xml in Struts2
我创建了一个 Struts2 项目,当我将我的 struts.xml
文件放入 src
目录时,该项目工作正常。
下面是我的 web.xml
配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>struts2project</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
如果我将 struts.xml
放在 WEB-INF
目录中,它不会被加载。
请不要以 "it is irrelevant" 或其他形式给出答案。我只是问我们是否(以及如何)更改 struts.xml
的默认位置。
完全清楚,您甚至不需要 struts.xml,唯一 需要 配置文件是 web.xml.
From a Struts developer point of view, the one required configuration
file used by the framework is web.xml. From here, you have full
control over how Struts configures both itself and your application.
By default, Struts will load a set of internal configuration files to
configure itself, then another set to configure your application,
however it is possible to build an entire Struts application without
writing a single configuration file other than web.xml.
[...]
File Optional Location (relative to webapp) Purpose
-----------------------------------------------------------------------------------------
web.xml no /WEB-INF/ Web deployment descriptor to include
all necessary framework components
-----------------------------------------------------------------------------------------
struts.xml yes /WEB-INF/classes/ Main configuration, contains
result/view types, action mappings,
interceptors, and so forth
然而,为了回答您的问题,可以使用 web.xml.
中的 config
初始化参数添加默认配置文件以外的配置文件
来自web.xml
Key Initialization Parameters
config
- a comma-delimited list of XML configuration files to load.
所以在web.xml中指定新的struts.xml就足以实现你的目标:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>config</param-name>
<!-- Edit after @AleskandrM's comments/answer because
1) every possible configuration file must be specified,
otherwise they will be hidden by this setting and
2) settings are relative to /WEB-INF/classes/, and hence
the /WEB-INF/ must be replaced by ../ and
3) the order is important as well. You cannot extend
struts-default package in your struts.xml if it isn't loaded yet.
-->
<param-value>/WEB-INF/struts.xml</param-value>
<param-value>struts-default.xml,struts-plugin.xml,../struts.xml</param-value>
</init-param>
</filter>
也就是说,我通常会避免这种定制:除了潜在的缺点之外,您基本上什么也得不到,因为离开了主干道,您可能是世界上唯一的缺点。
struts.xml 应该只在应用程序的类路径中。它的位置无关紧要。
将struts.xml
直接放入WEB-INF文件夹的正确配置是:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,../struts.xml</param-value>
</init-param>
</filter>
阅读 Andrea and this one 找出原因。
此外,您定义 xml 文件的顺序也很重要。例如。如果尚未加载 struts-default
包(来自 struts-default.xml
),则不能在 struts.xml
中扩展它。
Struts 2 使用[=38加载默认配置文件(struts-default.xml、struts-plugin.xml、struts.xml) =]PrepareAndExecuteFilter (org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter).
了解框架加载这些文件 -
这些文件名在 Struts 框架的 Dispatcher.class 文件中定义为常量(在 StrutsPrepareAndExecuteFilter 中使用)。
DEFAULT_CONFIGURATION_PATHS = "struts-default.xml,struts-plugin.xml,struts.xml";
init_TraditionalXmlConfigurations() Dispatcher.class 中的方法加载这些 xml。
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")) {
configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
} else {
throw new IllegalArgumentException("Invalid configuration file name");
}
}
}
要覆盖这些 xml 的默认路径设置,您可以在 web.xml 中定义 StrutsPrepareAndExecuteFilter 时提供这些 XML 的路径,正如其他用户在此处回答的那样。
我创建了一个 Struts2 项目,当我将我的 struts.xml
文件放入 src
目录时,该项目工作正常。
下面是我的 web.xml
配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>struts2project</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
如果我将 struts.xml
放在 WEB-INF
目录中,它不会被加载。
请不要以 "it is irrelevant" 或其他形式给出答案。我只是问我们是否(以及如何)更改 struts.xml
的默认位置。
完全清楚,您甚至不需要 struts.xml,唯一 需要 配置文件是 web.xml.
From a Struts developer point of view, the one required configuration file used by the framework is web.xml. From here, you have full control over how Struts configures both itself and your application. By default, Struts will load a set of internal configuration files to configure itself, then another set to configure your application, however it is possible to build an entire Struts application without writing a single configuration file other than web.xml.
[...]
File Optional Location (relative to webapp) Purpose ----------------------------------------------------------------------------------------- web.xml no /WEB-INF/ Web deployment descriptor to include all necessary framework components ----------------------------------------------------------------------------------------- struts.xml yes /WEB-INF/classes/ Main configuration, contains result/view types, action mappings, interceptors, and so forth
然而,为了回答您的问题,可以使用 web.xml.
中的config
初始化参数添加默认配置文件以外的配置文件
来自web.xml
Key Initialization Parameters
config
- a comma-delimited list of XML configuration files to load.
所以在web.xml中指定新的struts.xml就足以实现你的目标:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>config</param-name>
<!-- Edit after @AleskandrM's comments/answer because
1) every possible configuration file must be specified,
otherwise they will be hidden by this setting and
2) settings are relative to /WEB-INF/classes/, and hence
the /WEB-INF/ must be replaced by ../ and
3) the order is important as well. You cannot extend
struts-default package in your struts.xml if it isn't loaded yet.
-->
<param-value>/WEB-INF/struts.xml</param-value>
<param-value>struts-default.xml,struts-plugin.xml,../struts.xml</param-value>
</init-param>
</filter>
也就是说,我通常会避免这种定制:除了潜在的缺点之外,您基本上什么也得不到,因为离开了主干道,您可能是世界上唯一的缺点。
struts.xml 应该只在应用程序的类路径中。它的位置无关紧要。
将struts.xml
直接放入WEB-INF文件夹的正确配置是:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,../struts.xml</param-value>
</init-param>
</filter>
阅读 Andrea
此外,您定义 xml 文件的顺序也很重要。例如。如果尚未加载 struts-default
包(来自 struts-default.xml
),则不能在 struts.xml
中扩展它。
Struts 2 使用[=38加载默认配置文件(struts-default.xml、struts-plugin.xml、struts.xml) =]PrepareAndExecuteFilter (org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter).
了解框架加载这些文件 -
这些文件名在 Struts 框架的 Dispatcher.class 文件中定义为常量(在 StrutsPrepareAndExecuteFilter 中使用)。
DEFAULT_CONFIGURATION_PATHS = "struts-default.xml,struts-plugin.xml,struts.xml";
init_TraditionalXmlConfigurations() Dispatcher.class 中的方法加载这些 xml。
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")) {
configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
} else {
throw new IllegalArgumentException("Invalid configuration file name");
}
}
}
要覆盖这些 xml 的默认路径设置,您可以在 web.xml 中定义 StrutsPrepareAndExecuteFilter 时提供这些 XML 的路径,正如其他用户在此处回答的那样。