SpringBoot之freemarker学习

  • application.yml文件配置

spring:
  freemarker:
    # 后缀名
    suffix: .ftl
    # 设置文档类型
    content-type: text/html
    # 设置页面编码格式
    charset: UTF-8
    # 设置页面缓存
    cache: false
    #req访问request
    request-context-attribute: req
    # 设置ftl文件路径
    template-loader-path: classpath:/templates
  • 插值

${...}: FreeMarker在输出时将其替换为大括号内表达式的实际值。它们被称为 插值
  • 指令

FTL标签(用于FreeMarker模板语言标签):
FTL标签有点类似于HTML标签,但它们是FreeMarker的指令,不会打印到输出。这些标签的名称以 #开头
  • ftl文件中的注释

<#-- freemarker的注释 -->
  • 静态文本

任何不是 FTL标签 或 插值 或 注释 的东西都被认为是静态文本
FreeMarker不会解释; 它只是按原样打印到输出 
  • if指令

<!-- 与 HTML标签结合使用 -->
<a href="...">${latestProduct.name}</a>
<a href="${latestProduct.url}">...</a>

<!-- 错误用法: -->
<#if ${user} == "Big Joe">...</#if>
<!-- 通常,指令或插值中的 未加引号的 单词 被视为对变量的引用-->
<#if user == "Big Joe">...</#if>
<!-- boolean型变量 -->
<#if protected>
  true
</#if>

  • if...else指令

<#if python.price < elephant.price >
    1
<#elseif elephant.price < python.price >
    2
<#else>
    3
</#if>
  • list指令

<table border=1>
    <#list animals as animal>
        <td>${animal.name}<td> 
        ${animal.price}
    </#list>
</table>

但是如果 lists碰巧有0个元素,它仍然会打印一个"<ul></ul>",而不是什么都不打印。
为避免这种情况,可以使用以下形式 list

<!-- 先判断 lists是否为空 -->
<#list fruits> 
    <ul> 
        <#items as fruit> 
            ${fruit}
            <#sep>and</#sep>    
        </#items> 
    </ul> 
<#else>
    fruits为空时执行这里的代码
</#list>

由于FreeMarker不解释(FTL标签、插值、FTL注释)之外的文本(即FreeMarker不识别HTML代码)

可以在HTML标签中的使用FTL标签

<div 
    <#if protected>
        class="protected"
    </#if > 
>
  • 内置函数

...

  • 处理未定义的变量

无论何时,都可以通过使用 ${user!默认值} 的方式来为未定义的变量指定默认值

<h1> Welcome ${user!"visitor"} </h1>

通过 user?? 来查询变量是否存在

<#if user??>
    <h1>Welcome ${user}</h1>
</#if>
如果您想测试Java方法是否已返回 null:
<#if foo.bar()??>

注意:

${animals.python.price!0}只有在 animals.python变量 肯定存在时,才能这么写

如果 animals或 python变量不存在,模板处理将以“未定义变量”错误停止。

为了防止这种情况,你必须写成 ${(animals.python.price)!0}

同样的逻辑, 应该写成 (animals.python.price)??  而不是 animals.python.price?? (animals和python可能未定义)

  • 一个FTL标签不能写在里面另一个FTL标签:

例如,这是错误的

<#if <#include 'foo'>='bar'>...</#if>
  • 注释可以放在FTL标签插补中:

例如:

<#list <#-- some comment... --> animals as <#-- again... --> animal>
  • 字符串拼接:

警告: 用户经常犯的错误是在不需要/不应该/不能使用的地方使用插值。

插值仅在 文本部分 和 指令的属性值为字符串时 起作用。例如:

<h1>${style}</h1>

<#assign s1 ="Hello ${style1}">
${s1}
<#assign s2 ="Hello " + style1>
${s2}
  • 字符串截取:
获取指定位的字符:
user[0] (结果将是一个长度为1的字符串; FTL没有单独的字符类型)

