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

问题描述 投票:3回答:4

我创建了一个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的默认位置。

java xml struts2 web.xml servlet-filters
4个回答
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

Key Initialization Parameters

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>

也就是说,我通常会避免这种定制:除了潜在的缺点之外,你将获得基本上没有任何东西,因为你可能是世界上唯一一个离开主要道路的缺点。


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)。


0
投票

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


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的路径,这是其他用户在此处的回答。

© www.soinside.com 2019 - 2024. All rights reserved.