Freemarker个人学习笔记

1、模板

  • ${…}: FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为 interpolation(插值,译者注)。
  • FTL 标签 (FreeMarker模板的语言标签): FTL标签和HTML标签有一些相似之处,但是它们是FreeMarker的指令,是不会在输出中打印的。 这些标签的名字以 # 开头。(用户自定义的FTL标签则需要使用 @ 来代替 #,但这属于更高级的话题了。)
  • 注释: 注释和HTML的注释也很相似, 但是它们使用 <#-- and --> 来标识。 不像HTML注释那样,FTL注释不会出现在输出中(不出现在访问者的页面中), 因为 FreeMarker会跳过它们。

2、基本指令

(1)if指令

<html> 
<head> 
    <title>Welcome!</title>
</head> 
<body> 
    <h1> 
        Welcome ${user}
        <#if user == "Big Joe">, 
            our beloved leader
        </#if>! 
    </h1> 
    <p>Our latest product: 
    <a href="${latestProduct.url}">${latestProduct.name}</a>! 
</body> 
</html>
<#if animals.python.price == 0> 
    Pythons are free today! 
</#if>


<#if animals.python.price < animals.elephant.price> 
    Pythons are cheaper than elephants today. 
<#elseif animals.elephant.price < animals.python.price> 
    Elephants are cheaper than pythons today. 
<#else> 
    Elephants and pythons cost the same today. 
</#if>

(2)list指令

list 指令的一般格式为: <#list sequence as loopVariable>repeatThis</#list>。 repeatThis 部分将会在给定的 sequence 遍历时在每一项中重复, 从第一项开始,一个接着一个。在所有的重复中, loopVariable 将持有当前遍历项的值。 这个变量仅存在于 <#list …> 和 </#list> 标签内。

<p>We have these animals: 
<table border=1> 
    <#list animals as animal> 
        <tr><td>${animal.name}<td>${animal.price} Euros 
    </#list> 
</table>

//输出
<p>We have these animals: 
<table border=1> 
    <tr><td>mouse<td>50 Euros 
    <tr><td>elephant<td>5000 Euros 
    <tr><td>python<td>4999 Euros 
</table>

(3)include指令

//将版权信息单独存放在页面文件 copyright_footer.html 中
<hr> 
<i> Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
<br>
All Rights Reserved. </i>


<html> 
<head> 
    <title>Test page</title> 
</head> 
<body> 
    <h1>Test page</h1> 
    <p>Blah blah... 
    <#include "/copyright_footer.html"> 
</body> 
</html>


//最终输出为:
<html> 
<head> 
    <title>Test page</title> 
</head> 
<body> 
    <h1>Test page</h1> 
    <p>Blah blah... 
    <hr> 
    <i> Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
    All Rights Reserved. 
    <br>
    </i> 
</body> 
</html>

//传递参数到index.ftl
<#assign flag="1">
<#include "/index.ftl">

(4)使用内建函数

为了清晰子变量是哪部分,使用 ?(问号)代替 .(点)来访问它们;

user?html 给出 user 的HTML转义版本
user?upper_case 给出 user 值的大写版本
...

(5)处理不存在的变量

可以指定一个默认值来避免变量丢失这种情况

//在变量名后面跟着一个 !(叹号),当 user 不存在于数据模型时, 模板将会将 user 的值表示为字符串 "visitor"。(当 user 存在时, 模板就会表现出 ${user}的值)
<h1>Welcome ${user!"visitor"}!</h1>

也可以在变量名后面通过放置 ?? 来询问一个变量是否存在。

<#if user??><h1>Welcome ${user}!</h1></#if>

模板包含文本、插值、FTL标签、注释

<html>[BR] 
<head>[BR]   
    <title>Welcome!</title>[BR] 
</head>[BR] 
<body>[BR]   
    <#-- Greet the user with his/her name -->[BR]   
    <h1>Welcome ${user}!</h1>[BR]   
    <p>We have these animals:[BR]   
    <ul>[BR]   
        <#list animals as animal>[BR]     
            <li>${animal.name} for ${animal.price} Euros[BR]   
        </#list>[BR]   
    </ul>[BR] 
</body>[BR] 
</html>

注意

  1. 插值 仅仅可以在 文本 中使用。
  2. FTL 标签 不可以在其他 FTL 标签 和 插值中使用。比如, 这样做是 错误 的: <#if <#include ‘foo’>=‘bar’>…</#if>
  3. 注释 可以放在 FTL 标签 和 插值中。

(6)Map的使用

@RequesetMapping("index")
public void index(ModelAndView modelAndView)
{
    Map<String,String> map=new HashMap<>();
    map.put("kobe","Lakers");
    map.put("wade","Heat");
    modelAndView.addObject("map",map);
}
<#if map??>
    <#list map?keys as key>
        key = ${key}
        value = ${map[key]}
    </#list>
</#if>

:map中的key不能为Integer类型(使用Integer类型将无法读取map中的value),只能为String类型;

3、开发遇到的问题

(1)包含上级目录中的文件

-templates
-----fore
---------hearder.ftl
---------footer.ftl
-----page.html
如上目录结构,在hearder.ftl中引用page.html,应使用:<#include "../page.html">
在header.ftl中引用footer.ftl,应使用:<#include "footer.ftl">

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值