FreeMarker基本用法

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

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} &nbsp;
        </#list>
        <br>
    </#list>
</#macro>
<@cfb></@cfb>
<br>
<#-- 设置动态参数 -->
<#macro cfb2 num>
    <#list 1..num as i>
        <#list 1..i as j>
            ${j} * ${i} = ${j*i} &nbsp;
        </#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} &nbsp;
        </#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">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值