全面探索 FreeMarker 模版引擎的扩展性Word文档下载推荐.docx
- 文档编号:21783662
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:25.98KB
全面探索 FreeMarker 模版引擎的扩展性Word文档下载推荐.docx
《全面探索 FreeMarker 模版引擎的扩展性Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《全面探索 FreeMarker 模版引擎的扩展性Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
#macrohtmltitlecharset="
utf-8"
lang="
zh-CN"
>
<
html>
head>
metahttp-equiv="
Content-Type"
content="
text/html;
charset=${charset}"
/>
Content-Language"
${lang}"
/>
title>
${title}<
/title>
/head>
body>
#nested>
/body>
/html>
/#macro>
在这个宏定义文件中,我们声明了一个名为html的宏,该宏是为了生成一个HTML页面的框架。
它具有三个参数分别是title、charset和lang,其中charset和lang分别指定了默认的值。
再来看看如何调用该宏:
清单2.调用宏
#include"
html.ftl"
@htmltitle="
FreeMarker宏测试"
欢迎使用FreeMarker模版引擎
/@html>
在FreeMarker中,用户自定义的宏必须以@开头来调用,并传入页面标题title的参数。
而<
@html>
标签中包含的文本“欢迎使用FreeMarker模版引擎”将替换宏定义中的<
标签。
因此这个模版将会生成如下的HTML信息:
清单3.模版生成结果
charset=utf-8"
FreeMarker宏测试<
而Velocity本身并不提供嵌套模版的功能,它必须依赖Velocity-Tools这个项目来实现。
另外对于一些需要实现更复杂逻辑的宏,还可以通过Java类来进行定义。
FreeMarker提供了一个TemplateDirectiveModel接口,通过实现该接口可以实现自定义宏的功能,这样可以更好的跟应用逻辑进行集成,不过需要注意的是暂不支持通过参数的位置来调用宏,调用时必须指定参数名,该问题将在FreeMarker2.4中得以解决。
下面是一个简单的例子:
清单4.自定义宏功能的例子
/**
*将标签中的代码全部转为大写并输出
*@authorWinterLau(javayou@)
*使用方法:
*<
@upper>
Welcometo<
/@upper>
*/
publicclassUpperDirectiveimplementsTemplateDirectiveModel{
publicvoidexecute(Environmentenv,
Mapparams,TemplateModel[]loopVars,
TemplateDirectiveBodybody)
throwsTemplateException,IOException{
//Checkifnoparametersweregiven:
if(!
params.isEmpty()){
thrownewTemplateModelException(
"
Thisdirectivedoesn'
tallowparameters."
);
}
if(loopVars.length!
=0){
tallowloopvariables."
//Ifthereisnon-emptynestedcontent:
if(body!
=null){
//Executesthenestedbody.Sameas<
inFTL,except
//thatweuseourownwriterinsteadofthecurrentoutputwriter.
body.render(newUpperCaseFilterWriter(env.getOut()));
}else{
thrownewRuntimeException("
missingbody"
/**
*A{@linkWriter}thattransformsthecharacterstreamtouppercase
*andforwardsittoanother{@linkWriter}.
*/
privatestaticclassUpperCaseFilterWriterextendsWriter{
privatefinalWriterout;
UpperCaseFilterWriter(Writerout){
this.out=out;
publicvoidwrite(char[]cbuf,intoff,intlen)
throwsIOException{
char[]transformedCbuf=newchar[len];
for(inti=0;
i<
len;
i++){
transformedCbuf[i]=Character.toUpperCase(cbuf[i+off]);
out.write(transformedCbuf);
publicvoidflush()throwsIOException{
out.flush();
publicvoidclose()throwsIOException{
out.close();
}
接下来我们需要重载FreemarkerServlet,植入该指令扩展,代码如下:
清单5.重载FreemarkerServlet
@Override
protectedConfigurationcreateConfiguration(){
Configurationcfg=super.createConfiguration();
cfg.setSharedVariable("
upper"
newUpperDirective());
returncfg;
在页面模版中使用<
试试吧。
FreeMarker自定义函数
与宏不同,宏一般用来执行某个过程,而函数可以定义返回值,例如对一组数据求和、平均值、最大值、最小值等等运算。
FreeMarker的函数支持可变个数的参数。
例如下面定义了一个求平均值的函数:
清单6.求平均值的函数例子
#functionavgnums...>
#localsum=0>
#listnumsasnum>
#localsum=sum+num>
/#list>
#ifnums?
size!
=0>
#returnsum/nums?
size>
/#if>
/#function>
其中函数名为avg,支持可变个数的参数nums。
可用下面的代码来要调用该函数:
${avg(3,5,100,3453)}
跟宏相同,FreeMarker也可以用Java来编写自定义函数。
例如我们用Java代码来生成一个随机的整数,其代码如下:
清单7.使用Java编写的自定义函数
*生成一个随机的整数
*@url
publicclassRandomFunctionimplementsTemplateMethodModel{
finalstaticRandomrnd_seed=newRandom(System.currentTimeMillis());
/*(non-Javadoc)
*@seefreemarker.template.TemplateMethodModel#exec(java.util.List)
@SuppressWarnings("
unchecked"
)
publicObjectexec(Listargs)throwsTemplateModelException{
returnrnd_seed.nextInt(Integer.parseInt((String)args.get(0)));
同样的,需要将该函数的定义植入FreeMarker:
cfg.setSharedVariable("
rand"
newRandomFunction());
使用方法:
${rand(1000)}。
FreeMarker自定义模版文件加载器
模版文件加载器用来告诉FreeMarker引擎到什么地方去加载模版文件。
FreeMarker自带了三种文件加载器,分别是:
文件目录加载器、类路径加载器以及Web上下文加载器。
当在Web环境中使用FreemarkerServlet来加载模版文件时,默认使用第三种加载器,并通过Servlet的配置TemplatePath来指定模版文件所存放的路径,该路径是相对于Web的根目录的。
在某种情况下,我们可能会希望把模版文件的源码进行加密处理,例如我们使用DES加密方式将模版源文件加密后进行存储,然后我们通过自行实现一个加密的模版文件加载器来读取这些模版文件,解密后交给FreeMarker引擎解释执行并得到执行的结果。
FreeMarker为模版文件加载器定义了一个统一的接口——TemplateLoader,该接口有以下四个方法:
closeTemplateSource
关闭模版资源
findTemplateSource
根据名称返回指定的模版资源
getLastModified
返回模版资源最后一次修改的时间
getReader
返回读取模版资源的Reader
为了简单起见,我们可以在FreeMarker自带的加载器上进行扩展,重写getReader方法对读取到的模版文件内容进行解密后生成一个新的Reader实例并返回(详细过程不再叙述)。
FreeMarker自带的几个TemplateLoader分别是:
1.ClassTemplateLoader:
基于类路径的模版加载器
2.FileTemplateLoader:
基于文件目录的模版加载器
3.MultiTemplateLoader:
多种加载器的混合
4.StringTemplateLoader:
基于字符串的模版加载器
5.URLTemplateLoader:
基于URL的模版加载器
6.WebappTemplateLoader:
基于Web上下文的模版加载器
重载模版加载器后通过下面代码使之生效:
cfg.setTemplateLoader(loader)
FreeMarker缓存处理
FreeMarker的缓存处理主要用于模版文件的缓存,一般来讲,模版文件改动不会很频繁,在一个流量非常大的网站中,如果频繁的读取模版文件对系统的负担还是很重的,因此FreeMarker通过将模版文件的内容进行缓存,来降低模版文件读取的频次,降低系统的负载。
当处理某个模版时,FreeMarker直接从缓存中返回对应的Template对象,并有一个默认的机制来保证该模版对象是跟模版文件同步的。
如果使用的时候FreemarkerServlet时,有一个配置项template_update_delay用来指定更新模版文件的间隔时间,相当于多长时间检测一下是否有必要重新加载模版文件,0表示每次都重新加载,否则为多少毫秒钟检测一下模版是否更改。
FreeMarker定义了一个统一的缓存处理接口CacheStorage,默认的实现是MruCacheStorage最近最少使用的缓存策略。
一般情况下,很少需要对缓存进行扩展处理。
您可以通过下面的代码指定最大缓存的模版数:
cfg.setCacheStorage(newfreemarker.cache.MruCacheStorage(20,250))
其中第一个参数是最大的强引用对象数,第二个为最大的弱引用对象数。
这两个值FreeMarker默认的是0和Integer.MAX_VALUE,表明模版缓存数是无限的。
FreeMarker异常处理
当使用FreeMarker做为模版引擎的时候,可能发生的异常包括:
配置异常:
配置异常指的是FreeMarker初始化时发生的异常,例如错误的配置导致,该异常时由FreeMarker的API抛出来的。
模版加载异常:
模版加载异常可能是模版不存在或者没有读权限,或者是解析模版时发生错误,例如模版语法错误等。
模版执行异常:
模版执行异常是指模版已经成功的加载但在执行过程中由于代码执行错误所抛出的异常,这类异常一般都是用户的代码导致。
正常情况下,前两种异常会在开发过程中就会发现并得以解决,而第三种异常往往跟实际的运行环境和数据有关,例如由于某些数据不存在导致的空指针异常等等。
因此第三种异常才是我们真正需要关心以及监控的。
为此,FreeMarker定义了一个统一的异常处理接口TemplateExceptionHandler。
该接口只有一个方法如下:
voidhandleTemplateException(TemplateExceptionte,
Environmentenv,
java.io.Writerout)
通过调用cfg.setTemplateExceptionHandler来使用自定义的异常处理方法。
下面是一个简单的异常处理扩展的例子:
清单8.异常处理扩展的例子
classMyTemplateExceptionHandlerimplementsTemplateExceptionHandler{
publicvoidhandleTemplateException(TemplateExceptionte,
Environmentenv,java.io.Writerout)
throwsTemplateException{
try{
out.write("
[ERROR:
+te.getMessage()+"
]"
}catch(IOExceptione){
thrownewTemplateException(
Failedtoprinterrormessage.Cause:
+e,env);
...
cfg.setTemplateExceptionHandler(newMyTemplateExceptionHandler());
Eclipse的FreeMarker插件
为了方便编写FreeMarker模版,您可以使用FreeMarkerIDE这个Eclipse插件。
该插件具有语法高亮、错误提示等功能。
虽然该插件还有很多问题,而且已经很久没更新了,但也能很好地使用。
总结
从上面对于FreeMarker的可扩展性的介绍来看,FreeMarker确实是一个功能非常之强大的模版引擎,可以说远在Velocity之上。
不过从使用的直观程度以及上手的时间来看,其复杂度也大大的超过了Velocity。
当我们在面临这两个模版引擎的选择时,不能只是从功能或者容易上手的角度来决定,更应该根据业务本身的需要综合进行比较。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 全面探索 FreeMarker 模版引擎的扩展性 全面 探索 模版 引擎 扩展性
![提示](https://static.bdocx.com/images/bang_tan.gif)