随笔-67  评论-522  文章-0  trackbacks-0
    这是本系列的最后一篇,主要讲一下FreeMarker模板引擎的基本概念与常用指令的使用方式。
    一、FreemMarker基本概念
    FreemMarker是一个用Java语言编写的模板引擎,它是一个基于模板来生成文本输出的一个工具。是除了JSP之外被使用得最多的页面模板技术之一,另一个比较有名的模板则是Velocity
    用户可以使用FreeMarker来生成所需要的内容,通常由Java提供数据模型,FreeMarker通过模板引擎渲染数据模型,这样最终得到我们想要的内容。使用FreeMarker作为展示层,访问速度会比较快,因为FreeMarker引擎渲染页面的时候,只需要把数据填充进去就可以了,其它的都是固定的模板内容。另外,使用FreeMarker能够很方便的动态生成静态页面,对于大访问量的网站,配合nginx可以很好的提高网站性能。
    ssm3这个例子中,就是使用的FreeMarker模板技术来实现的视图层。本文主要是对ssm3例子中所使用到的FreeMarker知识点进行介绍,其它更详细的内容还请大家参考官方文档。
    在本文的最后有ssm3源码,有需要的朋友可以自行下载,例子是最基本的,方便入门的朋友学习与了解。
    二、FreemMarker配置说明
    Spring 3.0框架中,已经集成好了FreeMarker,对它进行了适度的封装,我们使用起来非常方便。要使用FreemMarker模板的功能,只需要进行下面两项配置。
    aFreemMarker视图解析器
    
    当我们发出REST请求访问资源时,当Controller执行完毕,需要返回结果给我们时,那些返回字符串指定的都是结果页面,这时,就通过上面这个解析器,根据返回的那些字符串解析成我们设计的页面。另外,如果要使用Spring提供的FreeMarker宏,还需要加上exposeSpringMacroHelpers这个属性,将它设为true,你可以将这些宏理解为一种功能,或一个方法。
    bFreemMarker环境配置
    
    上面这段配置设置了FreeMarker环境属性,templateLoaderPath指定模板文件存放的路径,它相当于是定义了模板的前缀,所有显示的页面都遵循这个路径规则。还指定了模板文件的编码格式,如果不显示配置,否则会采用系统默认编码,这很容易出现乱码的情况,所以一定要将编码统一设置,不要再使用gb2312gbk之类的编码方式了,采用国际统一的Unicode UTF-8编码是比较好的习惯。
    除了上面我们看到的这些配置设置外,FreeMarkerConfigurer还有一个很重要的属性是freemarkerVariables,它可以用来设置我们自己开发的自定义指令标签,以满足不同的业务需求。
    三、FreemMarker指令标记
    要想在最终结果页面中填充数据,需要用到FreeMarker标记指令来达到这一目的。不过这些标记指令一般不会单独出现,基本上是多个组合使用,为了让大家方便理解,大象就以ssm3中的一些页面为例子进行说明。
    FreeMarker有两种类型:预定义指令和用户自定义指令。预定义指令是以#号开头,用户自定义的指令则使用@开头。而SpringFreeMarker宏也是以@开头。
    
    指令assign表示定义一个变量,它的格式是<#assign name=value>,在这里ctx是变量名namevalue可以是一个值,也可以是一个表达式。还记得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>开始循环遍历,listmodel里面定义的属性名称,aslist循环定义变量的语法,entitylist循环变量的名称。${...}它和JSTL里的同一个表达式含义相同。FreeMarker都是在输出时,用实际值替换。
    源码下载:ssm3     
    本文为菠萝大象原创,如要转载请注明出处。
http://bolo.blogjava.net/
posted on 2012-04-23 08:38 菠萝大象 阅读(9845) 评论(7)  编辑  收藏 所属分类: Spring3

评论:
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五) 2012-04-24 21:55 | 菠萝大象
有朋友问我怎么没有数据库,这个和之前的SSH2例子用的是同一个数据库,请到SSH2第五篇下载示例源码。  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五) 2012-06-06 21:44 | bj
源码确实不错,收益匪浅!
有几处问题:1)角色的修改,中文无法正常保存;
2)user表的建表语句和代码不符;
3)角色的新增报错,估计源自role表的id不是自增长的;
4)用户的查询不起作用。
  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五) 2012-06-07 08:54 | 菠萝大象
@bj
你提的问题我看了下。
1,中文是没问题的,可能是你的mysql的设置,我之前写过一篇mysql的中文问题解决方法的文章,你可以看下。
2,我确实加了一个password字段,这点我没注意,谢谢指正。这个password我愿意是准备加上拦截器功能的。
3,SSH2里面有个主键管理表,所以role表没加自增长,这里需要,也是我的错,没指出来,谢谢批评。
4,查询是可以的,你的user表里有数据么?
我附上两个表的sql语句

CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(20) default NULL,
`password` varchar(20) default NULL,
`role_id` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `role` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五) 2012-06-18 17:36 | 世纪末海
话说,在本机用jetty:run跑是正常的显示hello.html,为什么用maven install打包以后放在tomcat下的主页是index.html...servlet-context.xml下的<mvc:view-controller path="/" view-name="forward:/hello" />
没起作用  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五) 2012-06-19 09:25 | 菠萝大象
@世纪末海
你说的问题我看了下,是我疏忽了,这应该是jetty和tomcat内部机制不同导致的,我测试的jetty是6.1.26,tomcat是7.0.23,我想了个折中的解决办法,可以把index.html改成index.jsp,里面的内容换成<%request.getRequestDispatcher("hello").forward(request,response);%>,输入http:localhost:8080/ssm3 就可以访问了。  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五) 2012-08-17 23:45 | 老北
新注册了个帐号,就为了一句评论~
入门经典,值得一看,谢谢分享,继续加油  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五) 2012-10-08 15:31 | 伍叶春
谢谢分享 受教了  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: