FreeMarker数据类型
FreeMarker模板中的数据类型有:
- 布尔型:等价于java的 Boolean 类型,但是不可以直接输出,可以转换为字符串进行输出
- 日期型:等价于Java的 Date 类型,但是不可以直接输出,需要转换为字符串进行输出
- 数值型:等价于java的 int、float、double等类型。可以有不同的形式展示:数值(默认)、货币、百分比
- 字符串型:等价于java的字符串
- sequence型:等价于java的数组、list、set等集合类型
- hash型:等价于java的Map
布尔类型
FreeMarker中,布尔类型不可以直接输出,需要转换成字符串进行输出。
转换形式有:
${flag?c}:直接转换成字符串true、false${flag?string}:直接转换成字符串true、false${flag?string("yes","no")}:转换为对应的码值yes/no
数字类型
FreeMarker中,数字类型可以直接输出,也可以进行格式转换。
转换形式有:
${number}:原样输出${number?c}:字符串原样输出${number?string}:三位一逗形式字符串${number?string.currency}:货币形式(货币前缀、三位一逗、保留两位小数)${number?string.percent}:转换成百分比,四舍五入保留两位小数${number?string["0.##"]}:指定保留小数位数,一个#表示一个小数位
在 servlet 中存入数字类型数据:
req.setAttribute("number2", 12345);req.setAttribute("number", 3.23145);
日期类型
FreeMarker中,日期类型不可以直接输出,需要转换为字符串进行输出
转换形式有:
${inputDate?date}:年月日${inputDate?time}:时分秒${inputDate?dateTime}:年月日 时分秒${inputDate?string("yyyy/MM/dd HH:mm:ss")}:指定格式输出
字符串类型
FreeMarker中,字符串可以直接输出,也可以转换成指定格式输出。
转换:
${msg}:原样输出${msg?substring(1,3)}:字符串截取${msg?uncap_first}:首字母转小写${msg?cap_first}:首字母转大写${msg?lower_case}:字符串转小写${msg?upper_case}:字符串转大写${msg?length}:获取字符串长度${msg?starts_with("abc")?string}:是否以指定字符开头(布尔类型)${msg?ends_with("marker")?string}:是否以指定字符结尾(布尔类型)${msg?index_of("free")}:获取指定字符的索引${msg?trim}:去除字符串前后空格${msg?replace("e", "a")}:替换指定字符串
空字符串的处理:
FreeMarker的变量必须赋值,否则就会抛出异常。
对于FreeMarker来说,null和不存在的变量是完全一样的,因为FreeMarker无法理解null值。
FreeMarker提供两个运算符来避免空值:
!:指定缺失变量的默认值${value!}:如果value值为空,则默认值是空字符串${value!"默认值"}:如果value值为空,则默认值是字符串“默认值”??:判断变量是否存在${(value??)?string}:如果变量存在,返回true,否则返回false
sequence类型
Java中的数组、List、Set等集合类型,都对应到FreeMarker的sequence类型。
例如,在Servlet中存入以下内容:
String[] stars = new String[]{"张三", "李四", "王五"};req.setAttribute("stars", stars);List<String> cities = Arrays.asList("深圳","北京", "上海", "郑州");req.setAttribute("cities", cities);
定义一个JavaBean:
public class User {private String name;private int age;// getter/setter}
在Servlet中存入一个对象集合:
List<User> users = new ArrayList<>(3);users.add(new User("张三", 14));users.add(new User("李四", 19));users.add(new User("王五", 16));req.setAttribute("users", users);
在FreeMarker中使用<#list as >进行遍历:
<!-- 使用list进行遍历 --><#list stars as star><!-- 使用?index获取该项的索引下标 -->第${star?index}个:${star}<br></#list><hr><!-- 获取集合的第一项、集合的大小、集合的最后一项 -->${stars?first}<br>${stars?size}<br>${stars?last}<br><hr><#list cities as city>${city}<br></#list><hr><!-- 将集合项进行拼接 -->${cities?join(",")}<br><!-- 将集合逆向输出 --><#list cities?reverse as city>${city}<br></#list><hr><!-- 对集合进行排序后输出 --><#list cities?sort as city>${city}<br></#list><hr><!-- 遍历JavaBean集合 --><#list users as user>${user.name}:${user.age}<br></#list><hr><!-- 将对象集合按照某个属性进行排序 --><#list users?sort_by("age") as user>${user.name}:${user.age}<br></#list><hr>
hash类型
对应到Java的Map类型。
在Servlet中存入Map类型的数据:
Map<String, String> cityCodeMap = new HashMap<>(3);cityCodeMap.put("bj", "北京");cityCodeMap.put("sz", "深圳");cityCodeMap.put("zz", "郑州");cityCodeMap.put("sh", "上海");req.setAttribute("cityCode", cityCodeMap);
在FreeMarker中进行遍历:
<!-- 遍历所有的key --><#list cityCode?keys as key><!-- 根据key获取value -->${key}: ${cityCode[key]} <br></#list><hr><!-- 遍历所有的value --><#list cityCode?values as value>${value}<br></#list>
