You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Struts2 Tiles插件迁移:子目录配置文件无法加载求助

解决方案:Struts2 6.3.0 Tiles子目录配置文件加载问题

方案1:自定义监听器扩展StrutsTilesListener

StrutsTilesListener本身不支持通配符扫描,但可以通过继承它并重写初始化逻辑,实现递归加载WEB-INF下所有子目录的tiles*.xml文件。

示例代码如下:

public class CustomStrutsTilesListener extends StrutsTilesListener {
    @Override
    protected TilesInitializer createTilesInitializer() {
        return new StrutsTilesInitializer() {
            @Override
            protected void addDefinitions(TilesContainerFactory factory, ServletContext context) {
                List<String> configPaths = scanTilesConfigs(context);
                factory.setDefinitions(configPaths);
            }

            private List<String> scanTilesConfigs(ServletContext context) {
                List<String> paths = new ArrayList<>();
                scanDirectory(context, "/WEB-INF", paths);
                return paths;
            }

            private void scanDirectory(ServletContext context, String dirPath, List<String> paths) {
                Set<String> resources = context.getResourcePaths(dirPath);
                if (resources == null) return;

                for (String path : resources) {
                    if (path.endsWith("/")) {
                        scanDirectory(context, path, paths);
                    } else if (path.matches(".*/tiles.*\\.xml$")) {
                        paths.add(path);
                    }
                }
            }
        };
    }
}

在web.xml中替换原监听器为自定义类:

<listener>
    <listener-class>com.yourpackage.CustomStrutsTilesListener</listener-class>
</listener>

方案2:用构建工具自动生成配置列表(临时过渡)

如果不想修改代码,可以借助Maven/Gradle等构建工具,在打包阶段自动收集所有tiles*.xml的路径,生成逗号分隔的列表注入到web.xml中。

以Maven为例,使用maven-antrun-plugin实现:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <tasks>
                    <fileset id="tilesConfigs" dir="${project.build.directory}/${project.build.finalName}/WEB-INF">
                        <include name="**/tiles*.xml"/>
                    </fileset>
                    <pathconvert property="tilesConfigList" refid="tilesConfigs" pathsep=",">
                        <mapper>
                            <chainedmapper>
                                <globmapper from="${project.build.directory}/${project.build.finalName}/*" to="/*"/>
                            </chainedmapper>
                        </mapper>
                    </pathconvert>
                    <replace file="${project.build.directory}/${project.build.finalName}/WEB-INF/web.xml">
                        <replacefilter token="@@TILES_CONFIGS@@" value="${tilesConfigList}"/>
                    </replace>
                </tasks>
            </configuration>
        </execution>
    </executions>
</plugin>

同时在web.xml中预留占位符:

<context-param>
    <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
    <param-value>@@TILES_CONFIGS@@</param-value>
</context-param>

方案3:验证Struts2 Tiles插件的隐藏配置

查看StrutsTilesListener源码,尝试使用未公开的通配符配置,比如:

<context-param>
    <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
    <param-value>/WEB-INF/**/tiles*.xml</param-value>
</context-param>

部分版本可能支持**通配符匹配子目录,可结合Struts2 6.3.0源码验证是否生效。

内容的提问来源于stack exchange,提问作者Michele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:37:37