FreeMarker 模板中的数据类型有如下几种:
- 布尔型:等价于 java 的 Boolean,不能直接输出,需要转换成字符串
- 日期型:等价于 java 的 Date,不能直接输出,需要转换成字符串
- 数值型:等价于 java 中的 int、float、double 等数值类型,三种显示形式
- 数值型(默认)
- 货币型
- 百分比型
- 字符串:等价于 java 中的字符串,有很多内置函数
- sequence类型:等价于 java 中的数组、List、Set等集合类型
- hash类型:等价于 java 中的 Map
布尔类型
1、在 Servlet 中设置布尔类型的数据
// 布尔类型request.setAttribute("flag", true);
2、获取数据
<#--布尔类型不支持直接输出,需要转换成字符串方式一:?c方式二:?string 或 ?string("true时文本","false时文本")-->${flag?c}${flag?string}${flag?string("yes","no")}
日期类型
1、在service中设置日期类型的数据
//日期类型request.setAttribute("createDate",new Date());
2、获取数据:
<#-- 日期类型同样不支持直接输出,需要转换成字符串1、年月日:?date2、时分秒:?time3、年月日时分秒: ?datetime4、指定格式: ?string("自定义格式")y:年 M:月 d:日H:时 m:分 s:秒--><#-- 输出日期 -->${createDate?date}<#-- 输出时间格式 -->${createDate?time}<#-- 输出日期时间格式 -->${createDate?datetime}<#-- 输出自定义格式 -->${createDate?string("yyyy年MM月dd日 HH:mm:ss")}
数值类
1、在service中设置日期类型的数据
//数值类型request.setAttribute("age",18);request.setAttribute("salary",10000);request.setAttribute("avg",0.545);
2、获取数据:
<#-- 数值类型可以直接输出1、转字符串普通字符串: ?c货币型字符串: ?string.currency百分比型字符串: ?string.percent2、保留浮点型数值指定小数位(#表示一个小数位) ?string["0.##"]--><#-- 直接输出数值型 -->${age}、${salary}、${avg}<#-- 转换成字符串输出 -->${salary?c}${salary?string.currency}${avg?string.percent}${avg?string["0.##"]}
字符串
1、在Servlet中设置字符串类型的数据
//字符串类型request. setAttribute ("msg", "Hel1o ")request.setAttribute ("msg2" , "freemarker");
2、获取数据
<#-- 数据类型:字符串类型在freemarker中字符串类型可以直接输出;1.截取字符串(左闭右开) ?substring(start,end)2·首字母小写输出 ?uncap_first3.首字母大写输出 ?cap_first4.字母转小写输出 ?1ower_case5·字母转大写输出 ?upper_case6.获取字符串长度 ?length7.是否以指定字符开头(boolean类型) ?starts_with("xx")?string8.否以指定字符结尾(boolean类型) ?ends—with("xx")?string9.获取指定字符的索引 ?index_of("xx")10.去除字符串前后空格 ?trim11.替换指定字符串 ?replace("xx","xx")-->
空值和null值
FreeMarker 使用两个运算符来避免空值:
- !:感叹号,指定缺失变量的默认值
- ${ value! }:如果value为空,则默认值是空字符串
- ${ value!”默认值” }:如果value为空,则默认值是字符串“默认值”
- ??:判断变量是否存在,变量存在返回true,否则返回false
- ${ (value??)?string }:将 value?? 运算结果转换成字符串输出
sequence 类型
1、在 Servlet 中设置数组、List、Set
/* 序列类型 */// 数组String[] stars = new String[]{"周杰", "武则天", "仙人"};request.setAttribute("stars", stars);// 列表List<String> list = new ArrayList<>(5);list.add("世界");list.add("无线");list.add("美好");list.add("可惜");list.add("难见");request.setAttribute("list", list);// SetSet<String> sets = new HashSet<>();sets.add("集合");sets.add("元素");request.setAttribute("sets", sets);
2、获取数据:
<#-- 序列类型(数组、List、Set):通过List指令输出序列<#list 序列名 as 元素名>${元素名}</#list>获取序列长度 ${序列名?size}获取序列元素的下标 ${元素名?index}获取第一个元素 ${序列名?first}获取最后一个元素 ${序列名?last}倒序输出 ${序列名?reverse}升序输出 ${序列名?sort}降序输出 ${序列名?sort?reverse}指定字段名排序 ${序列名?sort_by("字段名")}注:一般是javaBean集合,且对应的字段名需要提供get方法--><#-- 对数组元素进行遍历 --><#list stars as star>第${star?index}条数据:${star} <br/></#list><#-- 对List进行遍历 --><#list list as item>第${item?index}条数据:${item} <br/></#list><#-- 对Set进行遍历 --><#list sets as set>第${set?index}条数据:${set} <br/></#list><#-- 对list进行排序输出 --><#list list?sort as item>第${item?index}条数据:${item} <br/></#list>
输出结果:
对 javaBean 进行集合进行遍历:
1、在 Servlet 中创建
// Userpublic class User {private String name;private Integer age;public User() {}public User(String name, Integer age) {this.name = name;this.age = age;}// setter/getter}// 在Servlet中设置属性到请求域Set<User> users = new HashSet<>();users.add(new User("李四", 18));users.add(new User("王五", 19));request.setAttribute("users", users);
2、获取
<#list users as user>${user?index}: 用户姓名- ${user.name} - 用户年龄 - ${user.age} <br/></#list>
3、结果
hash类型
1、在Servlet中设置 hash 类型的数据
Map<String, User> map = new HashMap<>();map.put("李四", new User("李四", 12));map.put("王五", new User("王五", 85));map.put("张三", new User("张三", 17));request.setAttribute("map", map);
2、获取数据
<#-- 数据类型:hash类型key遍历输出:<#list hash?keys as key>${key} -- ${hash[key]}</#list>value遍历输出:<#list hash?values as value>${value}</#list>--><#list map?keys as key>${key} : ${map[key].name} - ${map[key].age} <br/></#list><#list map?values as value>${value.name} - ${value.age} <br/></#list>
