FreeMarker手册

FreeMarker手册
一、智能的国际化和本地化
    字符集智能化(内部使用UNICODE)
    数字格式本地化敏感
    日期和时间格式本地化敏感
    非US字符集可以用作标识(如变量名)
    多种不同语言的相同模板
    
二、数据类型
    布尔型:等价于 Java 的 Boolean 类型,不同的是不能直接输出,可转换为字符串输出
    日期型:等价于 java 的 Date 类型,不同的是不能直接输出,需要转换成字符串再输出
    数值型:等价于 java 中的 int,float,double 等数值类型
    有三种显示形式:数值型(默认)、货币型、百分比型
    字符型:等价于 java 中的字符串,有很多内置函数
    sequence 类型:等价于 java 中的数组,list,set 等集合类型
    hash 类型:等价于 java 中的 Map 类型

三、语法
    1、注释
        <#-- freemarker 注释语法 -->
    
    2、布尔类型
        <#--
            数据类型:布尔类型
                在freemarker中布尔类型不能直接输出;如果输出要先转成字符串
                方式一:?c
                方式二:?string 或 ?string("true时的文本","false时的文本")
        -->
        ${flag?c}
        ${flag?string}
        ${flag?string("yes","no")}
        
    3、日期类型
        <#--
            数据类型:日期类型
                在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>
        
    4、数值类型
        <#--
            数据类型:数值类型
                在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>
    
    5、字符串类型
        <#--
            数据类型:字符串类型
                在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")
        -->
        <#-- 直接输出 -->
        ${msg1} - ${msg2} <br>
        ${msg1?string} - ${msg2?string} <br>
        <#-- 1. 截取字符串(左闭右开) ?substring(start,end) -->
        ${msg2?substring(1,4)} <br>
        <#-- 2. 首字母小写输出 ?uncap_first -->
        ${msg1?uncap_first} <br>
        <#-- 3. 首字母大写输出 ?cap_first -->
        ${msg2?cap_first} <br>
        <#-- 4. 字母转小写输出 ?lower_case -->
        ${msg1?lower_case} <br>
        <#-- 5. 字母转大写输出 ?upper_case -->
        ${msg1?upper_case} <br>
        <#-- 6. 获取字符串长度 ?length -->
        ${msg1?length} <br>
        <#-- 7. 是否以指定字符开头(boolean类型) ?starts_with("xx")?string -->
        ${msg1?starts_with("H")?string} <br>
        <#-- 8. 是否以指定字符结尾(boolean类型) ?ends_with("xx")?string -->
        ${msg1?ends_with("h")?string} <br>
        <#-- 9. 获取指定字符的索引 ?index_of("xxx") -->
        ${msg1?index_of("e")} <br>
        <#-- 10. 去除字符串前后空格 ?trim -->
        ${msg1?trim?length} <br>
        <#-- 11. 替换指定字符串 ?replace("xx","xxx") -->
        ${msg1?replace("o","a")}<br>
    
    6、字符串空值处理
        <#-- 如果值不存在,直接输出会报错 -->
        <#--${str}-->
        <#-- 使用!,当值不存在时,默认显示空字符串 -->
        ${str!}<br>
        <#-- 使用!"xx",当值不存在时,默认显示指定字符串"xx" -->
        ${str!"这是一个默认值"}<br>
        <#-- 使用??,判断字符串是否为空;返回布尔类型。如果想要输出,需要将布尔类型转换成字符串 -->
        ${(str??)?string}<br>
    
    7、数组【列表】
        <#--
            数据类型:序列类型 (数组、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} <br>
        </#list>
        List的size:${cityList?size} <br>
        <#-- 倒序输出 -->
        <#list cityList?reverse as city >
            ${city} -
        </#list>
        <#-- 升序输出 -->
        <#list cityList?sort as city >
            ${city} -
        </#list>
        <br>
        <#-- 降序输出 -->
        <#list cityList?sort?reverse as city >
            ${city} -
        </#list>
        <hr>
        <#-- 【JavaBean集合】 -->
        <#list userList as user>
            编号:${user.id}&nbsp;&nbsp;
            姓名:${user.name}&nbsp;&nbsp;
            年龄:${user.age}&nbsp;&nbsp;
            <br>
        </#list>
        <#-- 按照指定字段名排序 -->
        <#list userList?sort_by("age") as user>
            ${user.name} |
        </#list>

    8、hash类型
        <#--
            数据类型:hash类型
                key遍历输出
                    <#list hash?keys as key>
                        ${key} -- ${hash[key]}        关键字:值
                    </#list>
                value遍历输出
                    <#list hash?values as value>
                        ${value}
                    </#list>
        -->
        <#-- key遍历输出 -->
        <#list cityMap?keys as key>
            ${key} -- ${cityMap[key]} <br>
        </#list>
        <#-- value遍历输出 -->
        <#list cityMap?values as value>
            ${value} |
        </#list>
    
