freemarker(一)

what

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具

why

选择freemarker的原因:
  • 1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
  • 2、宏定义比jsp tag方便
  • 3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
  • 4、支持jsp标签
  • 5、可以实现严格的mvc分离

how

请接下来往下面看

FreeMarker模板文件主要由如下4个部分组成:
  • 1,文本:直接输出的部分
  • 2,注释:<#-- ... -->格式部分,不会输出
  • 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出
  • 4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出
例子
<html><br>
<head><br>
<title>Welcome!</title><br>
</head><br>
<body><br>
<#-- 注释部分 --><br>
<#-- 下面使用插值 -->
<h1>Welcome ${user} !</h1><br>
<p>We have these animals:<br>
<u1><br>
<#-- 使用FTL指令 -->
<#list animals as being><br>
   <li>${being.name} for ${being.price} Euros<br>
<#list><br>
<u1><br>
</body><br>
</html>

1.插值规则

FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}

1.1基本输出

  • 输出 ${book.name}
  • 空值判断:${book.name?if_exists },
    ${book.name?default(‘xxx’)} //默认值xxx
    ${ book.name!"xxx"}//默认值xxx
  • 日期格式:${book.date?string('yyyy-MM-dd')}
  • 数字格式:${book?string.number} //20
    ${book?string.currency} //$20.00
    ${book?string.percent} //20%

2.FTL指令规则

在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.

  • 1,开始标签:<#directivename parameter>
  • 2,结束标签:</#directivename>
  • 3,空标签:<#directivename parameter/>

2.1遍历List集合

<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"]  as item>  
${item}  
</#list> 

这里会逐个输出星期几

此外,迭代集合对象时,还包含两个特殊的循环变量:
item_index:当前变量的索引值
item_has_next:是否存在下一个对象
也可以使用<#break>指令跳出迭代

2.2遍历map集合

{"语文":78, "数学":80}
Map对象的key和value都是表达式,但是key必须是字符串

<#list map?keys as key>  
      ${key}=${map[key]}<br />  
</#list>  

2.3逻辑判断

if判断
<#if condition>    ...
<#elseif condition2>    ...
<#elseif condition3>    ......
<#else>    ...    
</#if>

==其中空值判断可以写成==<#if book.name?? >

switch判断
<#switch value>
    <#case refValue1> ...
        <#break>
    <#case refValue2> ...
        <#break>
    <#case refValueN>...
        <#break>
    <#default>        
</#switch>

3.内置函数

常用的内置的字符串函数:

  • html:对字符串进行HTML编码
  • cap_first:使字符串第一个字母大写
  • lower_case:将字符串转换成小写
  • upper_case:将字符串转换成大写
  • trim:去掉字符串前后的空白字符

下面是集合的常用内置函数

  • size:获取序列中元素的个数
  • chunk:分成几个一组
  • xxx_index :计数器

下面是数字值的常用内置函数

  • int:取得数字的整数部分,结果带符号

4.空值处理

FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变量完全相同.

为了处理缺失变量,FreeMarker提供了两个运算符:

  • !:指定缺失变量的默认值
  • ??:判断某个变量是否存在

其中,!运算符的用法有如下两种:
variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象.

使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1...
    年轻小伙程序员阅读 2,936评论 0 5
  • 目录 前言 FTL指令规则 插值规则 表达式 FreeMarker的常用指令 高级方法 前言 FreeMarker...
    garyond阅读 4,676评论 0 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 我有两个世界,一个是现实,一个是幻想。 现实中的我,住在城市,忙忙碌碌; 幻想中的我,住在村里,悠闲自得。 是不是...
    李素问阅读 212评论 0 0
  • 英雄聚义曾经处,旧时景,烟尘去。 忠义堂中思旧故。 千年风雨,汗青留句,快意人生路。 替天行道旗惊目,依旧青山几春...
    果然全身阅读 407评论 24 14