FTL基本语法

FTL基本语法

1. 字符输出

${emp.name?if_exists}      // 变量存在,输出该变量,否则不输出
${emp.name!}            // 变量存在,输出该变量,否则不输出

${emp.name?default("xxx")}     // 变量不存在,取默认值xxx 
${emp.name!"xxx"}          // 变量不存在,取默认值xxx
常用内部函数:

${"123<br>456"?html}      // 对字符串进行HTML编码,对html中特殊字符进行转义
${"str"?cap_first}        // 使字符串第一个字母大写 
${"Str"?lower_case}        // 将字符串转换成小写 
${"Str"?upper_case}        // 将字符串转换成大写
${"str"?trim}              // 去掉字符串前后的空白字符
字符串的两种拼接方式拼接:

${"hello${emp.name!}"}     // 输出hello+变量名
${"hello"+emp.name!}       // 使用+号来连接,输出hello+变量名
可以通过如下语法来截取子串:

<#assign str = "abcdefghijklmn"/>

// 方法1
${str?substring(0,4)}  // 输出abcd

// 方法2
${str[0]}${str[4]}    // 结果是ae
${str[1..4]}        // 结果是bcde

// 返回指定字符的索引
${str?index_of("n")}

2、日期输出

${emp.date?string('yyyy-MM-dd')} //日期格式

3、数字输出(以数字20为例)

${emp.name?string.number}     // 输出20
${emp.name?string.currency}    // ¥20.00 
${emp.name?string.percent}     // 20%
${1.222?int}            // 将小数转为int,输出1

<#setting number_format="percent"/>    // 设置数字默认输出方式('percent',百分比)
<#assign answer=42/>             // 声明变量 answer 42
#{answer}             // 输出 4,200%
${answer?string}         // 输出 4,200%
${answer?string.number}   // 输出 42
${answer?string.currency}  // 输出 ¥42.00
${answer?string.percent}  // 输出 4,200%
#{answer}            // 输出 42

数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:
mX:小数部分最小XMX:小数部分最大X位
如下面的例子:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2}    // 输出2.58
#{y; M2}    // 输出4
#{x; m2}    // 输出2.58
#{y; m2}    // 输出4.0
#{x; m1M2}  // 输出2.58
#{x; m1M2}  // 输出4.0

4、申明变量

<#assign foo=false/> // 声明变量,插入布尔值进行显示,注意不要用引号
${foo?string("yes","no")} // 当为true时输出"yes",否则输出"no"
申明变量的几种方式

<#assign name=value> 
<#assign name1=value1 name2=value2 ... nameN=valueN> 
<#assign same as above... in namespacehash>

<#assign name> 
  capture this 
</#assign>

<#assign name in namespacehash> 
capture this 
</#assign>

5、比较运算符

表达式中支持的比较运算符有如下几个:
=== :判断两个值是否相等.
!= :判断两个值是否不等.
> 或 gt :判断左边值是否大于右边值
>= 或 gte :判断左边值是否大于等于右边值
< 或 lt :判断左边值是否小于右边值
<= 或 lte :判断左边值是否小于等于右边值

6、算术运算符

FreeMarker表达式中完全支持算术运算,
FreeMarker支持的算术运算符包括:+, - , * , / , % 
注意:
(1)、运算符两边必须是数字
(2)、使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,:${3 + "5"},结果是:35

7、逻辑运算符

逻辑运算符有如下几个:
逻辑与:&&
逻辑或:||
逻辑非:!

逻辑运算符只能作用于布尔值,否则将产生错误

8、FreeMarker中的运算符优先级如下(由高到低排列):

①、一元运算符:!
②、内建函数:?
③、乘除法:*, / , %
④、加减法:- , +
⑤、比较:> , < , >= , <= (lt , lte , gt , gte)
⑥、相等:== , = , !=
⑦、逻辑与:&&
⑧、逻辑或:||
⑨、数字范围:..

