Freemarker 基本数据类型

摘要:
string}2.在if标签中可以直接使用b的值为true1.输出日期:${currentDate?date}2.只输出时间:${currentDate?string}:2.1Freemarker中预定义了三种数字格式,货币,百分比,数字,默认为数字格式货币::${0.3?string.number}2.2取整1.向上取整3.4--˃${3.4?cap_first}2.首个单词的首个字母母小写:${"HelloWorld"?uncap_first}3.所有单词首字母大写:${"helloworld"?ends_with˃hello,world以字符串world结尾4.4判断是否以xxx开头1.${"hello,world"?starts_with˃hello,world以字符串hello开头4.5返回字符串长度${"hello,world"?replace}4.9查询字符串第一次出现的索引位置,如果不存在返回0${"hello,world"?first}2.获取最后一个元素:sequence?

一 数据类型简介

freemarker 模板中的数据类型由如下几种:

1. 布尔型:等价于java中的boolean类型, 不同的是不能直接输出,可以转换成字符串再输出

2. 日期型:等价于java中的Date类型, 不同之处在于不能直接输出,需要转换成字符串再输出

3. 数值型:等价于java 中的int, float, double 等数值类型,有三种显示形式:数值型(默认) 、货币型、百分比型

4. 字符串型:等价于java 中的字符串,有很多内置函数

5. sequence 类型:等价于java中的数组,list,set 等集合类型

6. hash 类型:等价于java 中的Map 类型

二、 数据类型示例

【1. 布尔型】
1. 不能直接输出布尔型的值, 必须转换为string:${b?string}
2. 在if标签中可以直接使用
<#if b>
b 的值为 true
</#if>
【2. 日期型】
1. 输出日期:${currentDate?date}
2. 只输出时间:${currentDate?time}
3. 输出日期时间:${currentDate?datetime}
4. 格式化日期: ${currentDate?string('yyyy-MM-dd HH:mm:ss:S')}
【3. 数值型】
2.1 Freemarker 中预定义了三种数字格式,货币,百分比,数字,默认为数字格式
货币::${0.3?string.currency}
百分比:${0.3?string.percent}
数字(默认):${0.3?string.number}
2.2 取整
1. 向上取整
3.4 --> ${3.4?ceiling}

3.5 --> ${3.5?ceiling}

2. 向下取整
3.4 --> ${3.4?floor}

3.5 --> ${3.5?floor}

3. 四舍五入
3.4 --> ${3.4?round}

3.5 --> ${3.5?round}

2.3 数字格式化, 使用0 表示不够 由0 补齐, 用# 表示不够不补齐
1. 保留两位小数: 必须两位,不够补0, 当前一位为偶数时,五舍六入, 当前一位为基数时,四舍五入
0.135 -- > ${0.135?string('.00')}
0.125 -- > ${0.125?string('.00')}
0.1 -- > ${0.1?string('.00')}
2. 保留两位小数: 最多两位,不够不补0, 当前一位为偶数时,五舍六入, 当前一位为基数时,四舍五入
0.135 -- > ${0.135?string('#.##')}
0.125 -- > ${0.125?string('#.##')}
0.1 -- > ${0.1?string('#.##')}
3. 格式化整数, 用0 表示必须三位整数,不够由0 补齐
12.1 -- > ${12.1?string('000.00')}
12.125 -- > ${12.125?string('000.00')}
12.135 -- > ${12.135?string('000.00')}
4. 格式化整数, 用0 表示必须三位整数,不够由0 补齐, 一个# 和 多个# 是一样的
12.1 -- > ${12.1?string('#.00')}
12.125 -- > ${12.125?string('#.00')}

12.135 -- > ${12.135?string('#.00')}

5. 千位分割
123456789 --> ${123456789?string(',###')}

123456789 --> ${123456789?string(',####')}

2.4 数字转换成字符串:
数字转换成字符串后,就可以直接用字符串的内置函数了
1234 -- > ${123?string}
1234 -- > ${123?string[0]}
<#-- ${123[2]} 报错 -->
【4. 字符串型】
4.1 截取字符串subString(start,end):"hello,wold"

1. 截取6~end: ${"hello,wold"?substring(6)}
2. 截取0~5: ${"Hello,World"?substring(0,5)}
4.2 字母大小写转换
1. 首个单词的首字母大写: ${"hello world"?cap_first}
2. 首个单词的首个字母母小写: ${"Hello World"?uncap_first}
3. 所有单词首字母大写:${"hello world"?capitalize}
4. 字符串大写: ${"hello,world"?upper_case}
5. 字符串小写:${"hello,world"?lower_case}
4.3 判断是否以xxx 结尾
1. ${"hello,world"?ends_with("world")?string}
2. <#if "hello,world"?ends_with("world")>
hello,world 以字符串 world 结尾
</#if>
4.4 判断是否以xxx 开头
1. ${"hello,world"?starts_with("hello")?string}
2. <#if "hello,world"?starts_with("hello")>
hello,world 以字符串 hello 开头
</#if>
4.5 返回字符串长度
${"hello,world"?length}
4.6 是否包含子串
1. 返回为布尔值,布尔值不能直接输出,必须转换为string
${"hello,world"?contains("llo")?string};
2. <#if "hello,world"?contains("llo")>
"hello,world" 包含子串 "llo"
</#if>
4.7 去除首尾空格
字符串:${" hello,world "?trim}
4.8 替换字符串
${"hello,world"?replace("o","0")}
4.9 查询字符串第一次出现的索引位置,如果不存在返回0
${"hello,world"?index_of("o")}
${"hello,world"?index_of("aaa")}
4.10 字符串分割数组
<#assign citys="beijing,tianjin,shanghai"?split(",")/>
<#list citys as city>
${city_index} --> ${city}

</#list>

4.11 输出单个字母
${"hello"[0]}

【5. sequence】

1. 获取第一个元素:sequence?first
array: ${cityArray?first}
list: ${cityList?first}
set: ${citySet?first}
2. 获取最后一个元素:sequence?last
array: ${cityArray?last}
list: ${cityList?last}
set: ${citySet?last}
3. 返回sequence 的大小sequence?size
array: ${cityArray?size}
list: ${cityList?size}
set: ${citySet?size}
4. 排序:sequence?sort
4.1 sequence 元素为基本元素时(能转换为String的元素,非sequence 和 hash 元素)
array:sort,reverse
正 序:<#list cityArray as city>${city},</#list>
倒 序:<#list cityArray?reverse as city>${city},</#list>
升 序:<#list cityArray?sort as city>${city},</#list>
降 序:<#list cityArray?sort?reverse as city>${city},</#list>
list:sort,reverse
正 序:<#list cityList as city>${city},</#list>
倒 序:<#list cityList?reverse as city>${city},</#list>
升 序:<#list cityList?sort as city>${city},</#list>
降 序:<#list cityList?sort?reverse as city>${city},</#list>
set:sort,reverse
正 序:<#list citySet as city>${city},</#list>
倒 序:<#list citySet?reverse as city>${city},</#list>
升 序:<#list citySet?sort as city>${city},</#list>

降 序:<#list citySet?sort?reverse as city>${city},</#list>

4.2 sequence 元素为JavaBean时
正 序:
<#list department.employees as employee>
${employee_index} --> ${employee.name} --> ${employee.age} --> ${employee.sex}
</#list>
逆 序:
<#list department.employees?reverse as employee>
${employee_index} --> ${employee.name} --> ${employee.age} --> ${employee.sex}
</#list>
按name属性升序:
<#list department.employees?sort_by("name") as employee>
${employee_index} --> ${employee.name} --> ${employee.age} --> ${employee.sex}
</#list>
按name属性降序:
<#list department.employees?sort_by("name")?reverse as employee>
${employee_index} --> ${employee.name} --> ${employee.age} --> ${employee.sex}
</#list>
5. 遍历sequence, 包含索引值
array: <#list cityArray as city>
${city_index} --> ${city}
</#list>
list: <#list cityList as city>
${city_index} --> ${city}
</#list>
set: <#list citySet as city>
${city_index} --> ${city}

</#list>

6. 根据索引获取sequence 元素
array: ${cityArray[0]}
list: ${cityList[0]}
set: ${citySet[0]}
【6. map 类型】

1. map长度:${cityMap?size};

2. map的keys:cityMap.keys 返回的是一个sequence,类似于数组,所以不能直接输出,需要遍历
<#assign mapKeys=cityMap?keys/>
<#list mapKeys as mapKey>
${mapKey}

</#list>

3. map的values: cityMap.values 返回的是一个sequence,类似于数组,所以不能直接输出,需要遍历
<#assign mapValues=cityMap?values/>
<#list mapValues as mapValue>
${mapValue}

</#list>

4. 遍历map 元素: map 通过key获取value的方法用[]
<#list cityMap?keys as key>
${key_index} --> ${key} --> ${cityMap[key]}
</#list>
【7. JavaBean 类型】
1. 获取属性:
${department.id} --> ${department.name}
2. 级联属性:${department.employees[0].name} --> ${department.employees[0].age} --> ${department.employees[0].sex}
3. 遍历数组:
<#list department.employees as employee>
${employee_index} --> ${employee.name} --> ${employee.age} --> ${employee.sex}
</#list>
4. 排序
<#list department.employees?sort_by("name") as employee>
${employee_index} --> ${employee.name} --> ${employee.age} --> ${employee.sex}
</#list>

三、测试用例

【1. ftl 文件】将第二部分copy 一下,就是模板文件

【2.测试用例】

  1. packageorg.zgf.learn.freemarker;
  2. importjava.io.File;
  3. importjava.io.OutputStreamWriter;
  4. importjava.io.Writer;
  5. importjava.util.ArrayList;
  6. importjava.util.Arrays;
  7. importjava.util.Date;
  8. importjava.util.HashMap;
  9. importjava.util.HashSet;
  10. importjava.util.List;
  11. importjava.util.Map;
  12. importjava.util.Set;
  13. importorg.junit.After;
  14. importorg.junit.Test;
  15. importfreemarker.template.Configuration;
  16. importfreemarker.template.Template;
  17. importfreemarker.template.TemplateExceptionHandler;
  18. /**
  19. *测试数据类型
  20. */
  21. publicclassTest_02_dataType{
  22. privatestaticConfigurationcfg;
  23. privatestaticfinalStringTEMPLATEFILENAME="src/test/resources/templates";
  24. privatestaticTemplatedateTmp;
  25. privatestaticMap<String,Object>root=newHashMap<>();;
  26. static{
  27. try{
  28. //初始化参数
  29. cfg=newConfiguration(Configuration.VERSION_2_3_22);
  30. cfg.setDirectoryForTemplateLoading(newFile(TEMPLATEFILENAME));
  31. cfg.setDefaultEncoding("UTF-8");
  32. cfg.setTemplateUpdateDelayMilliseconds(0);
  33. cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
  34. dateTmp=cfg.getTemplate("datatype.ftl");
  35. }catch(Exceptionex){
  36. ex.printStackTrace();
  37. }
  38. }
  39. @After
  40. publicvoidtearDown()throwsException{
  41. //输出数据
  42. Writerout=newOutputStreamWriter(System.out);
  43. dateTmp.process(root,out);
  44. out.flush();
  45. out.close();
  46. }
  47. @Test
  48. publicvoidtest_1()throwsException{
  49. //1.布尔型
  50. root.put("b",true);
  51. //2.数值型
  52. root.put("currentDate",newDate());
  53. //3.数组类型
  54. String[]cityArray=newString[]{"beijing","tianjin","shanghai"};
  55. root.put("cityArray",cityArray);
  56. //4.list类型
  57. List<String>cityList=Arrays.asList(cityArray);
  58. root.put("cityList",cityList);
  59. //5.set类型
  60. Set<String>citySet=newHashSet<>(cityList);
  61. root.put("citySet",citySet);
  62. //6.map类型
  63. Map<String,String>cityMap=newHashMap<>();
  64. cityMap.put("BJ","beijing");
  65. cityMap.put("TJ","tianjin");
  66. cityMap.put("SH","shanghai");
  67. root.put("cityMap",cityMap);
  68. //7.JavaBean
  69. Departmentdepartment=newDepartment();
  70. department.setId(101);
  71. department.setName("开发部");
  72. List<Employee>emps=newArrayList<>();
  73. for(inti=0;i<10;i++){
  74. Employeeemp=newEmployee("zong_"+i,20+i,"man");
  75. emps.add(emp);
  76. }
  77. department.setEmployees(emps);
  78. root.put("department",department);
  79. }
  80. }

【3. 1JavaBean--Department.java】
  1. publicclassDepartment{
  2. privateIntegerid;
  3. privateStringname;
  4. privateList<Employee>employees;
  5. //setter&&getter...
  6. }

【3. 2JavaBean--Employee.java】

  1. publicclassEmployee{
  2. privateStringname;
  3. privateintage;
  4. privateStringsex;
  5. <prename="code"class="java">//setter&&getter...
  6. }

四 测试结果

  1. 二、数据类型示例
  2. 【1.布尔型】:
  3. 1.不能直接输出布尔型的值,必须转换为string:true
  4. 2.在if标签中可以直接使用
  5. b的值为true
  6. 【2.日期型】
  7. 1.输出日期:2016-3-4
  8. 2.只输出时间:17:11:40
  9. 3.输出日期时间:2016-3-417:11:40
  10. 4.格式化日期:2016-03-0417:11:40:580
  11. 【3.数值型】:
  12. 2.1Freemarker中预定义了三种数字格式,货币,百分比,数字,默认为数字格式
  13. 货币::¥0.30
  14. 百分比:30%
  15. 数字(默认):0.3
  16. 2.2取整
  17. 1.向上取整
  18. 3.4-->4
  19. 3.5-->4
  20. 2.向下取整
  21. 3.4-->3
  22. 3.5-->3
  23. 3.四舍五入
  24. 3.4-->3
  25. 3.5-->4
  26. 2.3数字格式化,使用0表示不够由0补齐,用#表示不够不补齐
  27. 1.保留两位小数:必须两位,不够补0,当前一位为偶数时,五舍六入,当前一位为基数时,四舍五入
  28. 0.135-->.14
  29. 0.125-->.12
  30. 0.1-->.10
  31. 2.保留两位小数:最多两位,不够不补0,当前一位为偶数时,五舍六入,当前一位为基数时,四舍五入
  32. 0.135-->0.14
  33. 0.125-->0.12
  34. 0.1-->0.1
  35. 3.格式化整数,用0表示必须三位整数,不够由0补齐
  36. 12.1-->012.10
  37. 12.125-->012.12
  38. 12.135-->012.14
  39. 4.格式化整数,用0表示必须三位整数,不够由0补齐,一个#和多个#是一样的
  40. 12.1-->12.10
  41. 12.125-->12.12
  42. 12.135-->12.14
  43. 5.千位分割
  44. 123456789-->123,456,789
  45. 123456789-->1,2345,6789
  46. 2.4数字转换成字符串:
  47. 数字转换成字符串后,就可以直接用字符串的内置函数了
  48. 1234-->123
  49. 1234-->1
  50. 【4.字符串型】
  51. 4.1截取字符串subString(start,end):"hello,wold"
  52. 1.截取6~end:wold
  53. 2.截取0~5:Hello
  54. 4.2字母大小写转换
  55. 1.首个单词的首字母大写:Helloworld
  56. 2.首个单词的首个字母母小写:helloWorld
  57. 3.所有单词首字母大写:HelloWorld
  58. 4.字符串大写:HELLO,WORLD
  59. 5.字符串小写:hello,world
  60. 4.3判断是否以xxx结尾
  61. 1.true
  62. 2.
  63. hello,world以字符串world结尾
  64. 4.4判断是否以xxx开头
  65. 1.true
  66. 2.
  67. hello,world以字符串hello开头
  68. 4.5返回字符串长度
  69. 11
  70. 4.6是否包含子串
  71. 1.返回为布尔值,布尔值不能直接输出,必须转换为string
  72. true;
  73. 2.
  74. "hello,world"包含子串"llo"
  75. 4.7去除首尾空格
  76. 字符串:hello,world
  77. 4.8替换字符串
  78. hell0,w0rld
  79. 4.9查询字符串第一次出现的索引位置,如果不存在返回0
  80. 4
  81. -1
  82. 4.10字符串分割数组
  83. 0-->beijing
  84. 1-->tianjin
  85. 2-->shanghai
  86. 4.11输出单个字母
  87. h
  88. 【5.sequence】
  89. 1.获取第一个元素:sequence?first
  90. array:beijing
  91. list:beijing
  92. set:tianjin
  93. 2.获取最后一个元素:sequence?last
  94. array:shanghai
  95. list:shanghai
  96. set:shanghai
  97. 3.返回sequence的大小sequence?size
  98. array:3
  99. list:3
  100. set:3
  101. 4.排序:sequence?sort
  102. 4.1sequence元素为基本元素时(能转换为String的元素,非sequence和hash元素)
  103. array:sort,reverse
  104. 正序:beijing,tianjin,shanghai,
  105. 倒序:shanghai,tianjin,beijing,
  106. 升序:beijing,shanghai,tianjin,
  107. 降序:tianjin,shanghai,beijing,
  108. list:sort,reverse
  109. 正序:beijing,tianjin,shanghai,
  110. 倒序:shanghai,tianjin,beijing,
  111. 升序:beijing,shanghai,tianjin,
  112. 降序:tianjin,shanghai,beijing,
  113. set:sort,reverse
  114. 正序:tianjin,beijing,shanghai,
  115. 倒序:shanghai,beijing,tianjin,
  116. 升序:beijing,shanghai,tianjin,
  117. 降序:tianjin,shanghai,beijing,
  118. 4.2sequence元素为JavaBean时
  119. 正序:
  120. 0-->zong_0-->20-->man
  121. 1-->zong_1-->21-->man
  122. 2-->zong_2-->22-->man
  123. 3-->zong_3-->23-->man
  124. 4-->zong_4-->24-->man
  125. 5-->zong_5-->25-->man
  126. 6-->zong_6-->26-->man
  127. 7-->zong_7-->27-->man
  128. 8-->zong_8-->28-->man
  129. 9-->zong_9-->29-->man
  130. 逆序:
  131. 0-->zong_9-->29-->man
  132. 1-->zong_8-->28-->man
  133. 2-->zong_7-->27-->man
  134. 3-->zong_6-->26-->man
  135. 4-->zong_5-->25-->man
  136. 5-->zong_4-->24-->man
  137. 6-->zong_3-->23-->man
  138. 7-->zong_2-->22-->man
  139. 8-->zong_1-->21-->man
  140. 9-->zong_0-->20-->man
  141. 按name属性升序:
  142. 0-->zong_0-->20-->man
  143. 1-->zong_1-->21-->man
  144. 2-->zong_2-->22-->man
  145. 3-->zong_3-->23-->man
  146. 4-->zong_4-->24-->man
  147. 5-->zong_5-->25-->man
  148. 6-->zong_6-->26-->man
  149. 7-->zong_7-->27-->man
  150. 8-->zong_8-->28-->man
  151. 9-->zong_9-->29-->man
  152. 按name属性降序:
  153. 0-->zong_9-->29-->man
  154. 1-->zong_8-->28-->man
  155. 2-->zong_7-->27-->man
  156. 3-->zong_6-->26-->man
  157. 4-->zong_5-->25-->man
  158. 5-->zong_4-->24-->man
  159. 6-->zong_3-->23-->man
  160. 7-->zong_2-->22-->man
  161. 8-->zong_1-->21-->man
  162. 9-->zong_0-->20-->man
  163. 5.遍历sequence,包含索引值
  164. array:
  165. 0-->beijing
  166. 1-->tianjin
  167. 2-->shanghai
  168. list:
  169. 0-->beijing
  170. 1-->tianjin
  171. 2-->shanghai
  172. set:
  173. 0-->tianjin
  174. 1-->beijing
  175. 2-->shanghai
  176. 6.根据索引获取sequence元素
  177. array:beijing
  178. list:beijing
  179. set:tianjin
  180. 【6.map类型】
  181. 1.map长度:3;
  182. 2.map的keys:cityMap.keys返回的是一个sequence,类似于数组,所以不能直接输出,需要遍历
  183. SH
  184. TJ
  185. BJ
  186. 3.map的values:cityMap.values返回的是一个sequence,类似于数组,所以不能直接输出,需要遍历
  187. shanghai
  188. tianjin
  189. beijing
  190. 4.遍历map元素:map通过key获取value的方法用[]
  191. 0-->SH-->shanghai
  192. 1-->TJ-->tianjin
  193. 2-->BJ-->beijing
  194. 【7.JavaBean类型】
  195. 1.获取属性:101-->开发部
  196. 2.级联属性:zong_0-->20-->man
  197. 3.遍历数组:
  198. 0-->zong_0-->20-->man
  199. 1-->zong_1-->21-->man
  200. 2-->zong_2-->22-->man
  201. 3-->zong_3-->23-->man
  202. 4-->zong_4-->24-->man
  203. 5-->zong_5-->25-->man
  204. 6-->zong_6-->26-->man
  205. 7-->zong_7-->27-->man
  206. 8-->zong_8-->28-->man
  207. 9-->zong_9-->29-->man
  208. 4.排序
  209. 0-->zong_0-->20-->man
  210. 1-->zong_1-->21-->man
  211. 2-->zong_2-->22-->man
  212. 3-->zong_3-->23-->man
  213. 4-->zong_4-->24-->man
  214. 5-->zong_5-->25-->man
  215. 6-->zong_6-->26-->man
  216. 7-->zong_7-->27-->man
  217. 8-->zong_8-->28-->man
  218. 9-->zong_9-->29-->man

免责声明:文章转载自《Freemarker 基本数据类型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PyQtGraph 绘图[笔记]--Oracle 终止expdp/impdp进程运行的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HTTP metadata数据

信息元位置 信息元名称 信息元ID 信息元描述 1 MetadataVersion 5000 Metadata版本号 当前版本号为1.0 2 MetadataID 1019 MetadataID 3 sourceIPv4Address or sourceIPv6Address 8 or 27 源IP(IPv4或者IPv6)...

[工具]图片等比例压缩工具

写在前面 在网盘中有这样一个功能,需要获取所有图片的列表,想来想去,觉得还是生成相同比例的图片,在排版上更美观一些。所以就没事高了一个压缩的工具玩玩。 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat...

Socket服务器-Websocket支持多端连入

socket服务端: using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Security.Cryptography;using System.Text;using Sys...

Hbase介绍及操作

1. Hbase概述 1.1 Hbase是什么 HBase是建立在HDFS之上的分布式面向列的数据库;属于KV结构数据,原生不支持标准SQL。它是一个Apache的开源项目,是横向扩展的。 HBase可以提供快速随机访问海量结构化数据。它利用了Hadoop的文件系统(HDFS)提供的容错能力。 HBase不同于一般的关系数据库,它是一个适合于非结构化数据...

使用LitJson解析json信息

1.载入LitJson.dll文件 2.解析的主要代码 TextAsset textAsset= Resources.Load<TextAsset>("UIPanelJson"); //载入json文件 JsonData jsonData = JsonMapper.ToObject(textAsset.text); //将json信息...

c# 字符串(含有汉字)转化为16进制编码(转)

public static string Str2Hex(string s) { string result = string.Empty; byte[] arrByte = System.Text.Encoding.GetEncoding("GB2312").GetBytes(s...