博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FreeMarker 的常用指令介绍
阅读量:7014 次
发布时间:2019-06-28

本文共 3628 字,大约阅读时间需要 12 分钟。

hot3.png

一、数据类型:

四种基本类型:String、Number、Boolean、Date。直接指定值可以是字符串、数值、布尔值、集合及Map对象

1. 字符串

直接指定字符串值使用单引号或双引号限定。字符串中可以使用转义字符”\"。如果字符串内有大量的特殊字符,则可以在引号的前面加上一个字母r,则字符串内的所有字符都将直接输出。
2. 数值
数值可以直接输入,不需要引号。FreeMarker不支持科学计数法。
3. 布尔值
直接使用truefalse,不使用引号。
4. 集合
集合用中括号包括,集合元素之间用逗号分隔。
使用数字范围也可以表示一个数字集合,如1..5等同于集合[1, 2, 3, 4, 5];同样也可以用5..1来表示[5, 4, 3, 2, 1]
5. Map对象
Map对象使用花括号包括,Map中的key-value对之间用冒号分隔,多组key-value对之间用逗号分隔。
注意:Map对象的keyvalue都是表达式,但key必须是字符串。{"name":"green mouse", "price":150} 

6. 时间对象

root.put("date1", new Date());

${date1?string("yyyy-MM-dd HH:mm:ss")}

二、控制语句

 if指令 

这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: 

<#if condition>... 
    <#elseif condition>... 
    <#elseif condition>... 
  <#else> ... 
</#if> 
例子如下: 
<#assign age=23> 
<#if (age>60)>老年人 
        <#elseif (age>40)>中年人 
        <#elseif (age>20)>青年人 
    <#else> 少年人 
</#if> 
输出结果是:青年人 
上面的代码中的逻辑表达式用括号括起来主要是因为里面有“>”符号,由于FreeMarker会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号。

自定义指令(macro指令)

<#macro m1>   <#--定义指令m1 -->

<b>aaabbbccc</b>

<b>dddeeefff</b>

</#macro>

<@m1 /><@m1 />  <#--调用上面的宏指令 -->

输出:aaabbbccc

         dddeeefff

定义带参的宏指令:

<#macro m2 a b c >

${a}--${b}--${c}

</#macro>

<@m2 a="老高" b="老张" c="老马" />

nested指令:

<#macro border> 

  <table border=4 cellspacing=0 cellpadding=4><tr><td> 

    <#nested> 

  </td></tr></table> 

</#macro>

< >表格中的内容!</@border>

include指令:

<#include "included.txt" />

三、集合操作

list, break 

语法 

<#list  sequence  as item > 
... 
<#if item = "spring"><#break></#if> 
... 
</#list> 

关键字 

item_index: 是list当前值的下标 
item_has_next: 判断list是否还有值 
用例 
<#assign seq = ["winter", "spring", "summer", "autumn"]> 
<#list seq as x> 
  ${x_index + 1}. ${x}<#if x_has_next>,</#if> 

</#list> 

输出 
  1. winter, 
  2. spring, 
  3. summer, 
  4. autumn  

四、空值处理

FreeMarker的变量必须赋值,否则就会抛出异常。

而对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值。

FreeMarker提供两个运算符来避免空值:

1. !: 指定缺失变量的默认值;

2. ??:判断变量是否存在。

!运算符有两种用法:variable!或variable!defaultValue。第一种用法不给变量指定默认值,表明默认值是空字符串、长度为0的集合、或长度为0的Map对象。

使用variable!defaultValue运算符指定默认值并不要求默认值的类型和变量类型相同。

测试空值处理:

<#-- ${sss} 没有定义这个变量,会报异常! -->

${sss!} <#--没有定义这个变量,默认值是空字符串! -->

${sss!"abc"} <#--没有定义这个变量,默认值是字符串abc! -->

五、命名空间_宏指令

当运行 FTL 模板时,就会有使用 assign 和 macro 指令创建的变量的集合(可能是空的),可以从前一章节来看如何使用它们。像这样的变量集合被称为 namespace 命名空间。在简单的情况下可以只使用一个命名空间,称之为 main namespace 主命名空间。因为通常只使用本页上的命名空间,所以就没有意识到这点。 

    如果想创建可以重复使用的宏,函数和其他变量的集合,通常用术语来说就是引用

