全面探索FreeMarker模版引擎的扩展性_第1页
全面探索FreeMarker模版引擎的扩展性_第2页
全面探索FreeMarker模版引擎的扩展性_第3页
全面探索FreeMarker模版引擎的扩展性_第4页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本文全面介绍了在Java语言中功能十分强大的模版引擎 FreeMarker ,以及对FreeMarker的可扩展性进行了全面探索。FreeMarker模版引擎简介FreeMarker是一个采用Java开发的模版引擎,是一个基于模版生成文本的通用工具。FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序。虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,并通过模板显示准备的数据(如下图)。图 1.FreeMarker工作原理FreeMarker非常简单,只需要一个Freemarker.jar文件(无需

2、任何配置文件)即可包含所有的功能。但 FreeMarker的功能却是非常的强大,相比较另外一个非常著名的Java模版引擎Velocity来说, FreeMarker的功能让您惊叹,但其学习的曲线也较Velocity要长很多。本文主要介绍如何利用FreeMarker强大的可扩展性来输出各种文本信息,这不是FreeMarker的入门学习材料,如果您尚未对FreeMarker有所了解,或者还没有使用过FreeMarker的话,那不妨先上手后再来阅读本文。FreeMarker主要提供了如下几个方面的扩展性功能:1. 自定义宏2. 自定义函数3. 自定义模版文件加载器4. 缓存处理5. 异常处理Free

3、Marker自定义宏FreeMarker和 Velocity都提供可自定义宏的功能,但FreeMarker的宏功能更加强大,包括允许通过名称和参数的位置进行参数传递;允许设置参数的默认值;支持宏的嵌套;宏可以先使用再声明;支持命名空间等。下面我们针对这些功能给出一个简单但是完整的演示例子,先看看代码:清单1.宏定义文件(html.ftl)<#macro html title charset="utf-8" lang="zh-CN"><html><head><meta http-equiv="Conten

4、t-Type" content="text/html; charset=$charset" /><meta http-equiv="Content-Language" content="$lang"/><title>$title</title></head><body><#nested></body></html></#macro>在这个宏定义文件中,我们声明了一个名为面的框架。它具有三个参数分别是titleht

5、ml、charset的宏,该宏是为了生成一个和 lang,其中charsetHTML页和 lang分别指定了默认的值。再来看看如何调用该宏:清单2.调用宏<#include "html.ftl"><html title="FreeMarker宏测试 ">欢迎使用 FreeMarker模版引擎</html>在 FreeMarker中,用户自定义的宏必须以 开头来调用,并传入页面标题title的参数。而<html>标签中包含的文本“欢迎使用FreeMarker模版引擎 ”将替换宏定义中的<#nested&

6、gt;标签。因此这个模版将会生成如下的HTML信息:清单3.模版生成结果<html><head><meta http-equiv="Content-Type"content="text/html;charset=utf-8"/><meta http-equiv="Content-Language" content="zh-CN"/><title>FreeMarker宏测试</title></head><body>欢迎使用

