【FreeMarker】02 数据类型 Part1
1、布尔,需要转换字符串才能被模板渲染
2、日期,需要转换字符串才能被模板渲染
3、数值,渲染形式分为三种,数值,货币,百分比
4、字符,内置了工具函数
5、队列,渲染Java数组集合等类型
6、哈希,渲染Java的Map类型
一、布尔类型
package cn.zeal4j.servlet.freemarker;
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;
/**
* @author Administrator
* @file IntelliJ IDEA FreeMarker
* @create 2020 09 21 11:21
*/
@WebServlet("fm-02")
public class FtlServlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("flag", true);
req.getRequestDispatcher("freemarker-templates/fmt-02.ftl").forward(req, resp);
}
}
模板代码:
<h5>Boolean</h5>
${flag}
访问Servlet直接报错

模板不支持类型转换,可以使用?C的方式转换为字符串进行渲染
更改之后:
<h5>Boolean</h5>
${flag?c}

还支持自定义的返回的字符串
<h5>Boolean</h5>
<p>使用?c的方式 -> ${flag?c}</p>
<p>使用?string(自定义字符串1,自定义字符串2)的方式 -> ${flag?string("yes you are !", "no offcourse not !")}</p>

也可以直接使用string
<p>使用?string的方式 -> ${flag?string}</p>
打印:
使用?string的方式 -> true
FreeMarker 2.3.23版本支持then函数,类似string(true-content, false-content)一样
<p>使用?then的方式 -> ${flag?then("okey donkey", "no way")}</p>
打印:
使用?then的方式 -> okey donkey
二、日期类型
package cn.zeal4j.servlet.freemarker;
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.Date;
/**
* @author Administrator
* @file IntelliJ IDEA FreeMarker
* @create 2020 09 21 11:21
*/
@WebServlet("fm-02")
public class FtlServlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("flag", true);
req.setAttribute("today", new Date());
req.getRequestDispatcher("freemarker-templates/fmt-02.ftl").forward(req, resp);
}
}
模板代码:
<h5>Date & Time</h5>
<p>直接输出 ${today} </p>
同样的也是不支持的 【注意模板foo的名称,不要和一些函数名称或者变量名称同名】

支持下面这些方式:
<h5>Date & Time</h5>
<p>输出年月日 -> ${today?date} </p>
<p>输出时分秒 -> ${today?time} </p>
<p>输出全部 -> ${today?datetime } </p>

除此之外也支持自定义格式
<p>输出自定义格式 -> ${today?string("yyyy年 - MM月 - dd日 HH时 : mm分 : ss秒")} </p>
打印:
输出自定义格式 -> 2020年 - 09月 - 21日 11时 : 45分 : 27秒
参考手册地址:
http://freemarker.foofun.cn/ref_directive_function.html
三、数值类型
请求域数据:
req.setAttribute("IntegerNumber", 100);
req.setAttribute("FloatNumber", 100.233F);
模板:
<h3>Number</h3>
<p>整数 ${IntegerNumber} </p>
<p>浮点 ${FloatNumber} </p>
效果:可以直接打印
转字符串
<hr>
<p>整数[转换为字符输出] ${IntegerNumber?c} </p>
<p>浮点[转换为字符输出] ${FloatNumber?c} </p>

货币修饰
<hr>
<p>整数[货币修饰] ${IntegerNumber?string.currency} </p>
<p>浮点[货币修饰] ${FloatNumber?string.currency} </p>

百分比转换
<hr>
<p>整数[百分比] -> ${IntegerNumber?string.percent} </p>
<p>浮点[百分比] -> ${FloatNumber?string.percent} </p>

指定小数位输出:【支持四舍五入】
<hr>
<p>浮点[自定义小数位保留,仅浮点有效] -> ${FloatNumber?string["0.######"]} </p>

四、字符串类型:
不赘述了

五、空值处理
FreeMarker不允许请求域值为NULL的情况,或者是不存在此请求域
<h3>NULL Handle</h3>
<p>渲染一个没有的请求域数据 ${unknow} </p>

或者是存NULL的渲染
req.setAttribute("nullValue", null);
模板:
<h3>NULL Handle</h3>
<#--<p>渲染一个没有的请求域数据 ${unknow} </p>-->
<p>渲染一个NULL的请求域数据 ${nullValue} </p>

但是空字符串是允许的
req.setAttribute("emptyValue", "");
模板:
<h3>NULL Handle</h3>
<#--<p>渲染一个没有的请求域数据 ${unknow} </p>-->
<p>渲染一个Empty的请求域数据 ${emptyValue} </p>

FreeMarker判NULL处理:
<p>渲染不存在或者值为NULL的数据时,加上!就不会报错了,显示则为空 ${notExist!}</p>

或者是显示指定字符串
<p>渲染不存在或者值为NULL的数据时,加上!和要输出的字符串,显示定义的字符串 -> ${stillNotExist!"该内容不存在!!!"}</p>


浙公网安备 33010602011771号