FreeMarker常见用法教程

一、认识FreeMarker

FreeMarker是一款模板引擎:一种基于模板的、用来生成输出文本的通用工具。类似模板引擎还有Velocity,Common Template等。

对于java web开发来说,使用FreeMarker模板,可以将java代码从页面中分离出来。开发人员只需关注业务逻辑代码,而由页面设计人员去设计显示效果,两类人员各司其职,发挥其擅长的一面。

FreeMarker注释:类似HTML的注释,用<#--和-->来分隔的。任何介于这两个分隔符(包含分隔符本身)之间的内容会被FreeMarker忽略,不会执行或输出。

二、常用指令

if指令

if指令进行条件输出控制,类似程序语言中的if语句。

格式:

<#if condition>content</#if>
<#if condition>content<#else>other content</#if>

示例:

<#if username == "boss">Hi boss!</#if>
<#if username == "boss">Hi boss!<#else>Hi!</#if>

说明:上例意思是如果变量username值为"boss",输出Hi boss!,否则输出Hi!。

==是来判断在它两侧的值相等的操作符,比较的结果是布尔值,true 或者false。在==的左侧,是引用的变量,右侧是指定的字符串。

注意:右侧字面量可以是字符串或数字,如果是字符串,要用引号(单,双引号都行)括起来,并且==左右两边类型要一致,否则出报错。

list指令

list指令用来遍历集合中的内容。

格式:

<#list vars as var>
	repeat content
</#list>

示例:

<#list ["星期一", "星期二", "星期三"] as day>
${day}
</#list>

说明:上例输出三行,每行依次输出星期一、星期二、星期三。

集合中元素可以是简单的字符串,如上例,也可以是复杂对象

include指令

使用include指令,我们可以在当前的模板中插入其他文件的内容。

格式:

<#include "filepath">

示例:

<#include "/copyright_footer.html">

说明:

被包含进来的文件,既可以是静态页,也可以是动态页(即ftl模板)。include指令会先将该文件内容包含进当前模板,然后再跟数据模型结合输出。

处理未定义变量或值为null

当变量未定义时,或值为null时,默认设置下FreeMarker会报错。下面有两种处理方式

1.设置默认值

格式:

${varname!default_value}

示例:

${user!"visitor"}
${apple.price!0}

说明:对于多级访问的变量,比如animals.python.price,书写代码:${animals.python.price!0},当animals或者python不存在,那么模板处理过程将会以“未定义的变量”错误而停止。为了防止这种情况的发生,可以这样来书写代码${(animals.python.price)!0}。这种情况下当animals或python不存在时表达式的结果仍然是0。

2.加if判断

格式:

<#if varname??>content</#if>
<#if varname?exists>content</#if>

示例:

<#if user??>Hi,${user}</#if>
<#if user?exists>Hi,${user}</#if>

说明:

如果user变量存在,且值不为NULL时,才输出Hi,user变量值。同样对于多级访问的变量,??前面的变量名最好被()包含,原因参照!设置默认值。

3.修改全局配置

classic_compatible=true

直接指定值说明

FreeMarker字面量区别字符串,数字和布尔值,所以字符串”150”和数字150是完全不同的。数字持有的是数字的值,布尔值表达的是逻辑上的对或错(true或false)。字符串可以是任意字符的序列。

常见操作汇总

直接指定值

字符串:"Foo" 或者 ‘Foo‘ 或者 "It‘s \"quoted\"" 或者"C:\raw\string"

数字:123.45

布尔值:true, false

序列:["foo", "bar", 123.45], 1..100

哈希表:{"name":"green mouse", "price":150}

检索变量

顶层变量:user

从哈希表中检索数据:user.name, user[“name”]

从序列中检索:products[5]

特殊变量:.main

字符串操作

插值(或连接):"Hello ${user}!"(或"Free" + "Marker")

获取一个字符:name[0]

序列操作

连接:users + ["guest"]

序列切分:products[10..19] 或 products[5..]

哈希表操作

连接:passwords + {"joe":"secret42"}

算数运算

(x * 1.5 + 10) / 2 - y % 100

比较运算

x == y, x != y, x < y, x > y, x >= y, x <= y, x &lt; y, x &gt; y 等等

逻辑操作

!registered && (firstVisit || fromEurope)

内建函数

name?upper_case

方法调用

repeat("What", 3)

处理不存在的值

指定默认值:name!"unknown" 或name! 多级访问变量(user.name)!"unknown" 或者 (user.name)!

检测不存在的值:name?? ,(user.name)??

数字格式化问题

