FreeMarker基本用法 -2
1.FreeMarker 数据类型
1.1 布尔类型
不能直接输出,需要转换成字符串
输出形式:
1. ?c
2. ?string 或 ?string("为true显示的值","为false现实的值")
1.2 日期类型
不能直接输出,需要转换成字符串
1. ?date 年月日
2. ?time 时分秒
3. ?datetime 年与日时分秒
4. ?string(pattern) 自定义格式
y 年
M 月
d 日
H 时
m 分
s 秒
1.3 数值类型
可以直接输出,也可以转换成指定格式的字符串
1. ?c 普通字符串
2. ?string.currency 货币类型字符串
3. ?string.percent 百分比类型字符串
4. ?string["0.##"] 保留浮点型数值的指定小数位(一个#代表一个小数位,四舍五入)
1.4 字符串类型
可以直接输出
提供内置函数:
1. 截取字符串(左闭右开) ?substring(start,end)
2. 首字母小写输出 ?uncap_first
3. 首字母大写输出 ?cap_first
4. 字母转小写输出 ?lower_case
5. 字母转大写输出 ?upper_case
6. 获取字符串长度 ?length
7. 是否以指定字符开头(boolean类型) ?starts_with("xx")?string
8. 是否以指定字符结尾(boolean类型) ?ends_with("xx")?string
9. 获取指定字符的索引 ?index_ofS("xx")
10. 去除字符串前后空格 ?trim
11. 替换指定字符串 ?replace("xx","xx")
1.5 序列类型
通过list指令输出序列
<#list 序列名 as 元素名>
${名称}
</#list>
获取序列的长度 ${序列名?size}
获取序列元素的下标 ${元素名?index}
获取第一个元素 ${序列名?first}
获取最后一个元素 ${序列名?last}
倒序输出 序列名?reverse
升序输出 序列名?sort
降序输出 序列名?sort?reverse
指定字段名排序 序列名?sort_by("字段名")
注:一般是JavaBean集合,对应的字段名需要提供get方法
-->
1.6 哈希类型
key遍历输出
<#list hash?keys as key>
${key} -- ${hash[key]}
</#list>
value遍历输出
<#list hash?values as value>
${value}
</#list>
1.7 FreeMarker不支持null值
FreeMarker 提供两个运算符来避免空值:
① ! :指定缺失变量的默认值
${value!}:如果value值为空,则默认值是空字符串
${value!"默认值"}:如果value值为空,则默认值是字符串"默认值"
② ?? :判断变量是否存在
如果变量存在,返回 true,否则返回 false
${(value??)?string}
<#-- ! :指定缺失变量的默认值 -->
<#--${str}-->
${str!} <br>
${str!"这是默认值"}<br>
${msg!"这是默认值"}<br>
<#-- ?? :判断变量是否存在 -->
${(str??)?c} <br>
${(msg??)?c}
1.8 数据类型代码实现
servlet类
/**
* 布尔类型
*/
req.setAttribute("flag", true);
/**
* 日期类型
*/
req.setAttribute("date", new Date());
/**
* 数值类型
*/
req.setAttribute("age",18); // 数值型
req.setAttribute("salary",10000); // 数值型
req.setAttribute("avg",0.545); // 浮点型
/**
* 字符串类型
*/
req.setAttribute("msg","Hello ");
req.setAttribute("msg2","freemarker");
/**
* 序列类型
*/
// 数组操作
String[] stars = new String[]{"周杰伦","林俊杰","陈奕迅","五月天"};
req.setAttribute("stars",stars);
// List操作
List<String> citys = Arrays.asList("上海","北京","杭州","深圳");
req.setAttribute("cityList",citys);
// JavaBean集合
List<User> userList = new ArrayList<>();
userList.add(new User(1,"zhangsan",22));
userList.add(new User(2,"lisi",18));
userList.add(new User(3,"wangwu",20));
req.setAttribute("userList",userList);
/**
* 哈希类型
*/
Map<String,String> cityMap = new HashMap<>();
cityMap.put("sh","上海");
cityMap.put("bj","北京");
cityMap.put("sz","深圳");
req.setAttribute("cityMap",cityMap);
// 请求转发到freemarker页面
req.getRequestDispatcher("template/f02.ftl").forward(req,resp);
f2.ftl文件创建实现
<#--
FreeMarker数据类型
1. 布尔类型
2. 日期类型
3. 数值类型
4. 字符串类型
5. 序列类型
6. 哈希类型
-->
<h4>布尔类型</h4>
${flag?c} <br>
${flag?string}<br>
${flag?string("喜欢","不喜欢")}
<h4>日期类型</h4>
${date?date}<br>
${date?time}<br>
${date?datetime}<br>
${date?string("HH:mm yyyy/MM/dd")}<br>
<h4>数值类型</h4>
${age} <br>
${age?c} <br>
${salary?string.currency} <br>
${avg?string.percent} <br>
${avg?string["0.##"]}
<h4>字符串类型</h4>
${msg} ${msg2} <br>
字符串截取:${msg?substring(0,2)}<br>
字母转大写:${msg2?upper_case} <br>
获取字符串长度:${msg?length}<br>
是否以指定字符开头:${(msg?starts_with("H"))?c}<br>
去除前后空格后,获取长度:${msg?trim?length}
<h4>序列类型</h4>
获取长度:${stars?size} -- ${cityList?size} <br>
获取第一个元素:${stars?first} <br/>
获取最后一个元素:${cityList?last}<br/>
<#-- 遍历序列 -->
<#list stars as star>
${star} --
</#list>
<br/><br/>
<#list cityList as city>
${city} --
</#list>
<br/><br/>
<#list userList as user>
${user} -- 用户编号:${user.userId} -- 用户年龄:${user.userAge} -- 用户名称:${user.userName} -- 下标:${user?index} <br>
</#list>
<br><br>
<#list stars as star>
${star} --
</#list>
<br>
<#--倒序输出 序列名?reverse-->
<#list stars?reverse as star>
${star} --
</#list>
<br>
<#--升序输出 序列名?sort-->
<#list stars?sort as star>
${star} --
</#list>
<br>
<#--降序输出 序列名?sort?reverse-->
<#list stars?sort?reverse as star>
${star} --
</#list>
<br>
<#--指定字段名排序 序列名?sort_by("字段名")-->
<#list userList?sort_by("userAge") as user>
用户编号:${user.userId} -- 用户年龄:${user.userAge} -- 用户名称:${user.userName} -- 下标:${user?index} <br>
</#list>
<h4>哈希类型</h4>
<#list cityMap?keys as key>
${key} -- ${cityMap[key]} ||
</#list>
<br>
<#list cityMap?values as value>
${value} --
</#list>
2.FreeMarker 常⻅指令
2.1 assign 自定义变量指令
<#assign 变量名=值 />
<#assign 变量名=值 变量名=值 /> (定义多个变量,用空格隔开)
<#assign uname="admin"/>
<#assign name="zhangsan" stars=["jay","jj","eason"]/>
${uname} <br>
${name} <br>
<#list stars as star>
${star} --
</#list>
2.2 if elseif else 逻辑判断指令
格式:
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
<#else>
...
</#if>
注:
1. condition, condition2等:将被计算成布尔值的表达式。
2. elseif 和 else 指令 是可选的。
<#assign score = 80>
<#if score < 60>
你个⼩渣渣!
<#elseif score == 60>
分不在⾼,及格就⾏!
<#elseif score gt 60 && score lt 80>
哎哟不错哦!
<#else>
你很棒棒哦!
</#if> <br>
<#-- 判断数据是否存在 -->
<#assign list="">
<#if list??>
数据存在
<#else>
数据不存在
</#if>
2.3 list 遍历指令
可以使⽤ list 指令来对序列进⾏遍历。
格式1:
<#list sequence as item>
</#list>
格式2:
<#list sequence as item>
<#else>
当没有选项时,执⾏else指令
</#list>
注:
1. else 部分是可选的
2. sequence: 想要迭代的项,可以是序列或集合的表达式
3. item: 循环变量 的名称
4. 当没有迭代项时,才使⽤ else 指令, 可以输出⼀些特殊的内容⽽不只是空在那⾥
<#assign users = ["张三","李四","王五"]>
<#assign users2 = []>
<#list users as user>
${user} --
</#list>
<br>
<#-- 遍历数据前,先做非空判断 -->
<#if users1??>
<#list users1 as user>
${user}
</#list>
</#if>
<br>
<#list users2 as user>
${user}
<#else>暂未查询到数据!
</#list>
2.4 macro ⾃定义指令
可以使⽤ macro 指令来⾃定义⼀些⾃定义指令。
macro ⾃定义指令 (宏)
1. 基本使⽤
格式:
<#macro 指令名>
指令内容
</#macro>
使⽤:
<@指令名></@指令名>
2. 有参数的⾃定义指令
格式:
<#macro 指令名 参数名1 参数名2>
指令内容
</#macro>
使⽤:
<@指令名 参数名1=参数值1 参数名2=参数值2></@指令名>
注:
1. 指令可以被多次使⽤。
2. ⾃定义指令中可以包含字符串,也可包含内置指令
<#-- 定义指令 -->
<#macro address>
© 1999–2015 The FreeMarker Project. All rights reserved.
</#macro>
<@address></@address> <br>
<@address></@address>
<br><br>
<#macro queryUserByName uname>
查询用户 -- ${uname}
</#macro>
<@queryUserByName uname="admin"></@queryUserByName>
<br>
<#macro queryUserByName2 uname upwd>
查询用户 -- ${uname} -- ${upwd}
</#macro>
<@queryUserByName2 uname="admin" upwd="123456"></@queryUserByName2>
<br><br>
<#macro cfb>
<#list 1..9 as i>
<#list 1..i as j>
${j} * ${i} = ${j*i}
</#list>
<br>
</#list>
</#macro>
<@cfb></@cfb>
<br>
<#-- 设置动态参数 -->
<#macro cfb2 num>
<#list 1..num as i>
<#list 1..i as j>
${j} * ${i} = ${j*i}
</#list>
<br>
</#list>
</#macro>
<@cfb2 num=5></@cfb2>
2.5 nested 占位指令
nested 指令执⾏⾃定义指令开始和结束标签中间的模板⽚段。嵌套的⽚段可以包含模板中任意合法
的内容。
nested 占位指令
nested 相当于占位符,⼀般结合macro指令⼀起使⽤。
可以将⾃定义指令中的内容通过nested指令占位,当使⽤⾃定义指令时,会将占位内容显示。
<#macro test>
<#nested >
这是一段内容!
<#nested >
</#macro>
<@test>
<div>这是占位指令插入的内容!</div>
</@test>
2.6 import 导⼊指令
import 指令可以引⼊⼀个库。也就是说,它创建⼀个新的命名空间, 然后在那个命名空间中执⾏给定路径的模板。可以使⽤引⼊的空间中的指令。
commons.ftl
<#macro cfb3 num>
<#list 1..num as i>
<#list 1..i as j>
${j} * ${i} = ${j*i}
</#list>
<br>
</#list>
</#macro>
f05.ftl
<#import "commons.ftl" as com />
<@com.cfb3 num=5></@com.cfb3>
2.7 include 包含指令
可以使⽤ include 指令在你的模板中插⼊另外⼀个 FreeMarker 模板⽂件 。 被包含模板的输出格式是在 include 标签出现的位置插⼊的。 被包含的⽂件和包含它的模板共享变量,就像是被复制粘贴进去的⼀样。
<#--包含指令(引⼊其他⻚⾯⽂件) include-->
<#--html⽂件-->
<#include "test.html"> <#--freemarker⽂件-->
<#include "test.ftl"> <#--text⽂件-->
<#include "test.txt">

这篇博客详细介绍了FreeMarker的基本用法,包括数据类型的使用,如布尔、日期、数值、字符串、序列和哈希类型,并强调了FreeMarker不支持null值。此外,还深入探讨了FreeMarker的常见指令,如assign自定义变量、if-elseif-else逻辑判断、list遍历、macro自定义指令、nested占位、import导入和include包含指令,帮助读者更好地理解和运用FreeMarker模板语言。
695

被折叠的 条评论
为什么被折叠?



