这是本系列的最后一篇,主要讲一下
FreeMarker
模板引擎的基本概念与常用指令的使用方式。
一、 FreemMarker 基本概念
FreemMarker 是一个用 Java 语言编写的模板引擎,它是一个基于模板来生成文本输出的一个工具。是除了 JSP 之外被使用得最多的页面模板技术之一,另一个比较有名的模板则是 Velocity 。
用户可以使用 FreeMarker 来生成所需要的内容,通常由 Java 提供数据模型, FreeMarker 通过模板引擎渲染数据模型,这样最终得到我们想要的内容。使用 FreeMarker 作为展示层,访问速度会比较快,因为 FreeMarker 引擎渲染页面的时候,只需要把数据填充进去就可以了,其它的都是固定的模板内容。另外,使用 FreeMarker 能够很方便的动态生成静态页面,对于大访问量的网站,配合 nginx 可以很好的提高网站性能。
在 ssm3 这个例子中,就是使用的 FreeMarker 模板技术来实现的视图层。本文主要是对 ssm3 例子中所使用到的 FreeMarker 知识点进行介绍,其它更详细的内容还请大家参考官方文档。
在本文的最后有 ssm3 源码,有需要的朋友可以自行下载,例子是最基本的,方便入门的朋友学习与了解。
二、 FreemMarker 配置说明
在 Spring 3.0 框架中,已经集成好了 FreeMarker ,对它进行了适度的封装,我们使用起来非常方便。要使用 FreemMarker 模板的功能,只需要进行下面两项配置。
a 、 FreemMarker 视图解析器
当我们发出 REST 请求访问资源时,当 Controller 执行完毕,需要返回结果给我们时,那些返回字符串指定的都是结果页面,这时,就通过上面这个解析器,根据返回的那些字符串解析成我们设计的页面。另外,如果要使用 Spring 提供的 FreeMarker 宏,还需要加上 exposeSpringMacroHelpers 这个属性,将它设为 true ,你可以将这些宏理解为一种功能,或一个方法。
b 、 FreemMarker 环境配置
上面这段配置设置了 FreeMarker 环境属性, templateLoaderPath 指定模板文件存放的路径,它相当于是定义了模板的前缀,所有显示的页面都遵循这个路径规则。还指定了模板文件的编码格式,如果不显示配置,否则会采用系统默认编码,这很容易出现乱码的情况,所以一定要将编码统一设置,不要再使用 gb2312 或 gbk 之类的编码方式了,采用国际统一的 Unicode UTF-8 编码是比较好的习惯。
除了上面我们看到的这些配置设置外, FreeMarkerConfigurer 还有一个很重要的属性是 freemarkerVariables ,它可以用来设置我们自己开发的自定义指令标签,以满足不同的业务需求。
三、 FreemMarker 指令标记
要想在最终结果页面中填充数据,需要用到 FreeMarker 标记指令来达到这一目的。不过这些标记指令一般不会单独出现,基本上是多个组合使用,为了让大家方便理解,大象就以 ssm3 中的一些页面为例子进行说明。
FreeMarker 有两种类型:预定义指令和用户自定义指令。预定义指令是以 # 号开头,用户自定义的指令则使用 @ 开头。而 Spring 的 FreeMarker 宏也是以 @ 开头。
指令 assign 表示定义一个变量,它的格式是 <#assign name=value> ,在这里 ctx 是变量名 name , value 可以是一个值,也可以是一个表达式。还记得 FreeMarker 解析器中我们设置的 requestContextAttribute 属性为 rc 吧,我们现在就是用它来获得我们应用上下文,我们的应用名为 ssm3 ,所以这里就是取得这个值,将它赋给 ctx ,上面这些都写在 meta.html 这个模板页面中,这样我们就可以在所有模板页中引用这个变量。
在表达式中,使用了一个 ! 符号,它的作用是如果 rc.getContextPath() 为 null 或不存在,就将字符串 ”/ssm3” 作为默认值赋给变量 ctx 。这样,即使万一因为某些原因无法取得上下文值,我们的 ctx 变量也不会因此而出现空值或不正确的值,从而引起系统异常。
在使用 FreeMarker 时,一定要注意一点, FreeMarker 绝不允许引用不存在的变量(即变量为 null ),除非明确地告诉它当变量不存在( null )时如何处理。
上面这一点非常重要,往往很多时候 Bug 就出在空值未处理上面,请大家使用 FreeMarker 的时候一定要多加注意。
指令 include 载入模板页,可以使用它在一个模板中插入另外一个 FreeMarker 模板文件。
<#if> 条件判断指令, list?? 是否为空判断,如果 list 不为 null 才会往下执行。 ?? 一般都与 if 指令一起执行。
<#list list as entity> 开始循环遍历, list 是 model 里面定义的属性名称, as 是 list 循环定义变量的语法, entity 是 list 循环变量的名称。 ${...} 它和 JSTL 里的同一个表达式含义相同。 FreeMarker 都是在输出时,用实际值替换。
源码下载: ssm3
一、 FreemMarker 基本概念
FreemMarker 是一个用 Java 语言编写的模板引擎,它是一个基于模板来生成文本输出的一个工具。是除了 JSP 之外被使用得最多的页面模板技术之一,另一个比较有名的模板则是 Velocity 。
用户可以使用 FreeMarker 来生成所需要的内容,通常由 Java 提供数据模型, FreeMarker 通过模板引擎渲染数据模型,这样最终得到我们想要的内容。使用 FreeMarker 作为展示层,访问速度会比较快,因为 FreeMarker 引擎渲染页面的时候,只需要把数据填充进去就可以了,其它的都是固定的模板内容。另外,使用 FreeMarker 能够很方便的动态生成静态页面,对于大访问量的网站,配合 nginx 可以很好的提高网站性能。
在 ssm3 这个例子中,就是使用的 FreeMarker 模板技术来实现的视图层。本文主要是对 ssm3 例子中所使用到的 FreeMarker 知识点进行介绍,其它更详细的内容还请大家参考官方文档。
在本文的最后有 ssm3 源码,有需要的朋友可以自行下载,例子是最基本的,方便入门的朋友学习与了解。
二、 FreemMarker 配置说明
在 Spring 3.0 框架中,已经集成好了 FreeMarker ,对它进行了适度的封装,我们使用起来非常方便。要使用 FreemMarker 模板的功能,只需要进行下面两项配置。
a 、 FreemMarker 视图解析器
当我们发出 REST 请求访问资源时,当 Controller 执行完毕,需要返回结果给我们时,那些返回字符串指定的都是结果页面,这时,就通过上面这个解析器,根据返回的那些字符串解析成我们设计的页面。另外,如果要使用 Spring 提供的 FreeMarker 宏,还需要加上 exposeSpringMacroHelpers 这个属性,将它设为 true ,你可以将这些宏理解为一种功能,或一个方法。
b 、 FreemMarker 环境配置
上面这段配置设置了 FreeMarker 环境属性, templateLoaderPath 指定模板文件存放的路径,它相当于是定义了模板的前缀,所有显示的页面都遵循这个路径规则。还指定了模板文件的编码格式,如果不显示配置,否则会采用系统默认编码,这很容易出现乱码的情况,所以一定要将编码统一设置,不要再使用 gb2312 或 gbk 之类的编码方式了,采用国际统一的 Unicode UTF-8 编码是比较好的习惯。
除了上面我们看到的这些配置设置外, FreeMarkerConfigurer 还有一个很重要的属性是 freemarkerVariables ,它可以用来设置我们自己开发的自定义指令标签,以满足不同的业务需求。
三、 FreemMarker 指令标记
要想在最终结果页面中填充数据,需要用到 FreeMarker 标记指令来达到这一目的。不过这些标记指令一般不会单独出现,基本上是多个组合使用,为了让大家方便理解,大象就以 ssm3 中的一些页面为例子进行说明。
FreeMarker 有两种类型:预定义指令和用户自定义指令。预定义指令是以 # 号开头,用户自定义的指令则使用 @ 开头。而 Spring 的 FreeMarker 宏也是以 @ 开头。
指令 assign 表示定义一个变量,它的格式是 <#assign name=value> ,在这里 ctx 是变量名 name , value 可以是一个值,也可以是一个表达式。还记得 FreeMarker 解析器中我们设置的 requestContextAttribute 属性为 rc 吧,我们现在就是用它来获得我们应用上下文,我们的应用名为 ssm3 ,所以这里就是取得这个值,将它赋给 ctx ,上面这些都写在 meta.html 这个模板页面中,这样我们就可以在所有模板页中引用这个变量。
在表达式中,使用了一个 ! 符号,它的作用是如果 rc.getContextPath() 为 null 或不存在,就将字符串 ”/ssm3” 作为默认值赋给变量 ctx 。这样,即使万一因为某些原因无法取得上下文值,我们的 ctx 变量也不会因此而出现空值或不正确的值,从而引起系统异常。
在使用 FreeMarker 时,一定要注意一点, FreeMarker 绝不允许引用不存在的变量(即变量为 null ),除非明确地告诉它当变量不存在( null )时如何处理。
上面这一点非常重要,往往很多时候 Bug 就出在空值未处理上面,请大家使用 FreeMarker 的时候一定要多加注意。
指令 include 载入模板页,可以使用它在一个模板中插入另外一个 FreeMarker 模板文件。
<#if> 条件判断指令, list?? 是否为空判断,如果 list 不为 null 才会往下执行。 ?? 一般都与 if 指令一起执行。
<#list list as entity> 开始循环遍历, list 是 model 里面定义的属性名称, as 是 list 循环定义变量的语法, entity 是 list 循环变量的名称。 ${...} 它和 JSTL 里的同一个表达式含义相同。 FreeMarker 都是在输出时,用实际值替换。
源码下载: ssm3