Apache FreeMarker

Posted 遇事不决,可问神奇海螺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache FreeMarker相关的知识,希望对你有一定的参考价值。

基本语法

${…}:
    称为interpolations,FreeMarker会在输出时用实际值进行替代。

<#…>:
    FTL标记(FreeMarker模板语言标记),类似于html标记,为了与HTML标记区分

<@>:
    宏,自定义标签


1, 文本: 直接输出的部分

2, 注释: <#-- --> 格式部分,不会输出

3, 插值: 即 ${} 或 #{} 格式的部分,将使用数据模型中的部分替代输出

    FreeMarker的插值有如下两种类型:
        1, 通用插值 ${}
        2, 数字格式化插值: #{expr} 或 #{expr;format}

    通用插值:

        对于通用插值,又可以分为以下4种情况:
        
        1, 插值结果为字符串值: 直接输出表达式结果

            字符串输出: ${"Hello ${name}"} / ${"Hello " + name}

            字符串截取: 
                通过下标直接获取下标对应的字母: ${name[2]}
                起点下标..结尾下标截取字符串: ${name[0..5]}

        2, 插值结果为数字值: 根据默认格式将表达式结果转换成文本输出
            <#assign answer=42/>
            ${answer?string.number} //42
            ${answer?string.percent}    //4200%

        3, 插值结果为日期值: 根据默认格式将表达式结果转换成文本输出
            ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}   //2008-04-08 08:08:08 Pacific Daylight Time
            ${lastUpdated?string("EEE, MMM d, yy")} //Tue, Apr 8, 03
            ${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}  //Tuesday, April 08, 2003, 08:08:08 PM (PDT)

        4, 插值结果为布尔值: 根据默认格式将表达式结果转换成文本输出
            <#assign foo=true/>
            ${foo?string("yes", "no")}  //yes

    数字格式化插值:

        数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:
            mX:小数部分最小X位
            MX:小数部分最大X位
            <#assign y=4/>
            #{x; m1M2}  //4.0

4, FTL指令: FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出 

    在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的:
        1, 开始标签: <#directivename parameter>
        2, 结束标签: </#directivename>
        3, 空标签: <#directivename parameter/>

        使用标签时前面的符号 # 也可能变成 @, 如果该指令是一个用户指令而不是系统内建指令时, 应将 # 符号改成 @ 符号

    <#assign/>:
        在前面已经使用了多次,它用于为该模板页面创建或替换一个顶层变量

    <#setting name=value>:
        用来设置整个系统的一个环境:<#setting locale="en_US"> 

    比较运算符:
        <#if number1 + number2 gte 12 || number1 - number2 lt 6>
            "*" : ${number1 * number2}
        <#else>
            "/" : ${number1 / number2}
        </#if>

    内建函数:
        <#assign data = "abcd">
            第一个字母大写:${data?cap_first}
            所有字母小写:${data?lower_case}
            所有字母大写:${data?upper_case}
            html:对字符串进行HTML编码
            trim:去掉字符串前后的空白字符
        <#assign floatData = 12.34>
            数值取整数:${floatData?int}
        获取集合的长度:${users?size}
        时间格式化:${dateTime?string("yyyy-MM-dd")}

    空判断和对象集合:

        !   指定缺失变量的默认值;一般配置变量输出使用
        ??   判断变量是否存在。一般配合if使用 <#if value??></#if>

        <#if users??>
        <#list users as user >
            ${user.id} - ${user.name}
        </#list>
        <#else>
            ${user!"变量为空则给一个默认值"}
        </#if>

    Map集合:
        <#assign mapData={"name": "程序员", "salary": 15000}>

            直接通过 Key 获取 Value 值: ${mapData["name"]}

            通过Key遍历Map:
                <#list mapData?keys as key>
                    Key: ${key} - Value: ${mapData[key]}
                </#list>

            通过Value遍历Map:
                <#list mapData?values as value>
                    Value: ${value}
                </#list>

    List集合:
        <#assign listData=["ITDragon", "blog", "is", "cool"]>
        <#list listData as value>${value}</#list>

    include指令:
        引入其他文件:<#include "otherFreeMarker.ftl"/>

    macro宏指令:

        <#macro mo>
            定义无参数的宏macro -- ${name}
        </#macro>
        使用宏macro: <@mo/>
    
        <#macro moArgs a b c>
            定义带参数的宏macro -- ${a+b+c}
        </#macro>
        使用带参数的宏macro: <@moArgs a=1 b=2 c=3/>

    noparse指令:
        指定FreeMarker不处理该指定里包含的内容
        <#noparse>…</#noparse>

Springboot + Freemarker 集成配置

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-freemarker</artifactId>  
</dependency> 

Freemarker 页面目录配置

spring:
    mvc:
        view:
            prefix: /templates/
            suffix: .ftl

以上是关于Apache FreeMarker的主要内容,如果未能解决你的问题,请参考以下文章

Apache FreeMarker

freemarker

Spring Boot + Apache Camel + Freemarker 自定义模板加载器

apache-freemarker-2.3.26

spring+freemarker+redis

使用FreeMarker生成Word文档