文章目录
- FreeMarker 数据类型
- 模板中的数据类型:
- 布尔类型
- 日期类型
- 数值类型
- 字符串类型
- 字符串空值情况处理
- sequence 类型
- 序列类型 (数组、List、Set)
- 通过list指令输出序列
- hash 类型
- 相当于java里面的Map操作
- 通过list指令输出序列
- 总的代码和页面效果
FreeMarker 数据类型
模板中的数据类型:
- 布尔型:
等价于 Java 的 Boolean 类型,不同的是不能直接输出,可转换为字符串输出 - 日期型:
等价于 java 的 Date 类型,不同的是不能直接输出,需要转换成字符串再输出 - 数值型:
等价于 java 中的 int,float,double 等数值类型
有三种显示形式:数值型(默认)、货币型、百分比型 - 字符型:
等价于 java 中的字符串,有很多内置函数 - sequence 类型:
等价于 java 中的数组,list,set 等集合类型 - hash 类型:
等价于 java 中的 Map 类型
布尔类型
- 在Servlet中设置布尔类型的数据-----FreeMarker02.java
/**
* FreeMarker 数据类型
*/
@WebServlet("/f02")
public class FreeMarker02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 布尔类型 */
req.setAttribute("flag",true);
// 请求转发跳转到指定的模板页面 template/f02.ftl
req.getRequestDispatcher("template/f02.ftl").forward(req,resp);
}
}
- 获取数据—f02.ftl
<h4>FreeMarker 数据类型</h4>
<#--
FreeMarker 数据类型
布尔类型
在freemarker页面中不能直接输出,如果要输出需要转换成字符串
方式一: ?c
方式二: ?string 或 ?string('为true时显示的内容','为false时显示的内容')
-->
<h5>布尔类型</h5>
${flag?c} <br>
${flag?string} <br>
${flag?string('yes','no')} <br>
${flag?string('喜欢','不喜欢')} <br>
<hr>
3.页面
日期类型
- 在Servlet中设置日期类型的数据
// 日期类型
request.setAttribute("createDate",new Date());
- 获取数据
<#--
数据类型:日期类型
在freemarker中日期类型不能直接输出;如果输出要先转成日期型或字符串
1. 年月日 ?date
2. 时分秒 ?time
3. 年月日时分秒 ?datetime
4. 指定格式 ?string("自定义格式")
y:年 M:月 d:日
H:时 m:分 s:秒
-->
<#-- 输出日期格式 -->
${createDate?date} <br>
<#-- 输出时间格式 -->
${createDate?time} <br>
<#-- 输出日期时间格式 -->
${createDate?datetime} <br>
<#-- 输出格式化日期格式 -->
${createDate?string("yyyy年MM月dd日 HH:mm:ss")} <br>
3.页面
数值类型
- 在Servlet设置数值型的数据
// 数值类型
request.setAttribute("age",18); // 数值型
request.setAttribute("salary",10000); // 数值型
request.setAttribute("avg",0.545); // 浮点型
- 获取数据
<#--
数据类型:数值类型
在freemarker中数值类型可以直接输出;
1. 转字符串
普通字符串 ?c
货币型字符串 ?string.currency
百分比型字符串 ?string.percent
2. 保留浮点型数值指定小数位(#表示一个小数位)
?string["0.##"]
-->
<#-- 直接输出数值型 -->
${age} <br>
${salary} <br>
<#-- 将数值转换成字符串输出 -->
${salary?c} <br>
<#-- 将数值转换成货币类型的字符串输出 -->
${salary?string.currency} <br>
<#-- 将数值转换成百分比类型的字符串输出 -->
${avg?string.percent} <br>
<#-- 将浮点型数值保留指定小数位输出 (##表示保留两位小数) -->
${avg?string["0.##"]} <br>
3.页面
字符串类型
- 在Servlet设置字符串类型的数据
/* 字符串类型 */
req.setAttribute("msg","Hello");
req.setAttribute("msg2","freemarker");
- 获取数据
<#--
FreeMarker 数据类型
字符串类型
在freemarker中字符串类型可以直接输出;
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_of("xx")
10. 去除字符串前后空格 ?trim
11. 替换指定字符串 ?replace("xx","xx")
-->
<h5>字符串类型</h5>
${msg} -- ${msg2} <br>
${msg?string} -- ${msg2?string} <br>
<#-- 1. 截取字符串(左闭右开) ?substring(start,end) -->
${msg?substring(0,2)} <br>
<#-- 2. 首字母小写输出 ?uncap_first -->
${msg?uncap_first} <br>
<#-- 3. 首字母大写输出 ?cap_first -->
${msg2?cap_first} <br>
<#-- 4. 字母转小写输出 ?lower_case -->
${msg?lower_case} <br>
<#-- 5. 字母转大写输出 ?upper_case -->
${msg2?upper_case} <br>
<#--6. 获取字符串长度 ?length-->
${msg?length} <br>
<#--7. 是否以指定字符开头(boolean类型) ?starts_with("xx")?string-->
${msg?starts_with("a")?string} <br>
<#--8. 是否以指定字符结尾(boolean类型) ?ends_with("xx")?string-->
${msg?ends_with("o")?string} <br>
<#--9. 获取指定字符的索引 ?index_of("xx")-->
${msg2?index_of("m")} <br>
<#--10. 去除字符串前后空格 ?trim-->
${msg2?trim}<br>
<#--11. 替换指定字符串 ?replace("xx","xx")-->
${msg?replace("He","We")}<br>
<hr>
字符串空值情况处理
FreeMarker 的变量必须赋值,否则就会抛出异常。而对于 FreeMarker 来说,null 值和不存在的变量是完全一样的,因为 FreeMarker 无法理解 null 值。
FreeMarker 提供两个运算符来避免空值:
- ! :指定缺失变量的默认值 ${value!}:如果value值为空,则默认值是空字符串
${value!“默认值”}:如果value值为空,则默认值是字符串"默认值" - ?? :判断变量是否存在 如果变量存在,返回 true,否则返回 false ${(value??)?string}
<#-- 如果值不存在,直接输出会报错 -->
<#–${str}–>
<#-- 使用!,当值不存在时,默认显示空字符串 -->
${str!}
<#-- 使用!“xx”,当值不存在时,默认显示指定字符串 -->
${str!“这是一个默认值”}
<#-- 使用??,判断字符串是否为空;返回布尔类型。如果想要输出,需要将布尔类型转换成字符串 -->
${(str??)?string}
- 在Servlet设置字符串类型的数据
// 空数据
req.setAttribute("str1",null);
req.setAttribute("str2","");
- 获取数据
<#--
空值处理
FreeMarker 提供两个运算符来避免空值:
① ! :指定缺失变量的默认值
${value!}:如果value值为空,则默认值是空字符串
${value!"默认值"}:如果value值为空,则默认值是字符串"默认值"
② ?? :判断变量是否存在
如果变量存在,返回 true,否则返回 false
${(value??)?string}
-->
<#-- 不存在的值,报错 -->
<#--${aa}-->
<#-- 值为null的数据 -->
<#--${str1} <br>-->
<#-- 值为空字符串的数据 -->
${str2} <br>
<#-- ① ! :指定缺失变量的默认值 -->
${str1!} <br> <#--如果value值为空,则默认值是空字符串-->
${str1!"str1的数据不存在"} <br> <#--如果value值为空,则默认值是字符串"默认值"-->
<#-- ② ?? :判断变量是否存在 -->
${(str1??)?c}
<hr>
3.页面
sequence 类型
序列类型 (数组、List、Set)
通过list指令输出序列
<#list 序列名 as 元素名> ${元素名} </#list>
- 在Servlet中设置序列类型的数据
// 序列类型 (数组、List、Set)
// 数组操作
String[] stars = new String[]{"周杰伦","林俊杰","陈奕迅","五月天"};
request.setAttribute("stars",stars);
// List操作
List<String> citys = Arrays.asList("上海","北京","杭州","深圳");
request.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));
request.setAttribute("userList",userList);
- 获取数据
<#--
FreeMarker 数据类型
序列类型(数组、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>
获取序列的长度:${stars?size} <br>
获取第一个元素:${stars?first} <br>
获取最后一个元素: ${stars?last} <br>
<hr>
<#-- List操作 -->
<#list cityList as city>
${city} -
</#list>
<br>
<#--倒序输出 序列名?reverse-->
<#list cityList?reverse as city>
${city} -
</#list>
<br>
<#--升序输出 序列名?sort-->
<#list cityList?sort as city>
${city} -
</#list>
<br>
<#--降序输出 序列名?sort?reverse-->
<#list cityList?sort?reverse as city>
${city} -
</#list>
<br>
<hr>
<#list userList as user >
编号:${user.userId} 姓名:${user.uname} ${user.uage} <br>
</#list>
<br>
<#list userList?sort_by("uage") as user >
编号:${user.userId} 姓名:${user.uname} ${user.uage} <br>
</#list>
<br>
<hr>
3.页面
hash 类型
相当于java里面的Map操作
通过list指令输出序列
获取map的key及key对应的value <#list hash?keys as key> ${key} - ${hash[key]} </#list> 获取map的value <#list hash?values as value> ${value} </#list>
- 在Servlet中设置hash类型的数据
// Map操作
Map<String,String> cityMap = new HashMap<>();
cityMap.put("sh","上海");
cityMap.put("bj","北京");
cityMap.put("sz","深圳");
request.setAttribute("cityMap",cityMap);
- 获取数据
<#--
FreeMarker 数据类型
hash类型
通过list指令输出
获取map的key及key对应的value
<#list hash?keys as key>
${key} - ${hash[key]}
</#list>
获取map的value
<#list hash?values as value>
${value}
</#list>
-->
<#-- key遍历输出 -->
<#list cityMap?keys as key>
${key} - ${cityMap[key]} <br>
</#list>
<br>
<#-- value遍历输出 -->
<#list cityMap?values as value>
${value} --
</#list>
3.页面
总的代码和页面效果
- FreeMarker02.java
import com.xxxx.entity.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
/**
* FreeMarker 数据类型
*/
@WebServlet("/f02")
public class FreeMarker02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 布尔类型 */
req.setAttribute("flag",true);
/* 日期类型 */
req.setAttribute("createDate",new Date());
/* 数值类型 */
req.setAttribute("age",18);
req.setAttribute("num",10000);
req.setAttribute("avg",5.5467);
/* 字符串类型 */
req.setAttribute("msg","Hello");
req.setAttribute("msg2","freemarker");
// 空数据
req.setAttribute("str1",null);
req.setAttribute("str2","");
/* 序列类型 (数组、List、Set) */
// 数组
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操作
Map<String,String> cityMap = new HashMap<>();
cityMap.put("sh","上海");
cityMap.put("bj","北京");
cityMap.put("sz","深圳");
req.setAttribute("cityMap",cityMap);
// 请求转发跳转到指定的模板页面 template/f02.ftl
req.getRequestDispatcher("template/f02.ftl").forward(req,resp);
}
}
- f02.ftl
<h4>FreeMarker 数据类型</h4>
<h5>布尔类型</h5>
${flag?c} <br>
${flag?string} <br>
${flag?string('yes','no')} <br>
${flag?string('喜欢','不喜欢')} <br>
<hr>
<h5>日期类型</h5>
${createDate?date} <br>
${createDate?time} <br>
${createDate?datetime} <br>
${createDate?string("yyyy/MM/dd HH:mm:ss")} <br>
<hr>
<h5>数值类型</h5>
${age} <br>
${num} <br>
${avg} <br>
<#-- 将数值转换成字符串类型 -->
${num?c} <br>
<#-- 将数值转换成货币类型字符串 -->
${num?string.currency} <br>
<#-- 将数值转换成百分比类型的字符串 -->
${avg?string.percent} <br>
<#-- 将浮点型的数值转换成指定小数位输出 -->
${avg?string["0.##"]}<br>
<hr>
<h5>字符串类型</h5>
${msg} -- ${msg2} <br>
${msg?string} -- ${msg2?string} <br>
<#-- 1. 截取字符串(左闭右开) ?substring(start,end) -->
${msg?substring(0,2)} <br>
<#-- 2. 首字母小写输出 ?uncap_first -->
${msg?uncap_first} <br>
<#-- 3. 首字母大写输出 ?cap_first -->
${msg2?cap_first} <br>
<#-- 4. 字母转小写输出 ?lower_case -->
${msg?lower_case} <br>
<#-- 5. 字母转大写输出 ?upper_case -->
${msg2?upper_case} <br>
<#--6. 获取字符串长度 ?length-->
${msg?length} <br>
<#--7. 是否以指定字符开头(boolean类型) ?starts_with("xx")?string-->
${msg?starts_with("a")?string} <br>
<#--8. 是否以指定字符结尾(boolean类型) ?ends_with("xx")?string-->
${msg?ends_with("o")?string} <br>
<#--9. 获取指定字符的索引 ?index_of("xx")-->
${msg2?index_of("m")} <br>
<#--10. 去除字符串前后空格 ?trim-->
${msg2?trim}<br>
<#--11. 替换指定字符串 ?replace("xx","xx")-->
${msg?replace("He","We")}<br>
<hr>
<#-- 不存在的值,报错 -->
<#--${aa}-->
<#-- 值为null的数据 -->
<#--${str1} <br>-->
<#-- 值为空字符串的数据 -->
${str2} <br>
<#-- ① ! :指定缺失变量的默认值 -->
${str1!} <br> <#--如果value值为空,则默认值是空字符串-->
${str1!"str1的数据不存在"} <br> <#--如果value值为空,则默认值是字符串"默认值"-->
<#-- ② ?? :判断变量是否存在 -->
${(str1??)?c}
<hr>
<#-- 数组操作 -->
<#list stars as star>
下标:${star?index} - 姓名:${star} <br>
</#list>
获取序列的长度:${stars?size} <br>
获取第一个元素:${stars?first} <br>
获取最后一个元素: ${stars?last} <br>
<hr>
<#-- List操作 -->
<#list cityList as city>
${city} -
</#list>
<br>
<#--倒序输出 序列名?reverse-->
<#list cityList?reverse as city>
${city} -
</#list>
<br>
<#--升序输出 序列名?sort-->
<#list cityList?sort as city>
${city} -
</#list>
<br>
<#--降序输出 序列名?sort?reverse-->
<#list cityList?sort?reverse as city>
${city} -
</#list>
<br>
<hr>
<#list userList as user >
编号:${user.userId} 姓名:${user.uname} ${user.uage} <br>
</#list>
<br>
<#list userList?sort_by("uage") as user >
编号:${user.userId} 姓名:${user.uname} ${user.uage} <br>
</#list>
<br>
<hr>
<#-- key遍历输出 -->
<#list cityMap?keys as key>
${key} - ${cityMap[key]} <br>
</#list>
<br>
<#-- value遍历输出 -->
<#list cityMap?values as value>
${value} --
</#list>
- 页面