实际上,我们在开发过程中应该使用括号来严格区分,这样的可读性好,出错少

9、if 逻辑判断(注意:elseif 不加空格)

<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
<#else>
...
</#if>

if 空值判断

<!-- 当 photoList 不为空时-->
<#if photoList??>...</#if> 

<!--值得注意的是,${..}只能用于文本部分,不能用于表达式,下面的代码是错误的:-->
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>

<!-- 正确写法-->
<#if isBig>Wow!</#if> 

10、switch (条件可为数字,可为字符串)

<#switch value> 
<#case refValue1> 
  ....
<#break> 
<#case refValue2> 
  ....
<#break> 
<#case refValueN> 
  ....
<#break> 
<#default> 
 .... 
</#switch>

11、集合 & 循环

<!-- 遍历集合: -->
<#list empList! as emp> 
    ${emp.name!}
</#list>

<!-- 可以这样遍历集合: -->
<#list 0..(empList!?size-1) as i>
    ${empList[i].name!}
</#list>

<!-- 与jstl循环类似,也可以访问循环的状态。 -->

empList?size    // 取集合的长度
emp_index:     // int类型,当前对象的索引值 
emp_has_next:     // boolean类型,是否存在下一个对象

<!-- 使用<#break>跳出循环 -->
<#if emp_index = 0><#break></#if>

<!-- 集合长度判断 --> 
<#if empList?size != 0></#if>  <!-- 判断=的时候,注意只要一个=符号,而不是==  -->

<#assign l=0..100/>    <!-- 定义一个int区间的0~100的集合,数字范围也支持反递增,100..2 -->
<#list 0..100 as i>   <!-- 等效于java for(int i=0; i <= 100; i++) -->
  ${i}
</#list>

<!-- 截取子集合: -->
empList[3..5] <!-- 返回empList集合的子集合,子集合中的元素是empList集合中的第4-6个元素 -->

<!-- 创建集合: -->
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>

<!-- 集合连接运算,将两个集合连接成一个新的集合 -->
<#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x>

<!-- 除此之外,集合元素也可以是表达式,例子如下: -->
[2 + 2, [1, 2, 3, 4], "whatnot"]

<!-- seq_contains:判断序列中的元素是否存在 -->
<#assign x = ["red", 16, "blue", "cyan"]> 
${x?seq_contains("blue")?string("yes", "no")}    // yes
${x?seq_contains("yellow")?string("yes", "no")}  // no
${x?seq_contains(16)?string("yes", "no")}        // yes
${x?seq_contains("16")?string("yes", "no")}      // no

<!-- seq_index_of:第一次出现的索引 -->
<#assign x = ["red", 16, "blue", "cyan", "blue"]> 
${x?seq_index_of("blue")}  <!-- 2 -->

<!-- sort_by:排序(升序) -->
<#list movies?sort_by("showtime") as movie></#list>

<!-- sort_by:排序(降序) -->
<#list movies?sort_by("showtime")?reverse as movie></#list>

<!-- 具体介绍: -->
<!-- 不排序的情况: -->
<#list movies as moive>
  <a href="${moive.url}">${moive.name}</a>
</#list>

<!-- 要是排序,则用 -->
<#list movies?sort as movie>
  <a href="${movie.url}">${movie.name}</a>
</#list>

<!-- 这是按元素的首字母排序。若要按list中对象元素的某一属性排序的话,则用 -->
<#list moives?sort_by(["name"]) as movie>
  <a href="${movie.url}">${movie.name}</a>
</#list>

<!-- 这个是按list中对象元素的[name]属性排序的,是升序,如果需要降序的话,如下所示: -->
<#list movies?sort_by(["name"])?reverse as movie>
  <a href="${movie.url}">${movie.name}</a>
</#list>

12、Map对象

<!-- 创建map -->
<#assign scores = {"语文":86,"数学":78}>

<!-- Map连接运算符 -->
<#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>

<!-- Map元素输出 -->
emp.name       // 全部使用点语法
emp["name"]    // 使用方括号

