更改Struts2中struts.xml的默认位置

时间:2015-06-03 12:32:16

标签: java xml struts2 web.xml servlet-filters

我创建了一个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目录中,它就不会被加载。

请不要将答案称为“无关紧要”或其他内容。我只是问我们是否(以及如何)更改struts.xml的默认位置。

4 个答案:

答案 0 :(得分:4)

要完全清楚,您甚至不需要struts.xml,唯一需要配置文件是web.xml。

来自Configuration Files

  

从Struts开发人员的角度来看,需要配置一个   框架使用的文件是web.xml 。从这里开始,你已经满员了   控制Struts如何配置自身和您的应用程序。   默认情况下,Struts将加载一组内部配置文件   配置自己,然后另一组配置您的应用程序,   但是可以在没有的情况下构建整个Struts应用程序   编写除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

  

密钥初始化参数

     

config - 要加载的以逗号分隔的XML配置文件列表。

因此,在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>

那就是说,我通常会避免这种定制:除了可能是世界上唯一一个因为离开主干道而无法获得的潜在缺点之外,你基本上什么都不会赚钱。

答案 1 :(得分:3)

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 answer和此one以找出原因。

此外,定义xml文件的顺序也很重要。例如。如果尚未加载struts-default struts-default.xml,则无法展开struts.xml

答案 2 :(得分:0)

struts.xml应该只在应用程序的类路径中。它的位置无关紧要。

答案 3 :(得分:0)

Struts 2使用StrutsPrepareAndExecuteFilter(org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)加载默认配置文件(struts-default.xml,struts-plugin.xml,struts.xml)。

了解按框架加载这些文件 -

这些文件名在Struts框架的Dispatcher.class(用于StrutsPrepareAndExecuteFilter)文件中定义为常量。

DEFAULT_CONFIGURATION_PATHS =“struts-default.xml,struts-plugin.xml,struts.xml”;

Dispatcher.class中的

init_TraditionalXmlConfigurations()方法会加载这些xmls。

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");
            }
        }
    }

要覆盖这些xmls的默认路径设置,您可以在web.xml中定义StrutsPrepareAndExecuteFilter时提供这些XML的路径,这是其他用户在此处的回答。