这样会遇到一个问题,当数据超过3位的时候,freemarker会自动用逗号截取 格式如:2,008
如何解决呢?
1> 加.toString(),如:${(userId).toString()}
2> 加?c,如:${(userId)?c}
3> freemarker配置文件freemarker.properties加上number_format=#
判断是否为空:
1.<#if xx[0]?exists>
2.<#if xx??>
3.<#if xx?default("xxx")>
不然当没有数据的时候 ,很大很大一个黄页就等着你了
序列号:
有时候页面的table需要在第一列显示序号 只需要使用 _index 即可 不过是从0开始的 你可以+1 比如:
<#list list as a>
${a_index+1}
</#list>
数据类型转换:
${xx?string} //字符串
${xx?number}//整数
${xx?currency}//小数
${xx?percent}//百分比
截取字符串长度:
有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的列子就可以自定义显示的长度
< lt. <= lte. > gt. >= gte
<#if jstbqkVO.gzdd?length lt 8>
<a href>${jstbqkVO.gzdd?default("")}</a>
<#else>
<a href title="${jstbqkVO.gzdd}">${jstbqkVO.gzdd[0..3]?default("")}...</a>
</#if>
意思就是如果这个字符串的长度小于8,那么就正常显示,反之则取4位
嵌套list:
很多时候,数据库里存储的都是编号,而页面上需要显示的汉字,而且不在一张表里,看列子
<#list jsskList as jsskVO>
<#list kcList as kcVO>
<#if kcVO.kch=jsskVO.kch> (kcVO里有编号和名称,而jsskVO里只有编号)
${kcVO.kcm}
</#if>
</#list>
</#list>
排序:
1.升序.sort_by()
<#list list?sort_by("字段") as x>
</#list>
2.降序.sort_by()?reverse
<#list list?sort_by("字段")?reverse as x>
</#list>
去空格:
${xx?trim}
格式化日期:
${date?string("yyyy-MM-dd HH:mm:ss ")}
${date?string("yyyyMMdd ")}
- 一、常用语法
- EG.一个对象BOOK
- 1、输出$...{book.name}
- 2、空值判断:$...{book.name?if_exists},
- $...{book.name?default(‘xxx’)}//默认值xxx
- $...{book.name!"xxx"}//默认值xxx
- 3、日期格式:$...{book.date?string('yyyy-MM-dd')}
- 4、数字格式:$...{book?string.number}--20
- $...{book?string.currency}--<#--$20.00-->
- $...{book?string.percent}—<#--20%-->
- 5、插入布尔值:
- <#assignfoo=true/>
- $...{foo?string("yes","no")}<#--yes-->
- 二、内置方法
- 1、数字型
- <#assignanswer=42/>
- $...{answer}
- $...{answer?string}<#--thesameas$...{answer}-->
- $...{answer?string.number}
- $...{answer?string.currency}
- $...{answer?string.percent}
- <#settingnumber_format="0.###E0"/>
- $...{12345?string("0.####E0")}
- $...{answer?string("number")}等同于:$...{answer?string.number}.
- 2、日期型:
- 预定义格式包括:short,middle和long。
- $...{openingTime?string.short}
- $...{openingTime?string.medium}
- $...{openingTime?string.long}
- 组合使用:$...{lastUpdated?string.short_long}
- $...{lastUpdated?string("yyyy-MM-ddHH:mm:sszzzz")}
- 3、逻辑型
- foo?string
- foo?string("yes","no")
- 4、序列的内置方法:
- first
- last
- seq_contains
- $...{x?seq_contains("blue")?string("yes","no")}
- seq_index_of
- seq_last_index_of
- reverse
- size
- sort
- sort_by
- 多层次的hash排序
- <#assignmembers=[
- ...{"name":...{"first":"Joe","last":"Smith"},"age":40},
- ...{"name":...{"first":"Fred","last":"Crooger"},"age":35},
- ...{"name":...{"first":"Amanda","last":"Fox"},"age":25}]>
- Sortedbyname.last:
- <#listmembers?sort_by(['name','last'])asm>
- -$...{m.name.last},$...{m.name.first}:$...{m.age}yearsold
- </#list>
- chunk:将一个序列分解成几个序列。
- <#assignseq=['a','b','c','d','e','f','g','h','i','j']>
- <#listseq?chunk(4)asrow>
- <#listrowascell>$...{cell}</#list>
- </#list>
- <#listseq?chunk(4,'-')asrow>
- <#listrowascell>$...{cell}</#list>
- </#list>
- chunk经常用于分栏或者表格输出的格式。
- 5、hash内置方法:
- keys:
- values:
- 三、序列
- 由逗号分隔的变量列表,由方括号限定,类似java中的一维数组
- <#assignseq=["winter","spring","summer","autumn"]>
- <#listseqasx>
- ${x_index+1}.${x}
- <#ifx_has_next>,
- </#list>
- 输出
- 1.winter,
- 2.spring,
- 3.summer,
- 4.autumn
- 四、Hashes(散列)
- 由逗号分隔的键-值列表,由大括号限定,键和值之间用冒号分隔:{"name":"greenmouse","price":150},键和值都是表达式,但是键必须是字符串。
- <#assignages=...{"Joe":23,"Fred":25}+...{"Joe":30,"Julia":18}>
- Joeis$...{ages.Joe}
- Fredis$...{ages.Fred}
- Juliais$...{ages.Julia}
- 结果:
- -Joeis30
- -Fredis25
- -Juliais18
- 五、freemarker的空值和默认值
- ${user?if_exists}
- ${user?default('yourname')}
- 判断对象是不是null
- <#ifmouse?exists>
- Mousefound
- <#else>
- 或<#ifbook.name??>
- Mousefound
- </#if>
- list空值判断<#ifbookList?size=0>
- 六、算术运算
- 比较操作符-<#ifexpression>...</#if>
- 1.)使用=(或==,完全相等)测试两个值是否相等,使用!=测试两个值是否不相等
- 2.)=和!=两边必须是相同类型的值,否则会产生错误,例如<#if1="1">会引起错误
- 3.)Freemarker是精确比较,所以"x"、"x"和"X"是不相等的
- 4.)对数字和日期可以使用<、<=、>和>=,但不能用于字符串
- 5.)由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if(x>y)>,另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=
- 逻辑操作符-&&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误
- <#ifx<12&&color="green">
- Wehavelessthan12things,andtheyaregreen.
- </#if>
- <#if!hot><#--herehotmustbeaboolean-->
- It'snothot.
- </#if>
- 内置函数-用法类似访问hash(散列)的子变量,只是使用"?"替代".",例如:user?upper_case
- 下面列出常用的一些函数:
- 对于字符串
- html-对字符串进行HTML编码
- cap_first-使字符串第一个字母大写
- lower_case-将字符串转换成小写
- trim-去掉字符串前后的空白字符
- 对于Sequences(序列)
- size-获得序列中元素的数目
- 对于数字
- int-取得数字的整数部分(如-1.9?int的结果是-1)
- 例一:
- <#--test的值为Tom&Jerry-->
- $...{test?html}
- $...{test?upper_case?html}
- 结果:
- Tom&Jerry
- TOM&JERRY
- 例二:
- <#--seasons的值为"winter","spring","summer","autumn"-->
- $...{seasons?size}
- $...{seasons[1]?cap_first}<#--leftsidecanbyanyexpression-->
- $...{"horse"?cap_first}
- 结果:
- 4
- Spring
- Horse
- 方法的调用
- $...{repeat("What",3)}
- $...{repeat(repeat("x",2),3)+repeat("What",4)?upper_case}
- 结果:
- WhatWhatWhat
- xxxxxxWHATWHATWHATWHAT
- 操作符优先顺序
- 后缀[subvarName][subStringRange].(methodParams)
- 一元+expr、-expr、!
- 内建?
- 乘法*、/、%
- 加法+、-
- 关系<、>、<=、>=(lt、lte、gt、gte)
- 相等=、!=
- 逻辑&&
- 逻辑||
- 数字范围..
- 三.)Interpolation:由$...{...}或#...{...}两种类型,输出计算值,可以定义输出的格式
- 例一:
- <#settingnumber_format="currency"/>
- <#assignanswer=42/>
- $...{answer}
- $...{answer?string}<#--thesameas$...{answer}-->
- $...{answer?string.number}
- $...{answer?string.currency}
- $...{answer?string.percent}
- 结果:
- $42.00
- $42.00
- 42
- $42.00
- 4,200%
- 例二:
- $...{lastUpdated?string("yyyy-MM-ddHH:mm:sszzzz")}
- $...{lastUpdated?string("EEE,MMMd,''yy")}
- $...{lastUpdated?string("EEEE,MMMMdd,yyyy,hh:mm:ssa'('zzz')'")}
- 结果:
- 2003-04-0821:24:44PacificDaylightTime
- Tue,Apr8,'03
- Tuesday,April08,2003,09:24:44PM(PDT)
- 例三:
- <#assignfoo=true/>
- $...{foo?string("yes","no")}
- 结果:
- yes
- 例四:
- <#--xis2.582andyis4-->
- #...{x;M2}<#--2.58-->
- #...{y;M2}<#--4-->
- #...{x;m1}<#--2.6-->
- #...{y;m1}<#--4.0-->
- #...{x;m1M2}<#--2.58-->
- #...{y;m1M2}<#--4.0-->
- 说明:mX-小数部分最小X位;MX-小数部分最大X位。
- 四.)注释:<#--和-->
- 下面是一个常用的模板例子:
- <p>Wehavetheseanimals:
- <tableborder=1>
- <tr><th>Name<th>Price
- <#listanimalsasbeing>
- <tr>
- <td>
- <#ifbeing.size="large"><b></#if>
- $...{being.name}
- <#ifbeing.size="large"></b></#if>
- <td>$...{being.price}Euros
- </#list>
- </table>
- <#include"/copyright_footer.html">
- 注意点:
- 1.)FreeMarker是区分大小写的;
- 2.)FTL标记不能位于另一个FTL标记内部,例如:<#if<#include'foo'>='bar'>...</if>;
- 3.)$...{…}只能在文本中使用;
- 4.)多余的空白字符会在模板输出时去除;
- 5.)如果使用的指令不存在,会产生一个错误消息。
- <#--x的值设定为5-->
- $...{x*x-100}
- $...{x/2}
- $...{12%10}
- 结果:
- -75
- 2.5
- 2
- 注意:操作符两边必须是数字;使用"+"时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串。
- 使用内建的指令int获得整数部分:
- $...{(x/2)?int}
- $...{1.1?int}
- $...{1.999?int}
- $...{-1.1?int}
- $...{-1.999?int}
- 结果:
- 2
- 1
- 1
- -1
- -1