13、FreeMarker支持如下转义字符:

\" :双引号(u0022)
\' :单引号(u0027)
\\ :反斜杠(u005C)
\n :换行(u000A)
\r :回车(u000D)
\t :Tab(u0009)
\b :退格键(u0008)
\f :Form feed(u000C)
\l :<
\g :>
\a :&
\{{
\xCode :直接通过4位的16进制数来指定Unicode码,输出该unicode码对应的字符.

如果某段文本中包含大量的特殊符号,FreeMarker提供了另一种特殊格式:可以在指定字符串内容的引号前增加r标记,在r标记后的文件将会直接输出.看如下代码:
${r"${foo}"} // 输出 ${foo}
${r"C:/foo/bar"} // 输出 C:/foo/bar

14、include指令

// include指令的作用类似于JSP的包含指令:
<#include "/test.ftl" encoding="UTF-8" parse=true>

// 在上面的语法格式中,两个参数的解释如下:
encoding="GBK"  // 编码格式
parse=true    // 是否作为ftl语法解析,默认是true,false就是以文本方式引入,注意:在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse="true"

15、import指令

// 类似于jsp里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件
<#import "/libs/mylib.ftl" as my>
// 上面的代码将导入/lib/common.ftl模板文件中的所有变量,交将这些变量放置在一个名为com的Map对象中,"my"在freemarker里被称作namespace

16、compress 压缩

// 用来压缩空白空间和空白的行 
<#compress> 
    ... 
</#compress>

17、特殊标签

<#t> // 去掉左右空白和回车换行 

<#lt>// 去掉左边空白和回车换行 

<#rt>// 去掉右边空白和回车换行 

<#nt>// 取消上面的效果

18、escape,noescape 对字符串进行HTML编码

// escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值,使用escape指令的语法格式如下:
<#escape x as x?html> 
  First name: ${firstName} 
<#noescape>Last name: ${lastName}</#noescape> 
  Maiden name: ${maidenName} 
</#escape>

// 相同表达式
First name: ${firstName?html} 
Last name: ${lastName} 
Maiden name: ${maidenName?html}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FTL 转换为 HTML 的过程需要使用 FreeMarker 的模板引擎,将 FTL 模板与数据模型合并生成最终的 HTML 页面。以下是将 FTL 转换为 HTML 的一些基本步骤: 1. 创建一个数据模型,数据模型包含了需要在 HTML 页面中展示的数据。 2. 使用 FreeMarker 的 Configuration 类创建一个配置对象,设置 FTL 文件所在的文件夹路径。 3. 使用 Configuration 类的 getTemplate() 方法获取 FTL 文件的模板对象。 4. 使用模板对象的 process() 方法,将数据模型合并到 FTL 模板中,生成 HTML 页面。 5. 将生成的 HTML 页面输出到文件或者响应中。 以下是一个简单的 Java 代码示例,将 FTL 文件转换为 HTML 页面: ```java Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setDirectoryForTemplateLoading(new File("path/to/ftl/folder")); Template temp = cfg.getTemplate("example.ftl"); Map<String, Object> data = new HashMap<>(); data.put("title", "Example Page"); data.put("content", "Hello, world!"); StringWriter out = new StringWriter(); temp.process(data, out); String html = out.toString(); System.out.println(html); ``` 在上面的示例中,我们首先创建了一个 Configuration 对象,并设置了 FTL 文件所在的文件夹路径。然后,我们使用 Configuration 对象的 getTemplate() 方法获取了 example.ftl 文件的模板对象。接着,我们创建了一个数据模型,并将数据模型合并到了 FTL 模板中,生成了 HTML 页面。最后,我们将 HTML 页面输出到了控制台中。 需要注意的是,由于 FTL 和 HTML 的语法和语义不同,因此在将 FTL 转换为 HTML 的过程中,可能需要进行一些手动调整,以保证生成的 HTML 页面与预期的一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值