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>