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 中存入数字类型数据:

  1. req.setAttribute("number2", 12345);
  2. 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中存入以下内容:

  1. String[] stars = new String[]{"张三", "李四", "王五"};
  2. req.setAttribute("stars", stars);
  3. List<String> cities = Arrays.asList("深圳","北京", "上海", "郑州");
  4. req.setAttribute("cities", cities);

定义一个JavaBean:

  1. public class User {
  2. private String name;
  3. private int age;
  4. // getter/setter
  5. }

在Servlet中存入一个对象集合:

  1. List<User> users = new ArrayList<>(3);
  2. users.add(new User("张三", 14));
  3. users.add(new User("李四", 19));
  4. users.add(new User("王五", 16));
  5. req.setAttribute("users", users);

在FreeMarker中使用<#list as >进行遍历:

  1. <!-- 使用list进行遍历 -->
  2. <#list stars as star>
  3. <!-- 使用?index获取该项的索引下标 -->
  4. 第${star?index}个:${star}<br>
  5. </#list>
  6. <hr>
  7. <!-- 获取集合的第一项、集合的大小、集合的最后一项 -->
  8. ${stars?first}<br>
  9. ${stars?size}<br>
  10. ${stars?last}<br>
  11. <hr>
  12. <#list cities as city>
  13. ${city}<br>
  14. </#list>
  15. <hr>
  16. <!-- 将集合项进行拼接 -->
  17. ${cities?join(",")}<br>
  18. <!-- 将集合逆向输出 -->
  19. <#list cities?reverse as city>
  20. ${city}<br>
  21. </#list>
  22. <hr>
  23. <!-- 对集合进行排序后输出 -->
  24. <#list cities?sort as city>
  25. ${city}<br>
  26. </#list>
  27. <hr>
  28. <!-- 遍历JavaBean集合 -->
  29. <#list users as user>
  30. ${user.name}:${user.age}<br>
  31. </#list>
  32. <hr>
  33. <!-- 将对象集合按照某个属性进行排序 -->
  34. <#list users?sort_by("age") as user>
  35. ${user.name}:${user.age}<br>
  36. </#list>
  37. <hr>

hash类型

对应到Java的Map类型。

在Servlet中存入Map类型的数据:

  1. Map<String, String> cityCodeMap = new HashMap<>(3);
  2. cityCodeMap.put("bj", "北京");
  3. cityCodeMap.put("sz", "深圳");
  4. cityCodeMap.put("zz", "郑州");
  5. cityCodeMap.put("sh", "上海");
  6. req.setAttribute("cityCode", cityCodeMap);

在FreeMarker中进行遍历:

  1. <!-- 遍历所有的key -->
  2. <#list cityCode?keys as key>
  3. <!-- 根据key获取value -->
  4. ${key}: ${cityCode[key]} <br>
  5. </#list>
  6. <hr>
  7. <!-- 遍历所有的value -->
  8. <#list cityCode?values as value>
  9. ${value}<br>
  10. </#list>