7、 FreeMarker模版引擎</body></html>而Velocity本身并不提供嵌套模版的功能,它必须依赖Velocity-Tools这个项目来实现。另外对于一些需要实现更复杂逻辑的宏,还可以通过Java类来进行定义。FreeMarker提供了一个TemplateDirectiveModel接口,通过实现该接口可以实现自定义宏的功能,这样可以更好的跟应用逻辑进行集成,不过需要注意的是暂不支持通过参数的位置来调用宏,调用时必须指定参数名,该问题将在FreeMarker2.4中得以解决。下面是一个简单的例子:清单4.自定义宏功能的例子/* 将标签中的代码全部转为大写

8、并输出* author Winter Lau (javayou)* 使用方法:*/public class UpperDirective implements TemplateDirectiveModel public void execute(Environment env,Map params, TemplateModel loopVars,TemplateDirectiveBody body)throws TemplateException, IOException / Check if no parameters were given: if (!params.isEmpty() th

9、row new TemplateModelException("This directive doesn't allow parameters.");if (loopVars.length != 0) throw new TemplateModelException("This directive doesn't allow loop variables.");/ If there is non-empty nested content:if (body != null) / Executes the nested body. Samea

10、s <#nested> in FTL, except / that we use our own writer instead of the current outputwriter.body.render(new UpperCaseFilterWriter(env.getOut(); else throw new RuntimeException("missing body");/*A link Writerthattransformsthe characterstream to upper case* and forwards it to another l

11、ink Writer.*/private static class UpperCaseFilterWriter extends Writer private final Writer out;UpperCaseFilterWriter (Writer out) this.out = out;public void write(char cbuf, int off, int len)throws IOException char transformedCbuf = new charlen;for (int i = 0; i < len; i+) transformedCbufi = Cha

12、racter.toUpperCase(cbufi +off);out.write(transformedCbuf);public void flush() throws IOException out.flush();public void close() throws IOException out.close();接下来我们需要重载FreemarkerServlet,植入该指令扩展,代码如下:清单5.重载FreemarkerServletOverrideprotected Configuration createConfiguration() Configuration cfg = sup

13、er.createConfiguration(); cfg.setSharedVariable("upper", new UpperDirective(); return cfg;在页面模版中使用试试吧。FreeMarker自定义函数与宏不同,宏一般用来执行某个过程,而函数可以定义返回值,例如对一组数据求和、平均值、最大值、最小值等等运算。FreeMarker的函数支持可变个数的参数。例如下面定义了一个求平均值的函数:清单6.求平均值的函数例子<#function avg nums.><#local sum = 0><#list nums as

14、 num><#local sum = sum + num></#list><#if nums?size != 0><#return sum / nums?size></#if></#function>其中函数名为avg,支持可变个数的参数nums。可用下面的代码来要调用该函数:$avg(3,5,100,3453)跟宏相同, FreeMarker也可以用Java来编写自定义函数。例如我们用Java代码来生成一个随机的整数,其代码如下:清单7.使用Java编写的自定义函数/* 生成一个随机的整数* author Wint

15、er Lau (javayou)*/public class RandomFunction implements TemplateMethodModel final static Random rnd_seed = newRandom(System.currentTimeMillis();/* (non-Javadoc)* see*/SuppressWarnings("unchecked")public Object exec(List args) throws TemplateModelException returnrnd_seed.nextInt(Integer.pa

16、rseInt(String)args.get(0);同样的,需要将该函数的定义植入FreeMarker:cfg.setSharedVariable("rand",newRandomFunction();使用方法: $rand(1000)。FreeMarker自定义模版文件加载器模版文件加载器用来告诉FreeMarker引擎到什么地方去加载模版文件。FreeMarker自带了三种文件加载器,分别是:文件目录加载器、类路径加载器以及Web上下文加载器。当在Web环境中使用FreemarkerServlet来加载模版文件时,默认使用第三种加载器,并通过Servlet的配置Temp

17、latePath来指定模版文件所存放的路径,该路径是相对于Web的根目录的。在某种情况下, 我们可能会希望把模版文件的源码进行加密处理,例如我们使用DES加密方式将模版源文件加密后进行存储,然后我们通过自行实现一个加密的模版文件加载器来读取这些模版文件,解密后交给FreeMarker引擎解释执行并得到执行的结果。FreeMarker为模版文件加载器定义了一个统一的接口TemplateLoader,该接口有以下四个方法:closeTemplateSource关闭模版资源findTemplateSource根据名称返回指定的模版资源getLastModified返回模版资源最后一次修改的时间get

18、Reader返回读取模版资源的Reader为了简单起见,我们可以在FreeMarker自带的加载器上进行扩展,重写getReader方法对读取到的模版文件内容进行解密后生成一个新的Reader实例并返回(详细过程不再叙述)。FreeMarker自带的几个TemplateLoader分别是:1.ClassTemplateLoader:基于类路径的模版加载器2.FileTemplateLoader:基于文件目录的模版加载器3.MultiTemplateLoader:多种加载器的混合4.StringTemplateLoader:基于字符串的模版加载器5. URLTemplateLoader:基于UR

19、L的模版加载器6. WebappTemplateLoader:基于Web上下文的模版加载器重载模版加载器后通过下面代码使之生效:cfg.setTemplateLoader(loader)FreeMarker缓存处理FreeMarker的缓存处理主要用于模版文件的缓存,一般来讲,模版文件改动不会很频繁,在一个流量非常大的网站中,如果频繁的读取模版文件对系统的负担还是很重的,因此FreeMarker通过将模版文件的内容进行缓存,来降低模版文件读取的频次,降低系统的负载。当处理某个模版时,FreeMarker直接从缓存中返回对应的Template对象,并有一个默认的机制来保证该模版对象是跟模版文件同

20、步的。如果使用的时候FreemarkerServlet时,有一个配置项template_update_delay用来指定更新模版文件的间隔时间,相当于多长时间检测一下是否有必要重新加载模版文件,0表示每次都重新加载,否则为多少毫秒钟检测一下模版是否更改。FreeMarker定义了一个统一的缓存处理接口CacheStorage,默认的实现是MruCacheStorage最近最少使用的缓存策略。一般情况下,很少需要对缓存进行扩展处理。您可以通过下面的代码指定最大缓存的模版数:其中第一个参数是最大的强引用对象数,第二个为最大的弱引用对象数。这两个值FreeMarker默认的是0和 Integer.M

21、AX_VALUE,表明模版缓存数是无限的。FreeMarker异常处理当使用FreeMarker做为模版引擎的时候,可能发生的异常包括:配置异常 :配置异常指的是FreeMarker初始化时发生的异常,例如错误的配置导致,该异常时由FreeMarker的 API抛出来的。模版加载异常:模版加载异常可能是模版不存在或者没有读权限,或者是解析模版时发生错误,例如模版语法错误等。模版执行异常:模版执行异常是指模版已经成功的加载但在执行过程中由于代码执行错误所抛出的异常,这类异常一般都是用户的代码导致。正常情况下,前两种异常会在开发过程中就会发现并得以解决,而第三种异常往往跟实际的运行环境和数据有关,例如由于某些数据不存在导致的空指针异常等等。因此第三种异常才是我们真正需要关心以及监控的。为此, FreeMarker定义了一个统一的异常处理接口TemplateExceptionHandler。该接口只有一个方法如下:void handleTemplateException(TemplateException te,Environ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论