library 库。使用多个命名空间是必然的。只要考虑你在一些项目中,或者想和他人共享使用的时候,你是否有一个很大的宏的集合。但要确保库中没有宏(或其他变量)名和数据模型中变量同名,而且也不能和模板中引用其他库中的变量同名。通常来说,变量因为名称冲突也会相互冲突。所以要为每个库中的变量使用不同的命名空间。

定义b.ftl文件:

<#macro copyright date>

  <p>Copyright (C) ${date} 中国人民.</p> 

</#macro> 

<#assign mail = "zgrm@163.com">

在a.ftl文件中引入b.ftl,从而可以使用b.ftl中定义的宏和变量:

测试命名空间:

<#import "b.ftl" as bb  />

<@bb.copyright date="2010-2011" />

${bb.mail}

<#assign mail="my@163.com"  />

${mail}

<#assign mail="my@163.com" in bb  />

${bb.mail}

执行后,控制台打印:

测试命名空间:

  <p>Copyright (C) 2010-2011 中国人民.</p> 

zgrm@163.com

my@163.com

my@163.com

六、字符串操作

1. 字符串连接

字符串连接有两种语法:
1 使用${..}#{..}在字符串常量内插入表达式的值;
(2) 
直接使用连接运算符“+”连接字符串。
如,下面两种写法等效:
              ${"Hello, ${user}"}                                                                                                               
              ${"Hello, " + user + "!"}                                                                                                        
有一点需要注意: ${..}只能用于文本部分作为插值输出,而不能用于比较等其他用途,如:
              <#if ${isBig}>Wow!</#if>                                                                                                               
              <#if "${isBig}">Wow!</#if>                                                                                                             
应该写成:
              <#if isBig>Wow!</#if>                                                                                                                    
2.
截取子串
截取子串可以根据字符串的索引来进行,如果指定一个索引值,则取得字符串该索引处的字符;如果指定两个索引值,则截取两个索引中间的字符串子串。如:
              <#assign number="01234">
              ${number[0]} <#--
输出字符0 -->
              ${number[0..3]} <#--
输出子串“0123” -->

七、内置函数

FreeMarker提供了一些内建函数来转换输出,可以在任何变量后紧跟?。?后紧跟内建函数,就可以通过内建函数来转换输出变量。

字符串相关常用的内建函数:

1. html: 对字符串进行HTML编码;

2. cap_first: 使字符串第一个字母大写;

3. lower_case: 将字符串转成小写;

4. upper_case: 将字符串转成大写;

集合相关常用的内建函数:

1. size: 获得集合中元素的个数;

数字值相关常用的内建函数:

1. int: 取得数字的整数部分。

举例:

root.put("htm2", "<b>粗体</b>");

内建函数:

${htm2?html}

输出:<b>粗体</b>

转载于:https://my.oschina.net/u/1453975/blog/340198

你可能感兴趣的文章
Css 常用样式
查看>>
HashMap,HashTable,HashSet区别
查看>>
如何学习iOS开发——对新手的几句废话
查看>>
无延时显示Toast的方法
查看>>
tomcat安全防护之普通用户运行
查看>>
分布式锁与实现(一)——基于Redis实现
查看>>
python学习 dict set 的用法(四)
查看>>
双机热备份的切换时间是这么确定的
查看>>
ADSL拨号上网,拨完了获得的地址IP跟网关一样!
查看>>
Socket.IO连接异常时的内置事件流程图
查看>>
算法学习笔记(四)---第k个二进制数字问题
查看>>
忘记sa密码,又删除了windows身份验证账号的解决方法
查看>>
Open-Falcon 监控系统监控 MySQL/Redis/MongoDB 状态监控
查看>>
1-4 Zabbix 用户管理
查看>>
Visual Studio 2017强制更新方法
查看>>
蓝牙设备探测工具blueranger
查看>>
我的友情链接
查看>>
KaliLinux常用服务配置教程DHCP服务工作流程
查看>>
js基础--javascript基础概念之数组
查看>>
date 输出格式
查看>>