当数字超过3位的时候,默认输出会自动带上逗号。例如2000,会显示为2,000。还有当小数位数超过3位时,默认只显示小数点后3位。例如1.33213,会显示为1.332;1.33253,会显示为1.333;

如何解决呢?

1> 加?c,即转成字符串,如:${userId?c}

2> 修改配置文件freemarker.properties加上number_format=#

格式化输出

${xx?c} //转成字符串显示

${xx?string.number}//按数字显示

${xx?string.currency}//按贷币格式显示

${xx?string.percent} //按百分比格式显示

去空格

${xx?trim}

格式化日期

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

${date?string("yyyyMMdd")}

时间: 2024-10-11 02:51:52

FreeMarker常见用法教程的相关文章

[js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下promise的常见用法. 为什么会有promise,他的作用是什么? promise主要是为了解决js中多个异步回调难以维护和控制的问题. 什么是promise? 从图中,我们可以看出,Promise是一个函数,这个函数上有在项目中常用的静态方法:all, race, reject,resolve等,原

正则表达式介绍及常见用法

正则表达式(Regular Expression),又称正规表示法.常规表示法,在实际的软件开发项目中经常会被使用到.它使用单个字符串来描述.匹配并获取一系列符合某个句法规则的结果. 我将从最基础的部分为大家写这个正则表达式教程. 正则表达式起源   1956年,数学家Stephen Kleene在Warren McCulloch和Walter Pitts早期神经系统工作的基础上,设计出了一个数学符号体系--regular sets(规则的集合),这个东西很快被计算机科学家用于编译器的扫描或词法

React之特点及常见用法

1.什么是React? React是一个用于构建用户界面的JavaScript库.主要用于构建UI,很多人认为Reatc是MVC中的V(视图). React起源于Facebook的内部项目,用来架构Instrgram的网站(ins,一款图片分享的社交软件),并与2013年5月份开源. React拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它. 2.React的特点? (1)声明式设计 (2)高效:通过对DOM的模拟,最大限度的减少与DOM的交互. (3)灵活:可以与已知的框架或

IOS中NSString的常见用法

iOS NSString的常用用法 //1.创建常量字符串. NSString *astring = @"This is a String!"; //2.创建空字符串,给予赋值. NSString *astring = [[NSString alloc] init]; astring = @"This is a String!"; //3.在以上方法中,提升速度:initWithString方法 NSString *astring = [[NSString allo

python之模块pprint之常见用法

# -*- coding: cp936 -*- #python 27 #xiaodeng #python之模块pprint之常见用法 import pprint data = [(1,{'a':'A','b':'B','c':'C','d':'D'}),(2,{'e':'E','f':'F','g':'G','h':'H','i':'I','j':'J','k':'K','l':'L'}),] print '--'*30 #1.打印效果 pprint.pprint (data) ''' ----

.NET中Path类的一些常见用法

.NET为处理文件路径提供了一个Path类,利用该类可以方便的处理文件路径,如更改文件后缀,合并文件路径,改变文件的扩展名等.有一点需要注意的是,Path类本质上是对一个字符串进行处理,更改的只是该字符串,而不会影响实际的文件.下面是该类的一些常见用法示例: 1 string filePath = @"C:\D\log\Receive\postedFile.txt"; 2 int padSpacesLength = 30; 3 string newFilePath = string.E

sscanf的常见用法

例子: 1. 常见用法. char buf[512] = ; sscanf("123456 ", "%s", buf); printf("%s\n", buf); 结果为:123456 2. 取指定长度的字符串.如在下例中,取最大长度为4字节的字符串. sscanf("123456 ", "%4s", buf); printf("%s\n", buf); 结果为:1234 3. 取到指定

python之模块poplib之常见用法

# -*- coding: cp936 -*- #python 27 #xiaodeng #python之模块poplib之常见用法 ''' 所以,收取邮件分两步: 第一步:用poplib把邮件的原始文本下载到本地: 第二部:用email解析原始文本,还原为邮件对象. poplib.POP3(host,port,timeout):连接pop3服务器 poplib.POP3_SSL(): POP3.set_debuglevel(level):设置调试模式,可以看到与服务器的交互信息 POP3.ge

【ORM】关于Dapper的一些常见用法

引言 Dapper是.Net平台下一款小巧玲珑的开源Orm框架,简单实用的同时保持高性能,非常适合我这种喜欢手写SQL的人使用,下面介绍一下如何使用Dapper. 相关资料 Dapper的GitHub地址是dapper-dot-net,上面有一些用法和性能的介绍,有兴趣者可以上去看看. 数据库设计和实体类     简单设计两个表,分别为部门表,雇员表. CREATE TABLE [dbo].[T_Dept] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Dept]