我创建了一个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
的默认位置。
答案 0 :(得分:4)
要完全清楚,您甚至不需要struts.xml,唯一需要的配置文件是web.xml。
从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>
此外,定义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的路径,这是其他用户在此处的回答。