<#assign s = "ABCDEF">
${s[2..3]}
${s[2..<4]}
${s[2..*3]}
${s[2..*100]}
${s[2..]}

CD     第2位到第3位
CD     第2位到小于4
CDE    第2位往后数3位
CDEF   第2位往后数100位
CDEF   第2位开头的所有
  •  list 截取:
<#assign seq = ["A", "B", "C"]>

<#-- Not an error -->
<#list seq[2..*2] as i>
    ${i}
</#list> 

<#-- Not an error -->
<#list seq[3..*2] as i>
    ${i}
</#list> 

<#-- Not an error -->
<#list seq[3..] as i>
    ${i}
</#list>

 List集合:list = [1,2,3] ; list=[1..100] 表示 1 到 100 的集合,反之亦然。

Map集合:map = {"key" : "value" , "key2" : "value2"},key 必须是字符串哦

  • 可以使用与字符串相同的方式连接序列(+):
<#list [“Joe”,“Fred”] + [“Julia”,“Kate”] as user> 
    ${user} 
</#list>

<#list users + admins as person>

但结果序列的读取总是比原始的两个序列慢一点。
因此,在数十或数百次重复连接之后,结果对于读者来说可能是不切实际的慢。
  • 可以使用与字符串相同的方式连接哈希值 (+):

如果两个哈希值都包含相同的键,则+号右侧的哈希值优先

<#assign ages = {"Joe":23,"Fred":25} + {"Joe":30,"Julia":18}>
  • FreeMarker永远不会自动将字符串转换为数字: 

但它可以自动将数字转换为字符串

  • 只想要计算结果的整数部分:

这可以通过 int内置函数实现 : $ { - 1.999?int}

  • 比较运算符:

FreeMarker将>号字符解释 为FTL标记的结束字符,像 <#if x gt y>

lt替代<lte替代<=gt替代>, gte替代>=

将表达式放入括号中的是另一个技巧 <#if (x > y)>,尽管它被认为不那么优雅。

  • 内置函数

防止函数和变量进行名称冲突,使用问号(?)将函数与对象分开,而不是点(.

为简洁起见,如果方法没有参数,你必须省略()

比如,得到 path你必须写 的长度 path?length而不是 path?length()

  • 打印布尔值

与数字不同,布尔值没有普遍接受的格式,甚至在同一页面中也没有通用格式。

就像你在HTML页面上展示产品是否可以清洗一样,你几乎不想为访客展示“可洗:真实”,而是“可洗:是”。

因此,我们强制模板作者(通过${washable} 会报错)找出他的人类知识如何在给定位置显示布尔值。

${washable?string("yes", "no")}

${caching?string("Enabled", "Disabled")},

${heating?string("on", "off")}

  • 时间格式化 :

${date?string("yyyy-MM-dd")}

  • Map集合:

直接通过Key获取 Value值

${mapData["name"]}

如果你只需要列出的该键值对 Map,你可以写类似

<#list myMap as k, v>
    ${k}: ${v}
</#list>
  • 定义自己的指令:
<#macro greet>
    <font size="+2">Hello Joe!</font>
</#macro>

macro指令本身不会打印任何内容; 它只是创建宏变量

只有当您将变量用作指令时,才会执行<#macro greet>和 之间的事物 </#macro>(称为宏定义体

<@greet></@greet>
    或
<@greet/>

您可以通过编写@而不是 #在FTL标记中使用用户定义的指令

  • 定义自己的指令(带参数):
<#macro greet person > 
    <font size =“+ 2”> Hello $ {person}</ font> 
</#macro>
<@greet person ="Fred" />
在表达式中使用指令的输出(作为另一个指令的参数)?
使用assign指令将指令的输出捕获到变量中 。例如:

<#assign capturedOutput> <@ outputSomething /> </ #assign>
<@otherDirective someParam = capturedOutput />

Ctrl   +   F9  :  重新编译

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beOkWithAnything

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值