首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

[Struts2 Convention] 如果Result文件不在web上或classpath上,怎么处理

2012-10-27 
[Struts2 Convention] 如果Result文件不在web下或classpath下,怎么办?作为View的Result文件,如freemarker

[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文件路径的前缀 1 楼 yeelor 2011-09-26   能不能给出 getTemplateRootDir() separatorsToUnix()getTemplateRootDir()这三个方法 和flatResultLayout 变量的定义?


直接把相关源代码发出来看看更好啊,谢谢! 2 楼 chenjianjx 2011-09-26   1. getTemplateRootDir()是你的view文件的根目录,取决于你自己的实现
2. separatorsToUnix()是org.apache.commons.io.FilenameUtils.separatorsToUnix(),来自著名的commons io 包
3. flatResultLayout应该是DefaultResultMapBuilder的成员变量,你可以在struts2源代码中搜搜

热点排行