在 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.

来自Configuration Files

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 的路径,正如其他用户在此处回答的那样。