[Struts2 Convention] 如果Result文件不在web下或classpath下,怎么办?

作为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文件路径的前缀

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.