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
相关产品推荐
相关产品推荐

