Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五)

  这是本系列的最后一篇,主要讲一下 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      
    
本文为菠萝大象原创,如要转载请注明出处。
http://bolo.blogjava.net/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值