freemarker语法
freemarker基本语法
freemarker基本语法一、什么是FreemarkerFreemarker是一个模板引擎,它可以将数据和模板进行结合,生成所需的文本输出。
它主要用于Web应用程序中的MVC架构中,将业务逻辑和表现层分离。
二、Freemarker基本语法1. 变量Freemarker中的变量可以通过${}来表示,如${}表示取出user对象的name属性。
2. 指令指令是Freemarker中最重要的语法之一,它可以控制模板引擎的行为。
常用指令有if、list、assign等。
(1)if指令:用于条件判断,例如:<#if user.age gt 18>成年人<#else>未成年人</#if>```(2)list指令:用于循环输出,例如:```html<#list users as user>${}</#list>```(3)assign指令:用于变量赋值,例如:```html<#assign name = "张三"> ${name}```宏定义是一种自定义函数的方式,在模板中可以多次调用。
例如:```html<#macro printName name>${name}</#macro><@printName name="张三"/><@printName name="李四"/>```4. 内建函数Freemarker提供了一些内建函数,可以方便地处理字符串、日期等数据类型。
例如:(1)字符串函数:```html${name?length} //获取字符串长度${name?upper_case} //将字符串转换为大写字母${name?lower_case} //将字符串转换为小写字母```(2)日期函数:```html${date?string("yyyy-MM-dd")} //将日期格式化为指定格式的字符串${date?time} //获取日期的时间戳```5. 注释在Freemarker中,注释可以使用<#-- -->来表示,例如:```html<#-- 这是一段注释 -->```三、Freemarker在Java中的应用1. 引入Freemarker依赖在Maven项目中,可以通过以下方式引入Freemarker依赖:```xml<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency>```2. 创建Configuration对象Configuration对象是Freemarker的核心类,它会负责解析模板文件和数据模型。
freemarker 动态class语法
一、freemarker简介1.1 freemarker概述1.2 freemarker的优势1.3 freemarker的应用领域二、freemarker动态class语法2.1 什么是动态class语法2.2 动态class语法的特点2.3 动态class语法的使用方式三、动态class语法的实际应用3.1 使用动态class语法处理模板数据3.2 动态class语法在Web开发中的应用3.3 动态class语法的区别和通联四、freemarker动态class语法的注意事项4.1 语法规范4.2 错误处理4.3 安全性考量五、结论5.1 总结freemarker动态class语法的优势和特点 5.2 展望freemarker动态class语法的未来发展一、freemarker简介1.1 freemarker概述Freemarker是一种模版引擎,它是一种基于模板和数据生成输出的技术。
作为一个强大的模板引擎,Freemarker被广泛应用于Web开发、邮件发送和代码生成等领域。
1.2 freemarker的优势Freemarker具有清晰的模板语法和强大的数据处理能力,可以使得模板和数据的分离更加明显。
Freemarker支持模板的重用、模板继承、条件判断、循环处理和自定义指令等功能,为开发人员提供了丰富而灵活的模板输出方式。
1.3 freemarker的应用领域Freemarker被广泛应用于各种Web开发框架中,如Spring MVC、Struts等。
它也被用作代码生成工具,用来生成Java类、SQL语句、HTML页面等。
其应用范围涵盖了前后端分离、代码生成、模板化邮件、静态网页生成等多个领域。
二、freemarker动态class语法2.1 什么是动态class语法在Freemarker中,动态class语法是指使用模板语言动态生成Java 类或类的成员。
通过使用动态class语法,可以在模板中直接定义类或类的成员,并在运行时进行解析和生成。
freemarker基础语法
FreeMarker 是一个用Java 语言编写的模板引擎,它是一个用于生成输出文本的通用工具。
其主要应用于Web 开发,能够处理各种复杂的数据结构,并能够与各种数据库进行交互。
FreeMarker 的基础语法主要包括以下几个方面:1. 变量:在FreeMarker 中,你可以用`${...}` 来定义一个变量。
例如,`${name}` 就是一个变量,表示名字。
2. 数据结构:FreeMarker 支持各种复杂的数据结构,包括列表(list)、哈希表(hash table)、方法(method)等。
你可以用`#list`, `#set`, `#if`, `#else`, `#elseif`, `#switch`, `#case`, `#default` 等指令来创建和控制这些数据结构。
3. 函数:你可以用`#function` 定义自己的函数,然后用`#use` 或`#import` 引入其他FreeMarker 模板中定义的函数。
函数可以接受参数,并返回一个值。
4. 指令:FreeMarker 有很多内置的指令,如`#include`(包含其他文件)、`#import`(导入其他文件定义的函数和宏)、`#use`(使用其他文件定义的模板函数)等。
5. 注释和注释块:你可以用`#comment` 来创建注释,用`#end` 来结束注释块。
6. 宏:你可以用`#macro` 来定义一个宏,然后用`#end` 来结束宏定义。
宏可以接受参数,并返回一个值。
7. 自定义指令:你也可以创建自己的指令,用`#defining` 来定义一个全局的自定义指令,用`#end` 来结束指令定义。
自定义指令可以在模板中的任何位置使用。
8. 表达式:FreeMarker 支持各种表达式,包括算术表达式、比较表达式、逻辑表达式、字符串表达式等。
以上就是FreeMarker 的基础语法,更详细的信息可以查阅FreeMarker 的官方文档或相关教程。
freemarker 模板 语法
Freemarker模板语法在现代互联网时代,全球信息湾的开发和管理变得越来越重要。
为了提供更好的用户体验,全球信息湾的前端设计和展示变得尤为关键。
而在前端设计中,模板语法是一个不可或缺的部分。
在这篇文章中,我们将深入探讨Freemarker模板语法,一种常用的模板引擎,它提供了丰富的语法和功能,用于生成动态内容。
1. 概述Freemarker是一种基于模板的通用文本生成器,它主要用于生成HTML网页、电流信箱、配置文件等。
作为一种开源软件,Freemarker具有简单、灵活、强大的特点,成为了众多开发者的首选工具之一。
2. 基本语法Freemarker模板语法主要包括标签指令、表达式和插值等。
在Freemarker模板中,可以使用<#...>标签来定义指令,通过${...}来插入变量值。
这种简洁而强大的语法使得模板的编写变得轻而易举。
3. 数据模型在Freemarker中,数据模型是一个包含所有数据的上下文环境。
它可以包含简单的数据类型,如字符串、数字,也可以包含复杂的数据结构,如列表、字典等。
通过数据模型,我们可以在模板中动态地展示不同的数据内容,实现个性化的页面展示。
4. 控制指令Freemarker提供了丰富的控制指令,如if、else、elseif、list、include等,这些指令可以让我们在模板中进行条件判断、循环遍历等操作,从而实现灵活多变的页面展示效果。
5. 自定义指令除了内置的指令之外,Freemarker还支持自定义指令的编写和使用。
通过自定义指令,我们可以更加灵活地扩展Freemarker的功能,实现更加个性化的模板设计。
6. 总结回顾通过本文的介绍,我们对Freemarker模板语法有了全面而深入的了解。
它简洁而灵活的语法,丰富而强大的功能,使其成为了前端开发中不可或缺的一部分。
在实际应用中,我们可以根据具体的需求,灵活运用Freemarker的语法和功能,实现精美而动态的页面展示效果。
freemarker 模板引擎语法
Freemarker模板引擎是一种用于生成文本输出的模板引擎,它使用基于模板的方式来构建文档,支持条件判断、循环、宏定义等功能,适用于生成HTML、XML、JSON等文档,同时也可以用于邮件、配置文件等文本文件的生成。
Freemarker模板引擎的语法简单易懂,但功能强大,本文将对其语法进行详细介绍。
一、输出Freemarker模板引擎使用${...}语法来输出变量或表达式的值。
例如:```Hello, ${user}!```这段代码将会输出"Hello, "后跟变量user的值。
二、if语句Freemarker模板引擎支持使用if语句进行条件判断。
语法如下:```<#if condition>...<#elseif condition>...<#else>...</#if>其中,condition为一个布尔表达式。
当condition成立时,“...”内的内容会被输出。
三、list循环Freemarker模板引擎支持使用list进行循环。
语法如下:```<#list items as item>...</#list>```其中,items为一个列表,item为列表中的每个元素。
循环内的内容将会被item依次赋值后输出。
四、macro宏定义Freemarker模板引擎支持使用macro来定义宏。
语法如下:```<#macro myMacro param1 param2>...</#macro>```其中,myMacro为宏的名称,param1和param2为宏的参数。
定义完成后,可以通过<myMacro ...>来调用宏。
五、include包含文件Freemarker模板引擎支持使用include来包含其他文件。
语法如下:```<#include "header.ftl">...<#include "footer.ftl">```这段代码会将header.ftl和footer.ftl中的内容包含到当前文件中。
freemarker高级语法
freemarker高级语法Freemarker高级语法Freemarker是一种模板引擎,它使用简单而强大的语法来生成动态内容。
除了基本语法外,Freemarker还提供了一些高级语法,用于更灵活地处理模板和数据。
本文将介绍一些常用的Freemarker高级语法,以帮助开发人员更好地使用该模板引擎。
一、条件语句在Freemarker中,我们可以使用条件语句来根据特定的条件决定是否输出内容。
条件语句主要有if-else和switch-case两种形式。
1. if-else语句if-else语句用于在满足特定条件时输出内容,语法如下:```<#if condition>输出内容1<#elseif condition2>输出内容2<#else>输出内容3</#if>```其中,condition是一个布尔表达式,可以是变量、逻辑运算符、比较运算符等。
当condition为true时,输出内容1;当condition为false且condition2为true时,输出内容2;否则,输出内容3。
2. switch-case语句switch-case语句用于根据不同的取值输出不同的内容,语法如下:```<#switch variable><#case value1>输出内容1<#case value2>输出内容2<#default>输出内容3</#switch>```其中,variable是一个变量,可以是数值、字符串等。
当variable 的取值与某个case的值相等时,输出相应的内容;如果没有匹配的case,则输出default中的内容。
二、循环语句循环语句是在Freemarker中非常常用的一种语法,它可以用来遍历集合、重复输出内容等。
常用的循环语句有list、foreach和while。
1. list循环list循环用于遍历一个列表,并输出其中的每个元素。
freemarker的标签语法
freemarker的标签语法一、Freemarker是个啥? 。
咱先来说说Freemarker是个啥玩意儿。
Freemarker呢,就像是一个超级厉害的小助手,专门用来处理模板的。
你可以把它想象成一个魔法盒,你给它一些数据,再给它一个模板,它就能按照这个模板把数据变成超级酷炫的东西,像网页啦、邮件内容啦之类的。
为啥要用Freemarker呢?你想啊,要是你每次做网页或者写邮件都要从头开始写代码,那得多累啊。
有了Freemarker,你就可以把那些经常用到的部分做成模板,然后只要把不同的数据塞进去就好了,就像搭积木一样简单又有趣。
二、基本标签语法来咯 。
(一)插值表达式。
这可是Freemarker的基础操作哦。
插值表达式就像一个小嘴巴,它会把数据“说”出来。
在Freemarker里,插值表达式的格式是`{变量名}`。
比如说,你有一个变量叫`userName`,里面存着用户的名字,那你在模板里写 `{userName}`,Freemarker就会把这个变量的值显示出来。
是不是很神奇呢?就像你告诉它一个小秘密,然后它就会把这个秘密展示给大家看。
(二)指令标签。
1. if指令。
这个 `if` 指令就和我们在编程里常见的 `if` 语句差不多啦。
比如说,你想根据用户的年龄来显示不同的内容。
你可以这样写:<#if age > 18>.欢迎,你已经成年啦!<#else>.小宝贝,你还未成年呢。
</#if>.这里的 `age` 就是我们的变量,根据它的值,Freemarker就会决定显示哪一段内容。
这就像是Freemarker在做选择题一样,根据不同的情况选择不同的答案。
2. list指令。
当你有一组数据,比如说一个用户的购物清单,你就可以用 `list` 指令来遍历它。
像这样:<#list shoppingList as item>.- {item}这里的 `shoppingList` 是一个列表类型的变量,`item` 呢,就是每次遍历出来的一个元素。
freemarker语法
By zhxing1、if, else, elseif语法:<#if condition>...<#elseif condition2>...<#elseif condition3>......<#else>...</#if>备注:condition、condition2···必须为boolean 类型,<#elseif ··>、<#else>可有0或多个。
实例:<#if x == 1>x is 1<#elseif x == 2>x is 2<#elseif x == 3>x is 3<#elseif x > 4>x is 4<#else>x is not 1 nor 2 nor 3 nor 4</#if>备注:< 或 > 号必须转义,否则出错。
转义请参考其他文档。
2、switch, case, default, break语法<#switch value><#case refValue1>...<#break><#case refValue2>...<#break>...<#case refValueN>...<#break><#default>...</#switch>备注:该指令官方不推荐使用了,可以用if, else, elseif 指令代替。
3、list, break语法<#list sequence as item>...</#list>备注: sequence 为一个sequence 或者 collection 类型。
item 为循环的变量。
freemarker语法
freemarker语法freemarker是一种模板引擎,它可以将结构化的数据与静态文字文件混合,然后生成HTML页面、XML文档、电子邮件,以及其他格式的文档。
它拥有许多功能,例如强大的if和for指令,Data Model,各种变量,文件包含,数据类型及函数等,能够为开发者们节省大量时间。
本文将会介绍 freemarker法基础、常用语法特性和数据访问等。
一、 freemarker语法基础1.用变量: freemarker 使用 ${...} 式来引用变量,例如:${name} 用 name量。
2.释: freemarker支持两种注释方式,持行注释 (# ...)行注释(<#-- --#>)。
3.件语句: freemarker 使用 <#if condition> ....</#if>式表示条件语句,当条件为true时,紧跟condition之后的元素才会被执行。
4.环语句: freemarker 使用 <#list sequence as item> ... </#list>式表示循环语句, sequence以是数组,字符串,数字或者对象。
二、freemarker语法特性1.算符: freemarker持 +,-, *,/,%,==,!=,>,>=, <=, ??,and,or,not运算符。
2.较: freemarker持比较操作,用比较操作可以产生true或者false,:${age > 10}3.符串操作: freemarker持各种字符串操作,括string.length(), string.substring(), string.contains()等。
4.数: freemarker持很多内置函数,例如date.format(dateObj), date.time?, number.format(numberValue)。
freemarker 变量表达式
Freemarker是一种模板引擎,广泛应用于JavaWeb开发中,它能够将数据动态填充到模板中,生成最终的页面。
在Freemarker中,变量表达式是一种重要的语法,用于表示需要动态填充的数据,下面将详细介绍Freemarker变量表达式的使用方法和注意事项。
一、Freemarker变量表达式的基本语法在Freemarker中,变量表达式使用`${}`来表示,其中`${}`内部可以是一个简单的变量名,也可以是一个复杂的表达式。
例如:```${}${user['age']}${user.age > 18 ? '成年人' : '未成年人'}```在`${}`内部,可以使用`.`来访问对象的属性,也可以使用`[]`来访问Map的值,此外还可以使用三元运算符来进行条件判断。
二、Freemarker变量表达式的使用场景1.在模板中动态显示数据在前后端分离的开发模式中,前端经常需要通过Ajax请求后台接口获取数据,然后使用Freemarker填充到页面中。
这时就可以使用变量表达式来动态显示数据,比如将后台返回的用户信息`${user}`填充到页面中。
2.在条件判断和循环中使用在模板中经常需要根据不同的条件显示不同的内容,或者对一组数据进行循环处理,这时就可以使用变量表达式来进行条件判断和循环操作。
三、Freemarker变量表达式的注意事项1.空指针判断由于在模板中动态填充的数据并不一定存在,所以在使用变量表达式时需要进行空指针判断,避免出现空指针异常。
2.复杂表达式的优化虽然变量表达式支持复杂的表达式操作,但在实际使用中应尽量将复杂的逻辑放到后台去处理,尽量保持模板的简洁和清晰。
3.变量命名规范在使用变量表达式时,要注意变量命名规范,尽量使用有意义的变量名,以便于代码的维护和阅读。
四、总结Freemarker变量表达式是一种非常灵活和强大的语法,能够帮助我们在模板中动态填充数据,进行条件判断和循环操作。
freemaker语法
freemaker语法Freemarker是一种模板引擎,可以用于生成动态内容的模板。
它的语法相对简洁易懂,以下是Freemarker的一些常用语法:1. 变量定义和输出:- 定义变量:`<#assign variableName = value>`- 输出变量:`${variableName}`2. 条件判断:- if语句:`<#if condition>...</#if>`- if-else语句:`<#ifcondition>...</#else>...</#if>`- if-elseif-else语句:`<#ifcondition1>...</#elseifcondition2>...</#else>...</#if>`3. 循环:- foreach循环:`<#list collection as item>...</#list>`- 遍历索引:`<#list collection as item index>...</#list>`4. 宏定义和调用:- 定义宏:`<#macro macroName parameter1 parameter2>...</#macro>`- 调用宏:`<@macroName parameter1=xxx parameter2=yyy />`5. 内建函数:- 字符串处理:`<#assign result =myString?substring(0, 5)>`- 数字格式化:`${myNumber?string("0.00")}`- 集合操作:`${myList?size}`- 日期处理:`${myDate?string("yyyy-MM-dd")}`6. 引入其他模板:- 引入模板:`<#include "otherTemplate.ftl">`7. 注释:- 单行注释:`<#-- This is a comment -->`- 多行注释:`<#-- This is amulti-line comment -->`这只是Freemarker语法的一小部分,还有很多其他功能和语法可以用于更复杂的模板生成。
Freemarker的基本语法及入门基础
Freemarker的基本语法及⼊门基础freemarker的基本语法及⼊门基础⼀、freemarker模板⽂件(*.ftl)的基本组成部分1. ⽂本:直接输出的内容部分2. 注释:不会输出的内容,格式为<#-- 注释内容 -->3. 取值(插值):代替输出数据模型的部分,格式为${数据模型}或#{数据模型}4. ftl指令:Freemarker指令,类似于HTML标记。
内建指令:开始标签:<#directivename parameter> 结束标签:</#directivename> 空标签:<#directivename parameter/>⾃定义指令:开始标签:<@directivename parameter> 结束标签:</@directivename> 空标签:<@directivename parameter/>⾄于什么是内建指令,什么是⾃定义指令我会在下⾯叙述到。
⼆、Freemarker语法及使⽤⽅法1. 取值(插值)指令及适⽤类型:(1) ${var}适⽤类型:java中常⽤的⼋⼤基本类型以及我们的String引⽤类型,但是,freemarker中boolean类型显⽰时true==yes false==no⽰例:在后台⽂件中定义变量String strVar = "世界你好";int intVar = 10;boolean booVar = true;在页⾯中获取变量:String获取:<font color="red"> ${strVar} </font><br>int获取:<font color="red"> ${intVar} </font><br>boolean获取:<font color="red"> ${booVar?string("yes","no")} </font>展⽰结果:String获取:世界你好int获取:10boolean获取:yes(2)${var!}适⽤类型:对 null 或者不存在的对象进⾏取值,可以设置默认值,例:${var!'我是默认值'} 即,有值时显⽰正常值,⽆值时⽰例:在后台⽂件中定义变量String strVar = "世界你好";String str = null;在页⾯中获取变量:String获取:<font color="red"> ${strVar!"我是空"} </font><br>str获取:<font color="red"> ${str!} </font><br>str获取:<font color="red"> ${str!"默认"} </font><br>展⽰结果:String获取:世界你好str获取:str获取:默认(3)${封装对象.属性}适⽤类型:对封装对象进⾏取值,例:${}⽰例:在后台⽂件中封装对象User[ name, age ]String name = "姓名";int age = 18;在页⾯中获取变量:name获取:<font color="red"> ${} </font><br>age获取:<font color="red"> ${User.age} </font><br>展⽰结果:name获取:姓名age获取:18(4)${date?String('yyyy-MM-dd')}适⽤类型:对⽇期格式进⾏取值,在这⾥我要强调的是,定义Date类型的变量时,java.util.Date⽆法输出⽇期,须使⽤java.sql.Date⽰例:在后台⽂件中定义变量java.sql.Date date = new Date().getTime();java.sql.Date time = new Date().getTime();java.sql.Date datetime = new Date().getTime();在页⾯中获取变量:date获取:<font color="red"> ${date?string('yyyy-MM-dd')} </font><br>time获取:<font color="red"> ${date?string('HH:mm:ss')} </font><br>datetime获取:<font color="red"> ${date?string('yyyy-MM-dd HH:mm:ss')} </font><br>展⽰结果:name获取:姓名age获取:18(5)${var?html}适⽤类型:转义HTML内容⽰例:在后台⽂件中封装变量Menu[ name, model ]Menu m = new Menu();m.setName(" freemarker ");m.setModel("<font color = 'red'>我只是个菜单</font>");在页⾯中获取变量:⾮转义获取:<font color="red"> ${m.model} </font><br>转义获取: ${m.model?html} </font><br>展⽰结果:⾮转义获取:我只是个菜单转义获取:<font color = 'red'>我只是个菜单</font>(6)<#assign num = 100 />适⽤类型:定义变量,⽀持计算和赋值⽰例:在页⾯中定义变量:<#assign num = 100 />num获取:<font color="red"> ${num)} </font><br>计算结果:<font color="red"> ${num * 10} </font><br>展⽰结果:num获取:100计算结果:1000(7)对List集合进⾏取值<#list list集合 as item>${item} --取值</#list>⽰例:List<String> strList = new ArrayList<String>();strList.add("第⼀个值");strList.add("第⼆个值");strList.add("第三个值");在页⾯中获取变量:<#list strList as item>${item!}<br/> --取值</#list>展⽰结果:第⼀个值第⼆个值第三个值(8)对Map集合进⾏取值<#list map?keys as key>${key}:${map[key]}</#list>⽰例:在后台⽂件中定义变量Map<String, Object> m = new HashMap<String, Object>(); m.put("name","姓名");m.put("age",18);m.put("sex","男");在页⾯中获取变量:<#list m?keys as key>${key}:${m[key]}</#list>展⽰结果:name:姓名age:18sex:男2. 条件判断指令:(1) if格式:<#if 条件>输出</#if>⽰例:在页⾯中定义变量并判断条件:<#assign age = 18 /><br><#if age == 18><font color="red"> age = 18</font></#if>展⽰结果:age = 18(2) if - else格式:<#if 条件>输出<#else>输出</#if>⽰例:在页⾯中定义变量并判断条件:<#assign age = 20 /><br><#if age == 18><font color="red"> age = 18</font><#else><font color="red"> age != 18</font></#if>展⽰结果:age != 18(3) if - elseif - else格式:<#if 条件1>输出<#elseif 条件2>输出<#else>输出</#if>在页⾯中定义变量并判断条件:<#assign age = 20 /><br><#if age > 18><font color="red">青年</font><#elseif age == 18><font color="red"> 成年</font><#else><font color="red"> 少年</font></#if>展⽰结果:成年(4) switch --常与case break default⼀起使⽤参数可为字符串格式:<#switch var><#case 条件1>输出<#break><#case 条件2>输出<#break><#default>输出</#switch>⽰例:在页⾯中定义变量并判断:<#switch var="星期⼀"><#case "星期⼀">油焖⼤虾<#break><#case "星期⼆">炸酱⾯<#break><#default>肯德基</#switch>展⽰结果:油焖⼤虾3. ⾃定义函数、⾃定义指令:(1) ⾃定义函数实现TemplateMthodModelEx(2) ⾃定义指令实现TemplateDirectiveModel⽰例:<@⾃定义指令名称⼊参(key-value格式) ; 出参(list格式)>运⾏条件</@⾃定义指令名称>PS:不同的返回值⽤逗号( , )间隔开4.常⽤内建函数、macro(宏指令)、function(函数指令):(1) 常⽤内建函数处理字符串:substring 截取字符串,包头不包尾(下标)cap_first 第⼀个字母⼤写end_with 以什么字母结尾contains 是否包含⽬标字符串date datetime time 转换成⽇期格式starts_with 以什么字母开头index_of 返回某个指定的字符串值在字符串中⾸次出现的位置(下标) last_index_of 获取指定字符出现的最后位置(下标)split 分隔trim 去两端空格处理数字:stringx?string("0.##") 变成⼩数点后⼏位round 四舍五⼊floor 去掉⼩数点ceiling 近1 变成整数first: 取List值第⼀个值last: 取List值最后⼀个值seq_contains: 是否包含指定字符seq_index_of: 指定字符所在位置size: 集合⼤⼩reverse: 集合倒序排列sort: 对集合进⾏排序sort_by: 根据某⼀个属性排序chunk: 分块处理其他:is_string: 是否为字符类型is_number: 是否为整数类型is_method: 是否为⽅法(): 判断整个变量has_content: 判断对象是否为空或不存在 eval:求值(2) macro(宏指令)调⽤:<@macro_name param />语法:<#macro 变量名参数><#nested/></#macro>(3) function(函数指令)调⽤:${function_name(param)}语法:<#function 变量名参数><#return></#function>。
freemarker折行css语法
一、freemarker介绍1. freemarker是什么freemarker是一个用于在模板中生成输出的模板引擎,它可以轻松地生成HTML、XML、RTF等文档格式,并且支持嵌套模板和自定义指令等高级特性。
2. freemarker的优势- freemarker采用的是无嵌入式语法,在模板中不会产生任何程序逻辑或者编程代码,这样可以使得模板更加清晰、易于维护。
- freemarker支持模板的复用,可以使用include指令来引入其他模板,也支持宏定义和宏使用,能够大大提高模板的复用性和可维护性。
- freemarker可以与不同的数据源结合使用,比如可以和数据库、文件、HTTP请求等数据源结合,生成相应的输出。
二、freemarker折行css语法1. 为什么需要使用折行css语法在实际的开发中,我们经常需要在freemarker模板中引入CSS样式,而且为了保持代码的整洁和可读性,我们又希望能够将CSS样式分行展示,以便于后续的维护和修改。
2. 折行css语法示例我们可以将CSS样式分行展示,以提高可读性:```.example {color: #333;font-size: 14px;line-height: 1.5;}```3. 折行css语法的优势- 使得CSS样式更加清晰明了,方便查找和修改- 提高了代码的可读性和可维护性三、如何在freemarker中使用折行css语法1. 在freemarker模板中引入CSS样式在freemarker模板中,我们可以通过`<style>`标签来引入CSS样式,如下所示:```html<!DOCTYPE html><html><head><style type="text/css">.example {color: #333;font-size: 14px;line-height: 1.5;}</style></head><body><div class="example">This is an example of using freemarker with line-break css syntax.</div></body></html>```2. 在freemarker模板中使用外部CSS文件除了在`<style>`标签中定义CSS样式之外,我们也可以将CSS样式定义在外部的CSS文件中,然后在freemarker模板中引入这个外部的CSS文件:```html<link rel="stylesheet" href="style.css">```这样不仅能够使得模板更加清晰,还可以实现CSS样式的复用和分离管理。
freemarker数据模板引擎语法
Freemarker数据模板引擎语法介绍一、概述1. Freemarker 是一个用Java语言编写的模板引擎。
2. 它是一个基于模板的文本生成引擎,用来生成HTML、XML、JSP等各种文本文件。
通过模板引擎,我们可以很容易地将数据和模板文件结合,生成我们想要的数据格式。
二、Freemarker语法1. 模板标签模板标签是Freemarker中最常用的语法标记,用于指定要在模板中填充的数据或进行逻辑控制。
${name}标签会被Freemarker引擎替换成name变量所代表的数据。
2. 表达式Freemarker支持丰富的表达式语法,包括数学运算、逻辑运算、字符串处理等。
${num + 1}表示将num变量的值加1。
3. 指令Freemarker提供了一系列指令用于控制模板文件的生成过程,例如条件判断、循环、导入外部文件等。
<#if condition>...</#if>指令用于条件判断。
4. 注释在Freemarker模板中,我们可以使用注释来对模板文件进行说明或标记。
<#-- This is ament -->。
三、数据模型1. 在Freemarker中,数据模型是一个数据存储对象,用于在模板中填充数据。
2. 数据模型可以是Java中的对象、集合、数组等。
3. 我们可以使用<#list>指令对数据模型进行遍历。
4. 数据模型可以通过<#assign>指令或在模板引擎中进行设置。
5. 在模板中访问数据模型的数据,通常使用${data}语法。
四、模板文件1. Freemarker使用.ftl后缀作为模板文件的标识。
2. 模板文件是一个文本文件,其中包含数据模型的填充标签、表达式、指令等。
3. 我们可以在模板文件中嵌套使用数据模型和指令,以便动态生成文本数据。
4. 模板文件一般存放在项目的特定目录,供程序在运行时读取并进行生成。
五、应用实例1. 我们可以使用Freemarker来生成Web页面,动态填充页面中的数据。
freemaker的基本语法
FreeMaker 常用 语法 总结
Freemarker Note1. 基本知识点1.1注视注释标志<#--这里是注释-->1.2 数字:直接输入,不需要引号1)、精度数字使用“.”分隔,不能使用分组符号2)、目前版本不支持科学计数法,所以“1E3”是错误的3)、不能省略小数点前面的0,所以“.5”是错误的4)、数字8、+8、08和8.00都是相同的1.3 布尔值true和false,不使用引号1.4 变量获取变量:${变量名}变量名只能字母、数字、下划线、$、#、@ 的组合,且不能以数字开头。
<#assign var = value >定义变量并初始化<#local var = value>在macro 或者function 中定义局部变量并初始化<#global var = value >定义全局变量并初始化${var} 输出并替换为表达式的值。
变量表达式在指令中的使用情况:变量表达式可以在指令中,用“”的方式存在,不如:<#include "/footer/${company}.html">.但是不允许下面的方式存在:<#if ${isBig}>Wow!</#if>, 正确写法是:<#if isBig>Wow!</#if>.而且<#if "${isBig}">Wow!</#if>写法也不正确,因为"${isBig}"返回的是字符串,不是boolean类型。
1.5 判断对象是不是null<#if mouse?exists>Mouse found <#else>也可以直接${mouse?if_exists})输出布尔形1.6 控制语句:<#if condition><#elseif condition><#else></#if>条件判断1.7 导入<#include "inc"> inc 为另一个flt文件,在同一级目录下。
freemarker语法完整版
freemarker语法完整版最常用的概念1、scalars:存储单值字符串:直观文本由单或双引号内加出来。
数字:轻易采用数值。
日期:通常从数据模型赢得布尔值:true或false,通常在标记中使用2、hashes:当好其它对象的容器,每个都关联一个唯一的查阅名字具备一个唯一的查阅名字和他涵盖的每个变量相关联。
3、sequences:充当其它对象的容器,按次序访问使用数字和他包含的每个变量相关联。
索引值从0开始。
4、子集变量:除了无法访问它的大小和不能使用索引来获得它的子变量:集合可以看作只能由指令使用的受限sequences。
5、方法:通过传达的参数展开排序,以崭新对象回到结果方法变量通常就是基于得出的参数排序值在数据模型中定义。
6、用户自定义ftl指令:宏和变换器7、节点节点变量则表示为树型结构中的一个节点,通常在xml处置中采用。
在模板里对sequences和hashes初始化sequences1.[dyou‖,‖me‖,‖he‖]2.1..1003.[{dakey‖:‖avalue‖},{dakey1‖:‖avalue1‖},{dbkey‖:‖bvalue‖},{dbkey1‖:‖bvalue1‖},]hashes{dyou‖:‖a‖,‖me‖:‖b‖,‖he‖:‖c‖}注释标志这里就是注解-->sequences内置方法sequence?first回到sequence的第一个值;前提条件sequence无法就是nullsequence?last返回sequence最后一个值sequence?reverse反转sequence的值sequence?size回到sequence的大小sequence?sort对sequence按里面的对象tostring()的结果进行排序sequence?sort_by(value)对sequence按里面的对象的属性value展开排序如:sequence里面放入的是10个user对象,user对象里面包含name,age等属性sequence?sort_by(name)表示所有的user按进行排序hashes内置方法hash?keys回到hash里的所有keys,回到结果类型sequencehash?values回到hash里的所有value,回到结果类型sequence模板使用ftl(freemarker模板语言)编写组成部分一、整体结构1、注解:,不能输入。
freemarker常见语法大全
freemarker常见语法大全格式比较乱一些,适合ctrl+f搜索关键字FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}${?if_exists } //用于判断如果存在,就输出这个值${?default(‘xxx’)}//默认值xxx${!"xxx"}//默认值xxx${book.date?string('yyyy-MM-dd')} //日期格式${book?string.number} 20 //三种不同的数字格式${book?string.currency}--<#-- $20.00 -->${book?string.percent}—<#-- 20% --><#assign foo=ture /> //声明变量,插入布尔值进行显示${foo?string("yes","no")} <#-- yes --><等大小比较符号使用需要注意:(xml的原因),可以用于比较数字和日期使用lt、lte、gt和gte来替代<、<=、>和>= 也可以使用括号<#if (x>y)>内置函数: 调用区别于属性的访问,使用?代替.常见的一些内置函数对于字符串html-对字符串进行HTML编码cap_first-使字符串第一个字母大写lower_case-将字符串转换成小写trim-去掉字符串前后的空白字符对于Sequences(序列)size-获得序列中元素的数目对于数字int-取得数字的整数部分(如-1.9?int的结果是-1)对于集合,可以使用数组的方式,使用下标索引进行访问逻辑判断:if................<#if condition>...<#elseif condition2>...<#elseif condition3>......<#else>...Boolean类型的空值判断空值判断可以写成<#if ?? > //注意${}为变量的渲染显示,而<>为定义等操作符的定义switch............<#switch value><#case refValue1>...<#break><#case refValue2>...<#break>...<#case refValueN>...<#break><#default>...</#switch>快速定义int区间的集合<#assign l=0..100/> //注意不需要[]3:循环读取集合: 注意/的使用<#list student as stu>${stu}<br/></#list>与jstl循环类似,也可以访问循环的状态item_index:当前变量的索引值item_has_next:是否存在下一个对象其中item名称为as后的变量名,如stu集合长度判断<#if student?size != 0></#if> 判断=的时候,注意只要一个=符号,而不是==宏/模板初步了解: 使用更像一个闭包closure,可以定义后,在脚本中任意地方引用,并原地起作用<#macro greet><font size="+2">Hello Joe!</font></#macro>使用的方式为:<@greet></@greet> //同xml可以简写成<@greet/>宏的参数定义,类似js,在宏名后带参数进行传递定义<#macro greet person color>${person}</#macro>调用带参数时,注意使用类似XML的属性格式进行传递,不需要关心顺序问题<@greet person="Fred" color="black"/>参数默认值定义,如果没有,就必须要求传递完整的参数列表<#macro greet person color="black"><font size="+2" color="${color}">Hello ${person}!</font></#macro>使用xml的嵌套内容进行传递宏调用,关键标签<#nested><#macro border><table border=4 cellspacing=0 cellpadding=4><tr><td><#nested></tr></td></table></#macro>调用时:<@border>The bordered text</@border><#nested> 标签可以在宏中多次调用,也可以将多个宏组合进行嵌套for循环的精简版:<#list 1..count as x></#list>宏的循环变量,配合嵌套标签进行参数传递,<#macro repeat count><#list 1..count as x><#nested x, x/2, x==count> //这里的三个参数,将会传递到嵌套内容中</#list></#macro><@repeat count=4 ; c, halfc, last>${c}. ${halfc}<#if last> Last!</#if> //这里的内容由macro中的<#nested>进行参数的传递,传递的数量任意,当注意需要宏接受这些</@repeat>上述还需要注意;的使用参数的数量是可变的,并不要求全部都有,但是效果不同在模板中定义变量在模板中定义的变量有三种类型:plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。
FreeMarker语法详解
(4)Freemarker 与容器无关,因为它并不知道HTTP 或Servlet;Freemarker 同样可以应பைடு நூலகம்于非Web应用程 序环境。 (5)Freemarker 更适合作为Model2框架(如Struts) 的视图组件,你也可以在模板中使用JSP标记库。
(6)Freemarker 是免费的 。
Configuration cfg = new Configuration(); // 指定一个加载模版的数据源 // 这里我设置模版的根目录 cfg.setDirectoryForTemplateLoading(new File("/where/you/store/templates")); // 指定模版如何查看数据模型.这个话题是高级主题… // 你目前只需要知道这么用就可以了: cfg.setObjectWrapper(new DefaultObjectWrapper());
语法 <#escape identifier as expression>
...
</#escape> 用例 主要使用在相似的字符串变量输出,比如某一个模块的所有字符 串输出都必须是html安全的,这个时候就可以使用该表达式 <#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}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语法FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成:1. 文本:直接输出的部分2. 注释:<#-- ... -->格式部分,不会输出3. 插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出4. FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出1. FTL指令规则在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.1.开始标签:<#directivename parameter>2.结束标签:</#directivename>3.空标签:<#directivename parameter/>实际上,使用标签时前面的符号#也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号.使用FTL标签时, 应该有正确的嵌套,而不是交叉使用,这和XML标签的用法完全一样.如果全用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息.FreeMarker会忽略FTL标签中的空白字符.值得注意的是< , /> 和指令之间不允许有空白字符.2. 插值规则FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}2.1 通用插值对于通用插值,又可以分为以下4种情况:1. 插值结果为字符串值:直接输出表达式结果2. 插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:<#settion number_format="currency"/><#assign answer=42/>${answer}${answer?string} <#-- the same as ${answer} -->${answer?string.number}${answer?string.currency}${answer?string.percent}${answer}输出结果是:$42.00$42.0042$42.004,200%3. 插值结果为日期值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}${lastUpdated?string("EEE, MMM d, ''yy")}${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}输出结果是:2008-04-08 08:08:08 Pacific Daylight TimeTue, Apr 8, '03Tuesday, April 08, 2003, 08:08:08 PM (PDT)4. 插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:<#assign foo=true/>${foo?string("yes", "no")}输出结果是:yes2.2 数字格式化插值数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:mX:小数部分最小X位MX:小数部分最大X位如下面的例子:<#assign x=2.582/><#assign y=4/>#{x; M2} <#-- 输出2.58 -->#{y; M2} <#-- 输出4 -->#{x; m2} <#-- 输出2.6 -->#{y; m2} <#-- 输出4.0 -->#{x; m1M2} <#-- 输出2.58 -->#{x; m1M2} <#-- 输出4.0 -->3. 表达式表达式是FreeMarker模板的核心功能,表达式放置在插值语法${}之中时,表明需要输出表达式的值;表达式语法也可与FreeMarker 标签结合,用于控制输出.实际上FreeMarker的表达式功能非常强大,它不仅支持直接指定值,输出变量值,也支持字符串格式化输出和集合访问等功能.3.1 直接指定值使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值.直接指定值可以是字符串,数值,布尔值,集合和MAP对象.1. 字符串直接指定字符串值使用单引号或双引号限定,如果字符串值中包含特殊字符需要转义,看下面的例子:${"我的文件保存在C:\\盘"}${'我名字是\"annlee\"'}输出结果是:我的文件保存在C:\盘我名字是"annlee"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}"}${r"C:\foo\bar"}输出结果是:${foo}C:\foo\bar2. 数值表达式中的数值直接输出,不需要引号.小数点使用"."分隔,不能使用分组","符号.FreeMarker目前还不支持科学计数法,所以"1E3"是错误的.在FreeMarker表达式中使用数值需要注意以下几点:a)数值不能省略小数点前面的0,所以".5"是错误的写法b)数值8 , +8 , 8.00都是相同的3. 布尔值直接使用true和false,不使用引号.4. 集合集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子:<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>${x}</#list>输出结果是:星期一星期二星期三星期四星期五星期六星期天除此之外,集合元素也可以是表达式,例子如下:[2 + 2, [1, 2, 3, 4], "whatnot"]还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..25,Map对象Map对象使用花括号包括,Map中的key-value对之间以英文冒号":"分隔,多组key-value 对之间以英文逗号","分隔.下面是一个例子:{"语文":78, "数学":80}Map对象的key和value都是表达式,但是key必须是字符串3.2 输出变量值FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性.下面分别讨论这些情况1. 顶层变量所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型:Map root = new HashMap(); //创建数据模型root.put("name","annlee"); //name是一个顶层变量对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,可以使用如下语法: ${name}2. 输出集合元素如果需要输出集合元素,则可以根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引:["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].该索引名为week,如果需要输出星期三,则可以使用如下语法:${week[2]} //输出第三个集合元素此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法:week[3..5] //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素3. 输出Map元素这里的Map对象可以是直接HashMap的实例,甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性为key,属性值为value的Map实例.为了输出Map元素的值,可以使用点语法或方括号语法.假如有下面的数据模型:Map root = new HashMap();Book book = new Book();Author author = new Author();author.setName("annlee");author.setAddress("gz");book.setName("struts2");book.setAuthor(author);root.put("info","struts");root.put("book", book);为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法: //全部使用点语法book["author"].namebook.author["name"] //混合使用点语法和方括号语法book["author"]["name"] //全部使用方括号语法使用点语法时,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字可以是任意表达式的结果.3.3字符串操作FreeMarker的表达式对字符串操作非常灵活,可以将字符串常量和变量连接起来,也可以返回字符串的子串等.字符串连接有两种语法:1. 使用${..}或#{..}在字符串常量部分插入表达式的值,从而完成字符串连接.2. 直接使用连接运算符+来连接字符串例如有如下数据模型:Map root = new HashMap(); root.put("user","annlee");下面将user变量和常量连接起来:${"hello, ${user}!"} //使用第一种语法来连接${"hello, " + user + "!"} //使用+号来连接上面的输出字符串都是hello,annlee!,可以看出这两种语法的效果完全一样.值得注意的是,${..}只能用于文本部分,不能用于表达式,下面的代码是错误的:<#if ${isBig}>Wow!</#if><#if "${isBig}">Wow!</#if>应该写成:<#if isBig>Wow!</#if>截取子串可以根据字符串的索引来进行,截取子串时如果只指定了一个索引值,则用于取得字符串中指定索引所对应的字符;如果指定两个索引值,则返回两个索引中间的字符串子串.假如有如下数据模型:Map root = new HashMap(); root.put("book","struts2,freemarker");可以通过如下语法来截取子串:${book[0]}${book[4]} //结果是su${book[1..4]} //结果是tru3.4 集合连接运算符这里所说的集合运算符是将两个集合连接成一个新的集合,连接集合的运算符是+,看如下的例子:<#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x>${x}</#list>输出结果是:星期一星期二星期三星期四星期五星期六星期天3.5 Map连接运算符Map对象的连接运算符也是将两个Map对象连接成一个新的Map对象,Map对象的连接运算符是+,如果两个Map对象具有相同的key,则右边的值替代左边的值.看如下的例子: <#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>语文成绩是${scores.语文}数学成绩是${scores.数学}Java成绩是${scores.Java}输出结果是:语文成绩是86数学成绩是87Java成绩是933.6 算术运算符FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , % 看如下的代码:<#assign x=5>${ x * x - 100 }${ x /2 }${ 12 %10 }输出结果是:-75 2.5 2在表达式中使用算术运算符时要注意以下几点:1,运算符两边的运算数字必须是数字2,使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,如:${3 + "5"},结果是:35使用内建的int函数可对数值取整,如:<#assign x=5>${ (x/2)?int }${ 1.1?int }${ 1.999?int }${ -1.1?int }${ -1.999?int }结果是:2 1 1 -1 -13.7 比较运算符表达式中支持的比较运算符有如下几个:1. =或者==:判断两个值是否相等.2. !=:判断两个值是否不等.3. >或者gt:判断左边值是否大于右边值4. >=或者gte:判断左边值是否大于等于右边值5. <或者lt:判断左边值是否小于右边值6. <=或者lte:判断左边值是否小于等于右边值注意:=和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且FreeMarker是精确比较,"x","x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>3.8 逻辑运算符逻辑运算符有如下几个:逻辑与:&&逻辑或:||逻辑非:!逻辑运算符只能作用于布尔值,否则将产生错误3.9 内建函数FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来轮换输出变量.下面是常用的内建的字符串函数: html:对字符串进行HTML编码cap_first:使字符串第一个字母大写lower_case:将字符串转换成小写upper_case:将字符串转换成大写trim:去掉字符串前后的空白字符下面是集合的常用内建函数size:获取序列中元素的个数下面是数字值的常用内建函数int:取得数字的整数部分,结果带符号例如:<#assign test="Tom & Jerry">${test?html}${test?upper_case?html}结果是:Tom & Jerry TOM & JERRY3.10 空值处理运算符FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变量完全相同.为了处理缺失变量,FreeMarker提供了两个运算符:!: 指定缺失变量的默认值??: 判断某个变量是否存在其中,!运算符的用法有如下两种:variable!或variable!defaultV alue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象.使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false3.11 运算符的优先级FreeMarker中的运算符优先级如下(由高到低排列):1. 一元运算符:!2. 内建函数:?3. 乘除法:*, / , %4. 加减法:- , +5. 比较:> , < , >= , <= (lt , lte , gt , gte)6. 相等:== , = , !=7. 逻辑与:&&8. 逻辑或:||9. 数字范围:..实际上,我们在开发过程中应该使用括号来严格区分,这样的可读性好,出错少4. FreeMarker的常用指令FreeMarker的FTL指令也是模板的重要组成部分,这些指令可实现对数据模型所包含数据的抚今迭代,分支控制.除此之外,还有一些重要的功能,也是通过FTL指令来实现的.4.1 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会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号.4.2 switch , case , default , break指令这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下: <#switch value><#case refV alue>...<#break><#case refV alue>...<#break><#default>...</#switch>4.3 list, break指令list指令是一个迭代输出指令,用于迭代输出数据模型中的集合,list指令的语法格式如下:<#list sequence as item>...</#list>上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量:item_index:当前变量的索引值item_has_next:是否存在下一个对象也可以使用<#break>指令跳出迭代例子如下:<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>${x_index + 1}.${x}<#if x_has_next>,</if><#if x="星期四"><#break></#if></#list>4.4 include指令include指令的作用类似于JSP的包含指令,用于包含指定页.include指令的语法格式如下: <#include filename [options]>在上面的语法格式中,两个参数的解释如下:filename:该参数指定被包含的模板文件options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true.4.5 import指令该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下:<#import "/lib/common.ftl" as com>上面的代码将导入/lib/common.ftl模板文件中的所有变量,将这些变量放置在一个名为com 的Map对象中.创建库下面是一个创建库的例子(假设保存在lib/my_test.ftl中):并可以通过import指令中指定的散列变量访问库中的变量:可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间●可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子:4.6 noparse指令noparse指令指定FreeMarker不处理该指定里包含的内容,该指令的语法格式如下: <#noparse>...</#noparse>看如下的例子:<#noparse><#list books as book><tr><td>${}<td>作者:${book.author}</#list></#noparse>输出如下:<#list books as book><tr><td>${}<td>作者:${book.author}</#list>4.7 escape , noescape指令escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值,使用escape指令的语法格式如下:<#escape identifier as expression>...<#noescape>...</#noescape></#escape>看如下的代码:<#escape x as x?html>First name:${firstName}Last name:${lastName}Maiden name:${maidenName}</#escape>上面的代码等同于:First name:${firstName?html}Last name:${lastName?html}Maiden name:${maidenName?html}escape指令在解析模板时起作用而不是在运行时起作用,除此之外,escape指令也嵌套使用,子escape继承父escape的规则,如下例子:<#escape x as x?html>Customer Name:${customerName}Items to ship;<#escape x as itemCodeToNameMap[x]>${itemCode1}${itemCode2}${itemCode3}${itemCode4}</#escape></#escape>上面的代码类似于:Customer Name:${customerName?html}Items to ship;${itemCodeToNameMap[itemCode1]?html}${itemCodeToNameMap[itemCode2]?html}${itemCodeToNameMap[itemCode3]?html}${itemCodeToNameMap[itemCode4]?html}对于放在escape指令中所有的插值而言,这此插值将被自动加上escape表达式,如果需要指定escape指令中某些插值无需添加escape表达式,则应该使用noescape指令,放在noescape指令中的插值将不会添加escape表达式.4.8 assign指令assign指令在前面已经使用了多次,它用于为该模板页面创建或替换一个顶层变量,assign指令的用法有多种,包含创建或替换一个顶层变量, 或者创建或替换多个变量等,它的最简单的语法如下:<#assign name=value [in namespacehash]>,这个用法用于指定一个名为name的变量,该变量的值为value,此外,FreeMarker允许在使用assign指令里增加in子句,in 子句用于将创建的name变量放入namespacehash命名空间中.assign指令还有如下用法:<#assign name1=value1 name2=value2 ... nameN=valueN [in namespacehash]>,这个语法可以同时创建或替换多个顶层变量,此外,还有一种复杂的用法,如果需要创建或替换的变量值是一个复杂的表达式,则可以使用如下语法格式:<#assign name [in namespacehash]>capture this</#assign>,在这个语法中,是指将assign指令的内容赋值给name变量.如下例子:<#assign x><#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>${n}</#list></#assign>${x}上面的代码将产生如下输出:星期一星期二星期三星期四星期五星期六星期天虽然assign指定了这种复杂变量值的用法,但是我们也不要滥用这种用法,如下例子:<#assign x>Hello ${user}!</#assign>,以上代码改为如下写法更合适:<#assign x="Hello ${user}!">4.9 setting指令该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:<#setting name=value>,在这个格式中,name的取值范围包含如下几个:locale:该选项指定该模板所用的国家/语言选项number_format:指定格式化输出数字的格式boolean_format:指定两个布尔值的语法格式,默认值是true,falsedate_format,time_format,datetime_format:指定格式化输出日期的格式time_zone:设置格式化输出日期时所使用的时区4.10 macro , nested , return指令macro可以用于实现自定义指令,通过使用自定义指令,可以将一段模板片段定义成一个用户指令,使用macro指令的语法格式如下:<#macro name param1 param2 ... paramN>...<#nested loopvar1, loopvar2, ..., loopvarN>...<#return>...</#macro>在上面的格式片段中,包含了如下几个部分:name:name属性指定的是该自定义指令的名字,使用自定义指令时可以传入多个参数paramX:该属性就是指定使用自定义指令时报参数,使用该自定义指令时,必须为这些参数传入值nested指令:nested标签输出使用自定义指令时的中间部分nested指令中的循环变量:这此循环变量将由macro定义部分指定,传给使用标签的模板return指令:该指令可用于随时结束该自定义指令.看如下的例子:<#macro book> //定义一个自定义指令j2ee</#macro><@book /> //使用刚才定义的指令上面的代码输出结果为:j2ee在上面的代码中,可能很难看出自定义标签的用处,因为我们定义的book指令所包含的内容非常简单,实际上,自定义标签可包含非常多的内容,从而可以实现更好的代码复用.此外,还可以在定义自定义指令时,为自定义指令指定参数,看如下代码:<#macro book booklist> //定义一个自定义指令booklist是参数<#list booklist as book>${book}</#list></#macro><@book booklist=["spring","j2ee"] /> //使用刚刚定义的指令上面的代码为book指令传入了一个参数值,上面的代码的输出结果为:spring j2ee不仅如此,还可以在自定义指令时使用nested指令来输出自定义指令的中间部分,看如下例子: <#macro page title><html><head><title>FreeMarker示例页面- ${title?html}</title></head><body><h1>${title?html}</h1><#nested> //用于引入用户自定义指令的标签体</body></html></#macro>上面的代码将一个HTML页面模板定义成一个page指令,则可以在其他页面中如此page指令:<#import "/common.ftl" as com> //假设上面的模板页面名为common.ftl,导入页面<@com.page title="book list"><u1><li>spring</li><li>j2ee</li></ul></@com.page>从上面的例子可以看出,使用macro和nested指令可以非常容易地实现页面装饰效果,此外,还可以在使用nested指令时,指定一个或多个循环变量,看如下代码:<#macro book><#nested 1> //使用book指令时指定了一个循环变量值<#nested 2></#macro><@book ;x> ${x} .图书</@book>当使用nested指令传入变量值时,在使用该自定义指令时,就需要使用一个占位符(如book指令后的;x).上面的代码输出文本如下:1 .图书2 .图书在nested指令中使用循环变量时,可以使用多个循环变量,看如下代码:<#macro repeat count><#list 1..count as x> //使用nested指令时指定了三个循环变量<#nested x, x/2, x==count></#list></#macro><@repeat count=4 ; c halfc last>${c}. ${halfc}<#if last> Last! </#if></@repeat>上面的输出结果为:1. 0.52. 13. 1.54. 2 Last;return指令用于结束macro指令,一旦在macro指令中执行了return指令,则FreeMarker不会继续处理macro指令里的内容,看如下代码:<#macro book>spring<#return>j2ee</#macro><@book />上面的代码输出:spring,而j2ee位于return指令之后,不会输出.用户定义指令●宏和变换器变量是两种不同类型的用户定义指令,它们之间的区别是宏是在模板中使用macro指令定义,而变换器是在模板外由程序定义,这里只介绍宏●基本用法宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子:作为用户定义指令使用宏变量时,使用@替代FTL标记中的#如果没有体内容,也可以使用:●参数在macro指令中可以在宏变量之后定义参数,如:可以这样使用这个宏变量:输出结果是:这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式宏可以有多参数,下面是一个例子:可以这样使用该宏变量:可以在定义参数时指定缺省值,如:宏的参数是局部变量,只能在宏定义中有效●嵌套内容用户定义指令可以有嵌套内容,使用<#nested>指令执行指令开始和结束标记之间的模板片断 例子:这样使用该宏变量:输出结果:<#nested>指令可以被多次调用,例如:输出结果:嵌套内容可以是有效的FTL,下面是一个有些复杂的例子:输出结果:输出结果:●在宏定义中使用循环变量用户定义指令可以有循环变量,通常用于重复嵌套内容,基本用法是:作为nested指令的参数传递循环变量的实际值,而在调用用户定义指令时,在<@…>开始标记的参数后面指定循环变量的名字例子:输出结果:⏹调用时少指定循环变量,则多指定的值不可见⏹调用时多指定循环变量,多余的循环变量不会被创建。