`
小杨学JAVA
  • 浏览: 886204 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

FreeMarker配置(Configuration)

 
阅读更多

FreeMarker配置(Configuration)

 

基础

Configuration 是一个存放应用级别(application level)公共配置信息,以及模版(Template)可使用的全局共享变量的一个对象。同时它还负责模版(Template)实例的创建以及缓存。Configuration 实际上是freemarker.template.Configuration 对象的实例,使用其构造函数创建。通常应用使用一个共享的单实例Configuration 对象。

Configuration 对象可被Template 对象的方法使用,每一个模版实例都关联与一个Configuration 实例,它是通过Template 的构造函数被关联进去的,通常是你使用这个方法来Configuration.getTemplate 获得模版对象的。

共享变量

共享变量是那些定义给所有模版(Template)使用的变量。你可以通过configuration对象的setSharedVariable 方法来添加共享变量。

Configuration cfg =newConfiguration();... cfg.setSharedVariable("wrap",newWrapDirective()); cfg.setSharedVariable("company","Foo Inc.");// Using ObjectWrapper.DEFAULT_WRAPPER

所有与该configuration 对象关联的模版实例都就可以通过获得to_upper 转换器,company 来获得字符串,因此你不需要再一次次的往root 中添加这些变量了。如果你往root 添加同名的变量,那么你新添加的变量将会覆盖之前的共享变量。

警告!

如果configuration 对象被多线程调用,那么不要使用TemplateModel 实现类作为共享变量,因为他们是非线程安全的,例如基于servlet 的web 站点就是这种情况。

Configuration 对象初始化时已经包含一些共享转换器变量:

名字类

nameclass
capture_output freemarker.template.utility.CaptureOutput
compress freemarker.template.utility.StandardCompress
html_escape freemarker.template.utility.HtmlEscape
normalize_newlines freemarker.template.utility.NormalizeNewlines
xml_escape freemarker.template.utility.XmlEscape

 

配置参数

配置参数是那些可以影响FreeMarker 运行行为的那些命名参数。例如locale,number_format

配置参数存储在Configuration实例中,它可以被模版实例(Template)修改。例如,你在Configuration中设置了locale等于”en_US“,那么所有的模版对象都会使用,”en_US”除非你在单个模版实例中利用setLocale方法修改了默认配置。因此configuration设置的参数可以当作是默认参数,它可以被Template一级设置的参数覆盖,而它们两者设置的参数信息又可以被环境中设置的参数所覆盖(也就是模版文件指令设置的)如下:

${1.2}
<#setting locale="en_US">
${1.2}

这种调用方式你可以想象成3 个层(配置对象层,模版层,运行环境层)下面表格中显示了每一层对于参数的设置:

  Setting ASetting BSetting CSetting DSetting ESetting F
Layer 3:Environment 1 - - 1 - -
Layer 2:Template 2 2 - - 2 -
Layer 1:Configuration 3 3 3 3 - -

那么配置参数的最终结果分别是:A = 1, B = 2, C = 3, D = 1, E = 2.而F 参数很可能就是null。

如果要查询可设置的参数列表,你可以查阅FreeMarker API 文档的以下两个部分:
所有层的配置

freemarker.core.Configurable.setSetting(String,String)

Coniguration 层的配置

freemarker.template.Configuration.setSetting(String,String)

加载模板

模版加载器

模版加载器是基于抽象路径(”index.ftl“或”products/catalog.ftl“)加载原始数据的那些对象,而究竟加载何种资源(目录中的文件数据还是数据库中的数据)取决于具体的加载器实现。当你调用cfg.getTemplate 时,FreeMarker 将会询问你之前配置给Configuration 对象的模版加载器,有该模版加载器负责文件的载入。

内建的模版加载器
你可以用以下三个方法来设置模版加载的三种方式

void setDirectoryForTemplateLoading(File dir);

或者

void setClassForTemplateLoading(Class cl,String prefix);

或者

void setServletContextForTemplateLoading(Object servletContext,String path);

以上第一种方式显示的指定了一个文件系统中的目录,FreeMarker 将会在此目录记载模版,不用说,此目录必须存在,否在会抛出异常。

第二种方式以一个Class作为一个输入参数,当你想使用ClassLoader的方式来加载模版的时候,你就可以使用这种方式,这种方式将会调用来寻找模版文件,同时这种模版加载的方式要比前一种稳定一些尤其是在生产系统中。你可以很容易的把资源文件,以及图标等打包到.jar 文件中。

第三种方式把web 应用的上下文以及基路径(相对与WEN-INF 的父路进来说)作为参数。该种方式的模版加载器将会从web 应用上下文种加载模版。

从多个位置加载模版

如果你想从多个位置加载模版的话,你可以分别创建与不同位置对应的单个模版加载器,然后把它们包裹到一个名叫MultiTemplateLoader模版加载器中,最终通过方法setTemplateLoader(TemplateLoader loader)把其设置给Configuration 对象,以下有一个从两个不同位置加载模版的例子:

import freemarker.cache.*;// template loaders live in this package...FileTemplateLoader ftl1 =newFileTemplateLoader(newFile("/tmp/templates"));FileTemplateLoader ftl2 =newFileTemplateLoader(newFile("/usr/data/templates"));ClassTemplateLoader ctl =newClassTemplateLoader(getClass(),"");TemplateLoader[] loaders =newTemplateLoader[]{ ftl1, ftl2, ctl };MultiTemplateLoader mtl =newMultiTemplateLoader(loaders); cfg.setTemplateLoader(mtl);

FreeMarker 将会首先在路径/tmp/templates中搜索模版文件,如果没有找到那么回到路径/usr/data/templates中搜索,如果还没有找到,那么则会尝试用class-loader的方式加载。

从其他资源中获取模版文件

如果在这些内建的模版加载器中没有一个符合你的要求,那么你可以自己定制一个模版加载器,只需要实现freemarker.cache.TemplateLoader 接口就可以了,然后通过方法setTemplateLoader(TemplateLoader loader)把其传递给Configuration对象。

缓存模版

FreeMarker缓存模版的意思就是,当你通过getTemplate方法获取一个模版的时候,FreeMarker不仅会返回一个Template对象,而且会缓存该对象,当你下一次以相同的路径请求模版的时候,它就会返回缓存中的模版对象。如果你改变了模版文件,那么当你下一次获取模版的时候,FreeMarker会自动重新加载,重新解析模版。虽然如此,但是如果直接判断一个文件是否修改过是一个耗时的操作,那么FreeMarker 在Configuration 对象级别提供了一个配置参数“update delay”。该参数的意思是FreeMarker多长时间去判断一次模版的版本,默认设置是5秒钟,也就是每个5秒就会判断模版是否经过修改,如果你想实时的判断,那么设置该参数为0。另外一点需要注意,并不是所有的加载器都支持这种判断方式,举例来说基于class-loader 的模版加载器就不会发现你修改过模版文件。

对于删除缓存中的模版FreeMarker 是这么做的,你可以使用Configuration 对象方法clearTemplateCache 以手工的方式清楚缓存中的模版对象。而实际上缓存部分可以作为一个组建加入到FreeMarker 中(也就是它可以使用第三方缓存方案)你可以通过设置cache_storage 这个参数来实现。对大多数开发者来FreeMarker 自带的freemarker.cache.MruCacheStorage 实现已经足够了。这个缓存使用2 个级别的Most Recently Used(最近最多用)策略。在第一个级别,所有的缓存条目都是使用强引用(strongly referenced:条目并不会被JVM 所清楚,与其相对的弱引用softly reference)直到达到最大时间,那些最近最少使用的条目就会被迁移到二级缓存。在这个级别条目都是使用弱引用直到达到过期。若引用与强引用的区域的大小是可以在构造函数中设置的,例如你想把强引用区域设置为20,弱引用区域设置为250,那你可以使用以下代码:

cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20,250))

由于MruCacheStorage 是默认的缓存实现,那么你也可以这样设置:

cfg.setSetting(Configuration.CACHE_STORAGE_KEY,"strong:20, soft:250");

当你创建一个新的Configuration时,其默认使用MruCacheStorage缓存实现且默认的值maxStrongSize等于0,maxSoftSize等于Integer.MAX_VALUE(也就是理论最大值)。但是对于高负荷的系统来说,我们建议maxStrongSize 设置成一个非0 的数值,不然会导致频繁的重新加载,重新解析模版。

异常处理

可能产生的异常

FreeMarker 产生的异常一般可归以下几类:

FreeMarker 初始化阶段产生的异常: 通常在你的应用中仅需要初始化FreeMarker 一次,而当在这个时间段类产生的异常就叫做初始化异常。

加载解析模版期的异常:当你通过Configuration.getTemplate()方法获取模版的时候(如果模版之前没有被缓存),将会产生两类异常:

  • IOException:由于模版没有找到,或在读取模版的时候发生其他的IO异常,比如你没有读取该文件的权限等等;
  • freemarker.core.ParseException 由于模版文件的语法使用不正确;

执行期间的异常:当你调用Template.process(…)方法的时候,会抛出两类异常:

  • IOException 往输出写数据时候发生的错误;
  • freemarker.template.TemplatException其他运行期产生的异常,比如一个最常见的错误就是模版引用了一个不存在的变量;
分享到:
评论

相关推荐

    使用freemarker生成word文档,源代码+jar包+说明文档及注意事项

    //创建配置实例 Configuration configuration = new Configuration(); //设置编码 configuration.setDefaultEncoding("UTF-8"); //ftl模板文件统一放至 com.lun.template 包下面 configuration....

    freemarker总结

    JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: &lt;#if condition&gt;... &lt;#elseif condition&gt;... &lt;#elseif condition&gt;......

    Freemarker使用手册、api、中文版教程

    三、配置(Configuration)........................................... 15 3.1、基础....................................................................................... 15 3.2、共享变量................

    eclipse或myeclipse FreeMarker插件

    freemarker-2.3.15.jar 版本eclipse FreeMarker插件,已配置好MANIFEST.MF,mycelipse配置D:\Program Files\Genuitec\MyEclipse 8.5 M1\configuration\org.eclipse.equinox.simpleconfigurator目录下bundles.info...

    freemark插件

    2.进入configuration\org.eclipse.equinox.simpleconfigurator文件夹,在bundles.info文件后面添加hudson.freemarker_ide,0.9.14,plugins/hudson.freemarker_ide_0.9.14/,4,false; 3.启动eclipse,打开window-&gt;...

    Struts课堂笔记.rar--struts2的struts.properties配置文件详解

    The org.apache.struts2.config.Configuration implementation class org.apache.struts2.config.Configuration接口名 struts.configuration.files A list of configuration files automatically loaded by ...

    frame_smh:基于Maven、springMVC、Hibernate、FreeMarker注解的敏捷型快速开发框架,深度贯彻COC(Convention Over Configuration)约定优于配置思想,具有类似于Ruby on Rails的架构风格和开发效率,遵循LGPL开源协议

    基于Maven、springMVC、Hibernate、FreeMarker注解的敏捷型快速开发框架,深度贯彻COC(Convention Over Configuration)约定优于配置思想,具有类似于Ruby on Rails的架构风格和开发效率,遵循LGPL开源协议。

    Freemarker教程_中文版.pdf

    三、配置(Configuration)...........................................15 3.1、基础.......................................................................................15 3.2、共享变量....................

    本科毕业设计,基于Java-web开发的内容管理系统(java cms),使用SpringBoot、vue、MyBatis等技术

    简化了Spring配置,提供自动配置auto-configuration功能。 Spring MVC:MVC框架,使用方便,Bug较少。 Spring Security:安全组件。 Mybatis:持久化框架。 FreeMarker:网站模板组件。 Lucene:全文检索组件。 前端...

    springboot学习思维笔记.xmind

    @Configuration声明当前类是一个配置类 @Bean注解在方法上,声明当前方法的返回值为一个Bean AOP @Aspect 声明是一个切面 拦截规则@After @Before @Around PointCut JoinPoint Spring...

    covito-coder:通用可配置模板的代码生成器(GUI)

    Covito-coder这是一个使用 Freemarker 和 Velocity 模板来生代码的工具。本生成器只是将数据库中的表结构数据提取出来,然后将这份结构模型提交给模板引擎, 根据你自定义的模板生成你需要的代码。##配置文件 &lt;?...

    Struts2的工作原理和流程

    5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 6 ActionProxy创建一个ActionInvocation的实例。 7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到...

    struts2开发文档

    5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要 调用的Action类 6 ActionProxy创建一个ActionInvocation的实例。 7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉 及...

    Struts2属性文件详解

    如果需要实现自己的配置管理器,开发者则可以实现一个实现Configuration接口的类,该类可以自己加载Struts 2配置文件. struts.locale 指定Web应用的默认Locale. struts.i18n.encoding 指定Web应用的默认编码集.该...

    spring-boot很多实例

    包括'chapter-2-spring-boot-quick-start','chapter-4-spring-boot-validating-form-input','chapter-5-spring-boot-paging-sorting','doc','springboot-configuration','springboot-dubbo-client','springboot-...

    Struts2\constant应用

    该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。 该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml,看到该属性...

    springboot参考指南

    定位auto-configuration候选者 iii. 36.3. Condition注解 i. 36.3.1. Class条件 ii. 36.3.2. Bean条件 iii. 36.3.3. Property条件 iv. 36.3.4. Resource条件 v. 36.3.5. Web Application条件 vi. 36.3.6. SpEL...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 ...

    最新Struts2+jq+ajax+json 学会总要4步‵‵超级简单,里面包含实例

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"&gt; 包名自定义 " extends="json-default(一定要的)" namespace=""&gt; (action名)" class=...

Global site tag (gtag.js) - Google Analytics