四、常用指令
    1) assign 自定义变量指令
        <#--
            assign 自定义变量指令
                语法:
                    <#assign 变量名=值>
                    <#assign 变量名=值 变量名=值> (定义多个变量)
        -->
        <#assign str="hello">
        ${str} <br>
        <#assign num=1 names=["zhangsan","lisi","wangwu"] >
        ${num} -- ${names?join(",")}
    
    2) if elseif else 逻辑判断指令
        <#--
           if, else, elseif 逻辑判断指令
            格式:
            <#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>
    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 = ["张三","李四","王五"]>
        <#-- 遍历序列 -->
        <#list users as user>
            ${user}
        </#list>
        <br>
        <#--判断数据不为空,再执行遍历 (如果序列不存在,直接遍历会报错)-->
        <#if users2??>
            <#list users2 as user>
                ${user}
            </#list>
        </#if>
        <br>
        <#assign users3 = []>
        <#-- 当序列没有数据项时,使用默认信息 -->
        <#list users3 as user>
            ${user}
        <#else>
            当前没有数据!
        </#list>

    4) 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>
        <hr>
        <#-- 定义有参数的自定义指令 -->
        <#macro queryUserByName uname>
            通过用户名查询用户信息 - ${uname}
        </#macro>
        <#-- 使用指令,并传递参数 -->
        <@queryUserByName uname="admin"></@queryUserByName> <br>
        <#-- 定义有多个参数的自定义指令 -->
        <#macro queryUserByParams uname uage>
            通过多个餐宿查询用户信息 - ${uname} - ${uage}
        </#macro>
        <#-- 使用指令,并传递多个参数 -->
        <@queryUserByParams uname="admin" uage=18></@queryUserByParams> <br>
        <hr>
        <#-- 自定义指令中包含内置指令 -->
        <#macro cfb>
            <#list 1..9 as i>
                <#list 1..i as j>
                    ${j}*${i}=${j*i}&nbsp;
                </#list>
                <br>
            </#list>
        </#macro>
        <@cfb></@cfb>
        <@cfb></@cfb>
        <#-- 动态数据 -->
        <#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>
    
    5) nested占位指令
        <#--
            nested 占位指令
                nested 相当于占位符,一般结合macro指令一起使用。
                可以将自定义指令中的内容通过nested指令占位,当使用自定义指令时,会将占位内容显示。
                下面的例子中输出两次:"这是文本后面的内容!"
        -->
        <#macro test>
            这是一段文本!
            <#nested>
            <#nested>
        </#macro>
        <@test><h4>这是文本后面的内容!</h4></@test>
        
    6) import导入指令
        新建一个commons.ftl模板文件
        <#macro cfb>
            <#list 1..9 as i>
                <#list 1..i as j>
                    ${j}*${i}=${j*i}&nbsp;
                </#list>
                <br>
            </#list>
        </#macro>
        在其他ftl页面中通过import导入commons.ftl的命名空间,使用该命名空间中的指令!
        <#-- 导入命名空间 -->
        <#import "commons.ftl" as common>
        <#-- 使用命名空间common中的指令cfb -->
        <@common.cfb></@common.cfb>

    7) include指令
        可以使用 include 指令在你的模板中插入另外一个 FreeMarker 模板文件 。 
        被包含模板的输出格式是在 include 标签出现的位置插入的。 
        被包含的文件和包含它的模板共享变量,就像是被复制粘贴进去的一样。
        <#--包含指令(引入其他页面文件) include-->
        <#--html文件-->
        <#include "test.html">
        <#--freemarker文件-->
        <#include "test.ftl">
        <#--text文件-->
        <#include "test.txt">

五、定义模板
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <#-- 新闻标题 -->
    <h1>${title}</h1>
    <p>
        新闻来源:${source} &nbsp; 发布时间:${pubTime?string("yyyy-MM-dd HH:mm")}
    </p>
    <#-- 新闻内容 -->
    <p>
        ${content}
    </p>
    
六、运算符
    1、算数运算符
        <!--
            算术运算
                +、-、*、/、%
        -->
        <#assign a1 = 8 a2 = 2 >
        ${a1} + ${a2} = ${a1 + a2} <br/>
        ${a1} - ${a2} = ${a1 - a2} <br/>
        ${a1} * ${a2} = ${a1 * a2} <br/>
        ${a1} / ${a2} = ${a1 / a2} <br/>
        ${a1} % ${a2} = ${a1 % a2} <br/>
        <!--字符串运算-->
        ${"hello" + "," + "freemarker"}
        
    2、逻辑运算符
        <#--
            逻辑运算符
                &&、||、!
        -->
    
    3、比较运算符
    <#--
        比较运算符
            > (gt): 大于号,推荐使用 gt
            < (lt): 小于号,推荐使用 lt
            >= (gte): 大于等于, 推荐是用 gte
            <= (lte): 小于等于,推荐使用 lte
            == : 等于
            != : 不等于
    -->

    4、空值运算符
    <#--
        空值运算符
            1. ??:判断是否为空,返回布尔类型
            如果不为空返回 false, 如果为空返回 true,不能直接输出
            ${(name??)?string}
        2. !: 设置默认值,如果为空,则设置默认值
            1. 设置默认为空字符串:
            ${name!}
            2. 设置指定默认值
            ${name!'zhangsan'}
    -->
 

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值