作为View的Result文件,如freemarker文件,不一定放在web目录里面,也没放在classpath下
这时候还能用Convention插件吗?
答案是:可以。解决方案分为两步:
1. 自定义
"struts.convention.resultMapBuilder"
在你自定义的resultMapBuilder中,你要根据action的路径去其对应的View目录中搜得所有View文件,然后将这些文件交给Convention Plugin处理
下面是一个参考实现:
public class MyResultMapBuilder extends DefaultResultMapBuilder { @Override protected void createFromResources(Class<?> actionClass, Map<String, ResultConfig> results, String resultPath, String resultPrefix, String actionName, PackageConfig packageConfig, Map<String, ResultTypeConfig> resultsByExtension) { // 找到本action对应的View目录 // //其中getTemplateRootDir()是你的view文件的根目录 File actionTemplateDir = new File(getTemplateRootDir(), flatResultLayout ? resultPath : resultPrefix); // 列出该目录中所有的View文件 Collection<File> actionTemplates = FileUtils.listFiles(actionTemplateDir, new String[] { "ftl" }, false); for (File actionTemplate : actionTemplates) { String absolutePath = separatorsToUnix(actionTemplate.getAbsolutePath()); // 得到每个View文件的相对路径 String relativePath = absolutePath.substring(separatorsToUnix( getTemplateRootDir().getAbsolutePath()).length()); // 传回给Convention Plugin,让它生成ResultConfig makeResults(actionClass, relativePath, resultPrefix, results, packageConfig, resultsByExtension); } } }
2. 再把"struts.convention.result.path"设置成"/",否则 "/WEB-INF/context"会被用作View文件路径的前缀