使用过freemarker的肯定其见过如下情况:

java.io.FileNotFoundException: Template xxx.ftl not found.

模板找不到。可能你会认为我明明指定了文件,并且文件存在,但是为什么就是说找不到呢? 
经过研究官方的API,原来freemarker在加载模板时,建议使用TemplateLoader,通过TemplateLoader指定从哪个目录开始加载模板,并且把模板加载在缓存中。

API的TemplateLoader是一个接口,他有如下几个实现类:

ClassTemplateLoader, FileTemplateLoader, MultiTemplateLoader, StringTemplateLoader, URLTemplateLoader, WebappTemplateLoader

顾名思义,我们能从类名中猜想到freemarker的模板加载机制,举例说明两个:

1、FileTemplateLoader 
 此是文件模板加载器,此即可以通过文件的绝对路径加载模板,如:

TemplateLoader templateLoader=null;
String path=""; //使用FileTemplateLoader
templateLoader=new FileTemplateLoader(new File("项目根路径"));
path="/WEB-INF/classes/com/xxx/tag/templates/page/xxx.ftl"; cfg.setTemplateLoader(templateLoader);
Template t=cfg.getTemplate(path,"UTF-8");

2、ClassTemplateLoader 
此是通过指定类所在的目录来指定模板所在根路径,即指定类在哪个目录,那么这个目录就是加载模板文件的根目录,如下:

Configuration cfg = new Configuration();  

            TemplateLoader templateLoader=null;
String path=""; templateLoader=new ClassTemplateLoader(PageTag.class,"templates/page/");
path="standardd.ftl"; cfg.setTemplateLoader(templateLoader);
Template t=cfg.getTemplate(path,"UTF-8");

此即表示比PageTag类所在的目录开始找,找这个目录下的templates/page/目录

其它的加载器原理同上。

如果你是web项目,并且使用了spring,那么。你还可以通过spring来配置你模板文件的根目录,如下:

<bean id="freemarkerConfig" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="/WEB-INF" />
<property name="freemarkerSettings">
<props>
<prop key="defaultEncoding">UTF-8</prop>
</props>
</property>
</bean>

此即表示从WEB-INF目录下开始找。

freemarker模板加载TemplateLoader常见方式的更多相关文章

  1. angular模板加载 ----ng-template

    Angularjs作为mvc(或者说mvvm)框架,同样具备模板这一基本概念. NG加载模板的顺序为 内存加载---AJAX加载. 如果排版乱掉,请查阅https://www.zybuluo.com/ ...

  2. velocity模板加载

    http://hi.baidu.com/ly_dayu/item/828b09c5c3c5e547a8ba9409 velocity使用基本来说比较简单,但在加载模板时老出问题,很多初学者经常会遇到找 ...

  3. 关于实现Extjs动态加载类的方式实现

    Extjs4以前的版本没有动态加载类的方式,这样开发程序的时候加载很多的js会导致加载变慢,由于本人一直使用extjs3的版本进行开发,于是简单实现了一个动态加载类的管理器,使用方式与extjs4的方 ...

  4. EF中加载实体的方式

    EF中的查询执行时机:1. foreach进行枚举2. ToArray.ToList.ToDictionary3. Linq的一些操作,如First.Any4. DbSet上的Load操作.DbEnt ...

  5. EF加载实体的方式

    原文:Loading Related Entities EF加载数据的方式: 预加载 eager loading 延迟加载 lazy loading 显示加载 explicit loading 预先加 ...

  6. Spring之IOC容器加载初始化的方式

    引言 我们知道IOC容器时Spring的核心,可是如果我们要依赖IOC容器对我们的Bean进行管理,那么我们就需要告诉IOC容易他需要管理哪些Bean而且这些Bean有什么要求,这些工作就是通过通过配 ...

  7. Android中加载事件的方式

    Android中加载事件的方式 通过内部类的方式实现 通过外部类的方式实现 通过属性的方式实现 通过自身实现接口的方式实现 通过内部类的方式实现 Demo btn_Login.setOnClickLi ...

  8. UIImage加载图片的方式以及Images.xcassets对于加载方法的影响

    UIImage加载图片的方式以及Images.xcassets对于加载方法的影响 图片缓存 根据是否将创建好的对象缓存入系统内存,有两类创建UIImage对象的方法可选: 缓存:+ imageName ...

  9. UE4中资源加载资源的方式

    在UNITY中,我们加载资源一般是通过Resources.Load(path).即可完成.该方法返回的是Object类型.如果你想要的是材质或者贴图等等,只要价格类型转换的关键字就可以了例如 as M ...

随机推荐

  1. 关于vue.js中slot的理解

    slot这块看官网文档,起初有点不懂,仔细研究还是最终理解了,slot是用来干嘛的呢,先看下一个例子: <script src="https://unpkg.com/vue/dist/ ...

  2. MINI3内存分配算法

    最差适应算法 #ifdef USING_WORST_FIT { //先找到第一个满足要求的空洞, //再以第一个为标准寻找最适合的空洞. //当最适合的空洞完全吻合 //就直接划给它,当空洞较大时就切 ...

  3. 一:Bootstrap-css样式

    页面大块布局: div.container 栅格系统: 一行分成 12 列 div.row div.col-md-12 div.col-xs-12 <div class="row&qu ...

  4. redis内存模型及应用解读

    Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型:字符串.哈希 ...

  5. 集群搭建之Hive配置要点

    注意点: 在启动Hive 的时候要先启动Hadoop和MySQL服务. Mysql 和 Hive 搭建在 yan00机器上. part1:MySQL配置相关 安装和配置相关命令: Yum instal ...

  6. 03-Tomcat服务器

    一.Java分类 JavaSE Java的标准版,一般用来开发桌面应用程序, 但是在开发桌面应用程序上相对VB,Delphi,VC++并没有什么优势. JavaEE 也就是Java Enterpris ...

  7. XML文档的解析—dom4j

    XML为可扩展标记语言,它主要是用来保存数据,做配置文件,数据传输载体等.其实就是一个后缀名为.xml的文件. XML命名规则 名称可以含字母.数字以及其他的字符 名称不能以数字或者标点符号开始 名称 ...

  8. jenkins在Linux 下安装部署

      这里介绍两种方法,一种方法将最新版jenkins加入到yum源,另外一种是下载指定版本的rpm包 系统centos6 自带jdk1.7 一 安装jenkins wget -O :下载并以不同的文件 ...

  9. MySQL:SQL进阶

    一.数据库相关理论 1.系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_s ...

  10. 使用input做简单的上传图片

    css 代码: .container{ width: 200px; height: 200px; border: 1px solid #666; } HTML 代码: <input type=& ...