freemarker模板加载TemplateLoader常见方式

使用过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目录下开始找。

时间: 2024-10-12 19:58:30

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

FreeMarer 模板加载,使用FreeMarker加载远程主机上模板文件

FreeMarker加载模板文件的三种方式: 1.从文件目录加载 2.从类路径加载 3.从Servlet上下文加载 其中第二个和第三个常用在Web开发环境中,类路径也会使用在普通的Java Project中, 如果模板文件不是和应用程序放在同一台主机上,那么如何去读取和解析这些模板文件呢?答案是可以解决的,FreeMarker就提供给一种加载模板的方式,查看API就有URLTemplateLoader类,该类为抽象类,从名字就可以看出从给定的URL加载模板文件,这个URL并没有限定来源, 来源可

velocity模板加载

http://hi.baidu.com/ly_dayu/item/828b09c5c3c5e547a8ba9409 velocity使用基本来说比较简单,但在加载模板时老出问题,很多初学者经常会遇到找不到模板这种异常.本文就针对目前常用的三种模板加载方式做以说明.  一.velocity默认的加载方式(文件加载方式) Java代码   package com.velocity.test; import java.io.StringWriter; import java.util.Properti

Django Template模板层 (下) ----------- 过滤器、人性化过滤器、模板继承、模板加载

---恢复内容开始--- 过滤器 除了模板标签可以帮助我们对数据或者进行逻辑处理.django 中还提供了一款工具叫做过滤器,过滤器也可以实现一些模板变量的运算,判断或是其他逻辑处理. add 语法: {{ var1|add:var2 }} add 过滤器可以实现 var1 与 var2 的相加,并且在遇到其他相同数据类型的,比如列表时,加号还可以重载为拼接功能 过滤器首先会将数据转换成Int类型,进行相加,如果转换失败,则会尝试使用 Python 中的数据类型 列表.元祖等这样的数据类型来进行

EF中加载实体的方式

加载实体的方式: 1.贪婪加载(eager loading) 2.延迟加载(lazy loading) 3.显示加载(explicit loading) 贪婪加载实现是通过include方法实现的 1 using (var context = new BloggingContext()) 2 { 3 // Load all blogs and related posts 4 var blogs1 = context.Blogs 5 .Include(b => b.Posts) 6 .ToList

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

引言 我们知道IOC容器时Spring的核心,可是如果我们要依赖IOC容器对我们的Bean进行管理,那么我们就需要告诉IOC容易他需要管理哪些Bean而且这些Bean有什么要求,这些工作就是通过通过配置文件告诉Spring 的IOC容器.在我们的完成这些配置文件以后,如果IOC容易要实现对这些Bean的管理,除了资源的定位还有一个很重要的一步就是完成IOC加载初始化,也就是配置文件的载入过程.完成IOC容器加载初始化的方式只要有三种,第一种就是通过File文件加载,第二种是通过Classpath

js模板加载框架 sea.js学习笔记

seajs实现了JavaScript 的 模块开发及按模块加载.用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载. 官方文档:http://seajs.org/docs/#docs 首先看看seajs是怎么进行模块开发的.使用seajs基本上只有一个函数“define” fn.define = function(id, deps, factory) { //code of function… } 使用define函数来进行定义一个模块

vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、一级mockjs用法、路由懒加载三种方式

不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p>Element UI简单Cascader级联选择器使用</p> <el-cascader :options='options' v-model="selectedOptions" @change="handleChange"> </el-

Java基础之Freemarker(1)模板加载及清空机制

一 freemarker加载模版机制 freemarker中的配置项template_update_delay表明模版的缓存时间,单位是s,超过缓存时间则从磁盘加载最新的模版,具体细节如下: 1)freemarker中获取模版的方法在Configuration中: 2)Configuration的getTemplate方法直接代理给TemplateCache: 3)TemplateCache中首先会尝试从缓存中加载模版: 然后根据template_update_delay来判断缓存中的模版是否需

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

Angularjs作为mvc(或者说mvvm)框架,同样具备模板这一基本概念. NG加载模板的顺序为 内存加载---AJAX加载. 内存加载 如果之前使用过Bootstrap 插件的ng版,即angular-ui,就会了解到这种方式的具体应用.模板本质上是字符串,把字符串直接写入内存,加载时直接从内存获取,速度会更快,有两种方式显式启用内存加载. 通过使用$templateCache service来实现 angular.module('myApp', []) .controller('myCt