freemark模板语言
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文档语法Freemarker是一种模板引擎,它使用一种类似于HTML的标记语言来生成文本输出。
以下是关于Freemarker文档语法的详细介绍: 1. 变量。
在Freemarker中,使用`${}`来表示变量,例如`${}`表示输出变量user的name属性。
2. 指令。
Freemarker中的指令以`<#`开头,以`>`结尾,例如`<#if>`、`<#list>`等。
指令可以用于条件判断、循环等操作。
3. 注释。
在Freemarker模板中,可以使用`<#--`和`-->`来添加注释,注释部分不会被输出到最终的文本中。
4. 条件判断。
使用`<#if>`、`<#else>`和`<#elseif>`来进行条件判断,例如: <#if user.age gt 18>。
成年人。
<#else>。
未成年人。
</#if>。
5. 循环。
使用`<#list>`来进行循环操作,例如:<#list users as user>。
${}。
</#list>。
6. 宏。
宏可以在Freemarker模板中定义和调用,类似于函数。
例如: <#macro greeting>。
Hello, World!</#macro>。
在其他地方可以通过`<@greeting/>`来调用宏。
7. 导入。
使用`<#import>`来导入其他模板或者Java类,例如:<#import "header.ftl" as header>。
<#import "java.util.Map" as map>。
以上是关于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循环用于遍历一个列表,并输出其中的每个元素。
framemaker 语法
framemaker 语法FreeMarker是一款用Java语言编写的模板引擎,用于生成各种文本,如HTML、XML、Java等。
以下是FreeMarker语法的一些示例:1.变量替换:2.freemarker复制代码<#assign name="John">Hello ${name}!1.控制结构:2.freemarker复制代码<#if name == "John">Hello John!<#else>Hello ${name}!</#if>1.宏定义和调用:2.freemarker复制代码<#macro greet person><font size="+2">Hello ${person}!</font></#macro><@greet person="John"/>1.列表和迭代:2.freemarker复制代码<#list items as item>${item}</#list>1.内置函数:2.freemarker复制代码<#function formatDate date><#return date?string("yyyy-MM-dd HH:mm:ss")></#function>${formatDate(date)}这些只是FreeMarker语法的一些基本示例,FreeMarker还支持更复杂的表达式和控制结构。
freemarkerconfigurer表达式
FreeMarker 是一个用 Java 语言编写的模板引擎,它是一个用于生成输出文本的通用工具。
FreeMarker 的配置器是 FreeMarkerConfigurer,它用于配置FreeMarker 模板引擎的各种参数和属性。
在表达式方面,FreeMarker 支持多种类型的表达式,包括:
1. 文字表达式:直接书写文本,例如:"Hello, ${name}!"。
2. 变量表达式:使用 `${}` 包围变量名,例如:`${name}`。
3. 布尔表达式:使用 `!?` 操作符进行逻辑判断,例如:`${!empty name}`。
4. 算术表达式:使用 `+`、`-`、`*`、`/` 等运算符进行数学运算,例如:`${100 + 50}`。
5. 比较表达式:使用 `<`、`>`、`<=`、`>=` 等运算符进行比较,例如:
`${age > 18}`。
6. 函数表达式:使用函数名称和参数列表调用函数,例如:
`${substring(name, 0, 3)}`。
7. 正则表达式:使用正则表达式匹配字符串,例如:`${name ~ /^John/}`。
以上是 FreeMarker 支持的一些常见表达式类型,可以根据实际需求选择合适的表达式来表达模板中的逻辑和数据。
freemarker !用法
freemarker !用法Freemarker是一种模板引擎,可以在Web应用中轻松地生成HTML,XML,JSON等文件。
它允许我们将数据和静态模板分离,从而使我们的代码更加清晰易读。
在这篇文章中,我们将探讨Freemarker的用法和一些最佳实践。
首先,我们需要了解Freemarker的基本语法。
Freemarker使用尖括号标记“<% %>"来定义内容块。
在这些标记内,我们可以使用变量,表达式,条件和迭代语句等。
例如,以下是一个简单的Freemarker模板:```<html><head><title>Hello, ${name}!</title></head><body><p>Welcome to our website!</p></body></html>```在这个模板中,我们使用了变量“name”。
这个变量可以在Java 代码中设置,并在生成HTML时插入到相应的位置。
为了在Java中使用Freemarker,我们需要引入Freemarker库,并创建一个Configuration对象:```Configuration cfg = newConfiguration(Configuration.VERSION_2_3_30);cfg.setClassForTemplateLoading(Main.class, "/templates"); cfg.setDefaultEncoding("UTF-8");```在这个例子中,我们设置了模板目录,并设置了默认编码为UTF-8。
然后,我们可以使用TemplateLoader从模板文件读取模板:```Template template = cfg.getTemplate("hello.ftl");```接下来,我们需要将我们的数据传递给数据模型。
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基础入门
简介:最简单的模板是普通HTML 文件(或者是其他任何文本文件—FreeMarker本身不属于HTML)。
当客户端访问页面时,FreeMarker 要发送HTML 代码至客户端浏览器端显示。
如果想要页面动起来,就要在HTML 中放置能被FreeMarker所解析的特殊部分。
${…}:FreeMarker将会输出真实的值来替换花括号内的表达式,这样被称为interpolations 插值,可以参考第上面一个示例的内容。
FTL tags 标签(FreeMarker模板的语言标签):FTL 标签和HTML 标签有一点相似,但是它们是FreeMarker的指令而且是不会直接输出出来的东西。
这些标签的使用一般以符号#开头。
(用户自定义的FTL 标签使用@符号来代替#,但这是更高级的主题了,后面会详细讨论)。
Comments 注释:FreeMarker的注释和HTML 的注释相似,但是它用<#--和-->来分隔。
任何介于这两个分隔符(包含分隔符本身)之间内容会被FreeMarker忽略,就不会输出出来了。
其他任何不是FTL 标签,插值或注释的内容将被视为静态文本,这些东西就不会被FreeMarker所解析,会被按照原样输出出来。
directives 指令就是所指的FTL 标签。
这些指令在HTML 的标签(如<table>和</table>)元素(如table 元素)中的关系是相同的。
(如果现在你还不能区分它们,把“FTL 标签”和“指令”看做是同义词即可。
)三大指令1.if指令<#if condition>...<#elseif condition2>...<#elseif condition3>......<#else>...其中空值判断可以写成<#if ?? ></#if>2.list指令遍历集合中的数据:<#list sequence as item>...</#list><#list>空值判断<#if bookList?size = 0></#list>例子:<#list employees.part1 as e>${}<#if e_has_next>集合还有数据,不是最后一个!<#else>已经没有数据了!<#/if></#list>3. include指令include 指令,我们可以插入其他文件的内容到当前的模板中。
FreeMarker模板文件的组成及基本语法详解
</#list>
输出结果是:
星期一
星期二
星期三
星期四
星期五
星期六
星期天
除此之外,集合元素也可以是表达式,例子如下:
[2 + 2, [1, 2, 3, 4], "whatnot"]
还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..2
1,开始标签:<#directivename parameter>
2,结束标签:</#directivename>
3,空标签:<#directivename parameter/>
实际上,使用标签时前面的符号#也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号.
${foo?string("yes", "no")}
输出结果是:
yes
2.2 数字格式化插值
数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
如下面的例子:
<#assign x=2.582/>
<#assign y=4/>
使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值.直接指定值可以是字符串,数值,布尔值,集合和MAP对象.
1,字符串
直接指定字符串值使用单引号或双引号限定,如果字符串值中包含特殊字符需要转义,看下面的例子:
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页面,动态填充页面中的数据。
freemarkertemplate 语法
文章标题:深度剖析Freemarker模板语法在Web应用程序开发中,模板引擎是不可或缺的一部分。
它允许开发者在不同的数据源和视图之间进行有效的数据交互和展示。
Freemarker作为一种强大的模板引擎,提供了丰富的语法和功能,能够满足各种复杂的需求。
本文将深度剖析Freemarker模板语法,带您进入这个强大工具的世界。
1. 概述我们来了解一下Freemarker是什么。
Freemarker是一种基于模板的通用文本生成器,它主要用于生成和转换文本输出,比如HTML网页、电流信箱和配置文件等。
它的语法灵活,功能强大,被广泛应用于Java评台的Web应用程序开发中。
2. 变量和数据模型在Freemarker中,变量是最基本的概念。
变量可以是简单的值,也可以是对象或集合。
在模板中使用变量时,可以通过`${...}`的形式引用。
Freemarker还支持数据模型的概念,它允许开发者在模板中使用Java的对象和方法。
这为模板的灵活性和可复用性提供了很大的便利。
3. 表达式和指令在Freemarker模板中,表达式和指令是非常重要的部分。
通过表达式,我们可以实现对变量的计算和判断;通过指令,我们可以实现循环、条件判断和模板包含等功能。
这使得模板的逻辑处理变得非常灵活,可以根据不同的条件和数据对模板进行动态生成和渲染。
4. 内置函数和方法Freemarker内置了许多实用的函数和方法,用于处理字符串、集合、日期等各种数据类型。
这些内置函数和方法可以大大简化模板的编写,提高代码的复用性和可维护性。
开发者也可以自定义自己的函数和方法,从而扩展和定制Freemarker的功能。
5. 引入和包含在大型项目中,通常需要将模板进行模块化和组件化,以便更好地管理和维护代码。
Freemarker提供了模板的引入和包含功能,允许开发者将多个模板组合起来,形成一个完整的页面或文档。
这种机制能够有效地提高模板的复用性和可拓展性。
freemaker 语法
freemaker 语法FreeMaker 是一款流行的模板引擎,用于快速开发 Web 应用程序。
FreeMaker 语法是基于标记语言的,它允许开发人员使用简单的标记来构建复杂的页面和组件。
以下是 FreeMaker 语法的一些基本内容:1. 标题 (H1-H6):使用 H1 到 H6 标记来定义页面标题,每个标题标记之间用空格分隔。
例如:```H1 This is a headingH2 Another headingH3 Yet another heading```2. 段落 (P):使用 P 标记来定义段落,可以使用换行符 "" 来创建多行文本。
例如:```P This is a paragraph.P Another paragraph.```3. 列表 (UL、OL):使用 UL 和 OL 标记来定义无序和有序列表。
无序列表使用无序项标记 (UL) 来表示,有序列表使用有序项标记(OL) 来表示。
例如:```UL<li>Item 1</li><li>Item 2</li><li>Item 3</li>ULOL<li>Item 1</li><li>Item 2</li><li>Item 3</li>OL```4. 图标 (I):使用 I 标记来插入图标。
例如:```I Like FreeMaker```5. 链接 (A):使用 A 标记来创建链接。
可以使用 URL 或者本地文件路径作为链接目标。
例如:```A Go to the homepageA <img src="image.jpg" alt="image">```6. 表格 (TD、TR、TH):使用 TD 和 TR 标记来定义表格单元格和表头。
freemarker 表达式
freemarker 表达式Freemarker表达式是在Freemarker模板中使用的一种语法,用于在模板中进行动态数据处理和逻辑控制。
表达式可以包含变量、运算符、函数调用等内容。
以下是一些常见的Freemarker表达式示例:1. 访问变量:可以使用变量名称直接访问模板中的变量。
{variable}2. 数值运算:可以对数值类型的变量进行加减乘除等运算。
{2 + 3} 加法{5 - 2} 减法{2 * 3} 乘法{6 / 2} 除法{6 % 4} 取余3. 字符串拼接:可以使用+运算符将多个字符串拼接成一个字符串。
{"Hello," + " World!"}4. 逻辑运算:可以使用逻辑运算符进行逻辑判断。
{true && false} 逻辑与{true false} 逻辑或{!true} 逻辑非5. 条件判断:可以使用if-else语句对条件进行判断,并根据条件执行不同的代码块。
<#if condition>code block<#elseif anotherCondition>code block<#else>code block</#if>6. 循环迭代:可以使用foreach语句对一个集合进行迭代操作。
<#list collection as item>code block</#list>7. 函数调用:可以调用Freemarker内置的函数或自定义函数进行各种数据处理操作。
{myFunction(parameter)} 调用自定义函数{someBuiltinFunction(parameter)} 调用内置函数以上示例只是Freemarker表达式的一小部分,还有更多高级的语法和用法可以用于动态数据展示和逻辑控制。
freemaker语句写法
Freemarker是一种模板引擎,用于生成文本输出(HTML 网页)。
它是一种通用工具,可以用于生成任何文本文件,包括源代码、配置文件、电子邮件、网页等。
在Freemarker中,你可以使用表达式(Expression)和声明(Directive)来控制模板的输出。
表达式(Expression): 用于求值并生成结果。
表达式可以使用大括号 `{}` 来包围。
例如,`${}` 将求取"user"对象中"name"属性的值。
声明(Directive): 用于控制模板的流程或内容。
常见的声明有 `#if`、`#else`、`#elseif`、`#switch`、`#case`、`#break` 等。
例如,`<#if user.age >18>成年人</#if>` 如果"user"对象的"age"属性大于18,将输出"成年人"。
下面是一些Freemarker语法示例:1. 判断变量是否存在:* 写法一:`<#if myList? >存在</#if>`* 写法二:`<#if myList? exists>存在</#if>`2. 多条件判断:* `<#if condition1> output1 </#if> <#elseif condition2> output2 </#elseif>`3. switch语句:* `<#switch expression> <#case value> output1 </#case> <#case value> output2 </#case> default: output3 </#switch>`4. 字符串常用内建函数:* 连接:`${a+b}`* 截取:`${(a+b)?substring(5,6)}`* 长度:`${(a+b)?length}`* 大写:`${(a+b)?upper_case}`* 小写:`${(a+b)?lower_case}`5. 列表遍历:* `<#list myList as item> ${item} </#list>`6. 判断是否为空:* `<#if myList? && myList.size() > 0>不为空</#if>`7. 判断是否存在某个元素:* `<#if myList? && myList.contains(item)>存在</#if>`8. 对变量进行默认赋值:* `${(a+b)?:0}` 如果表达式为空,则返回0。
FreeMarker模板语法
FreeMarker模板语法四、FreeMarker模板语法要编写复杂的模板需要熟悉FreeMarker语法规则,官⽹有详细说明,中⽂帮助也⽐较详细了,下⾯这些内容是从⽹上收罗来的,感谢⽹友的分享,经过整理与修改的内容如下。
建议直接看官⽹的⽂档。
4.0、模板⽂件的4个组成部分FreeMarker模板⽂件主要由如下4个部分组成:1,⽂本:直接输出的部分2,注释:<#-- ... -->格式部分,不会输出3,插值:即${...}或#{...}格式的部分,将使⽤数据模型中的部分替代输出4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出下⾯是⼀个FreeMarker模板的例⼦,包含了以上所说的4个部分<html><head><title>Welcome!</title></head><body><#--下⾯是⽂本将直接输出-->Hello FreeMarker<#-- 注释部分 --><#-- 下⾯使⽤插值 --><h1>Welcome ${user} !</h1><u1><#-- 使⽤FTL指令 --><#list animals as being><li>${} for ${being.price} Euros<#list><u1></body></html>4.1、FTL指令规则在FreeMarker中,使⽤FTL标签来使⽤指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.1.开始标签:<#指令名参数> 如<#list users as user>2.结束标签:</#指令名> 如</#list>3.单标签:<#指令名参数/>实际上,使⽤标签时前⾯的符号#也可能变成@,如果该指令是⼀个⽤户指令⽽不是系统内建指令时,应将#符号改成@符号.使⽤FTL标签时,应该有正确的嵌套,⽽不是交叉使⽤,这和XML标签的⽤法完全⼀样.如果全⽤不存在的指令,FreeMarker不会使⽤模板输出,⽽是产⽣⼀个错误消息.FreeMarker会忽略FTL标签中的空⽩字符.值得注意的是< , /> 和指令之间不允许有空⽩字符.4.2、插值规则FreeMarker的插值有如下两种类型:1、通⽤插值${expr};2、数字格式化插值:#{expr}或#{expr;format}可以简单理解为输出表达式4.2.1 通⽤插值对于通⽤插值,⼜可以分为以下4种情况:1、插值结果为字符串值:直接输出表达式结果2、插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成⽂本输出.可以使⽤内建的字符串函数格式化单个插值,如下⾯的例⼦:<#setting number_format="currency"/> <#-- 设置数字格式为货币 --><#assign answer=42/> <#-- 赋值 -->${answer} <#-- 输出 -->${answer?string} <#-- 输出格式为字符类型,与上⾯相同-->${answer?string.number} <#-- 输出格式为数字类型-->${answer?string.currency} <#-- 输出格式为货币类型-->${answer?string.percent} <#-- 输出格式为百分⽐类型-->输出结果是:$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")}输出结果是:yes4.2.2 数字格式化插值数字格式化插值可采⽤#{expr;format}形式来格式化数字,其中format可以是:mX:⼩数部分最⼩X位MX:⼩数部分最⼤X位如下⾯的例⼦:<#assign x=2.582/><#assign y=4/>#{x; M2}#{y; M2}#{x; m2}#{y; m2}#{x; m1M2}#{x; m1M2}输出结果:2.5842.584.002.582.584.3、表达式表达式是FreeMarker模板的核⼼功能,表达式放置在插值语法${}之中时,表明需要输出表达式的值;表达式语法也可与FreeMarker标签结合,⽤于控制输出.实际上FreeMarker的表达式功能⾮常强⼤,它不仅⽀持直接指定值,输出变量值,也⽀持字符串格式化输出和集合访问等功能.4.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表达式中使⽤数值需要注意以下⼏点:1、数值不能省略⼩数点前⾯的0,所以".5"是错误的写法2、数值8 , +8 , 8.00都是相同的3、布尔值直接使⽤true和false,不使⽤引号.4、集合集合以⽅括号包括,各集合元素之间以英⽂逗号","分隔,看如下的例⼦:<#list ["星期⼀", "星期⼆", "星期三", "星期四", "星期五", "星期六", "星期天"] as week>${week}</#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必须是字符串4.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"] //全部使⽤⽅括号语法使⽤点语法时,变量名字有顶层变量⼀样的限制,但⽅括号语法没有该限制,因为名字可以是任意表达式的结果.4.3.3、字符串操作FreeMarker的表达式对字符串操作⾮常灵活,可以将字符串常量和变量连接起来,也可以返回字符串的⼦串等.字符串连接有两种语法:1、使⽤${..}或#{..}在字符串常量部分插⼊表达式的值,从⽽完成字符串连接.2、直接使⽤连接运算符+来连接字符串例如有如下数据模型:Map root = new HashMap();root.put("user","annlee");下⾯将user变量和常量连接起来:使⽤第⼀种语法来连接"hello,$user!"//使⽤第⼀种语法来连接{"hello, " + user + "!"} //使⽤+号来连接上⾯的输出字符串都是hello,annlee!,可以看出这两种语法的效果完全⼀样.值得注意的是,{..}只能⽤于⽂本部分,不能⽤于表达式,下⾯的代码是错误的: <#if{..}只能⽤于⽂本部分,不能⽤于表达式,下⾯的代码是错误的: <#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]} //结果是st${book[1..4]} //结果是trut4.3.4、集合连接运算符这⾥所说的集合运算符是将两个集合连接成⼀个新的集合,连接集合的运算符是+,看如下的例⼦:<#list ["星期⼀","星期⼆","星期三"] + ["星期四","星期五","星期六","星期天"] as week>${week}</#list>输出结果是:星期⼀星期⼆星期三星期四星期五星期六星期天4.3.5、Map连接运算符Map对象的连接运算符也是将两个Map对象连接成⼀个新的Map对象,Map对象的连接运算符是+,如果两个Map对象具有相同的key,则右边的值替代左边的值.看如下的例⼦:<#assign scores = {"语⽂":86,"数学":78} + {"数学":87,"Java":93}>语⽂成绩是语⽂数学成绩是scores.语⽂数学成绩是{scores.数学}Java成绩是${scores.Java}输出结果是:语⽂成绩是86数学成绩是87Java成绩是934.3.6、算术运算符FreeMarker表达式中完全⽀持算术运算,FreeMarker⽀持的算术运算符包括:+, - , * , / , % 看如下的代码:<#assign x=5>x∗x−100{ x /2 }${ 12 %10 }输出结果是:-752.52在表达式中使⽤算术运算符时要注意以下⼏点:1、运算符两边的运算数字必须是数字2、使⽤+运算符时,如果⼀边是数字,⼀边是字符串,就会⾃动将数字转换为字符串再连接,如:${3 + "5"},结果是:35使⽤内建的int函数可对数值取整,如:<#assign x=5>(x/2)?int{ 1.1?int }1.999?int{ -1.1?int }${ -1.999?int }结果是:211-1-14.3.7、⽐较运算符表达式中⽀持的⽐较运算符有如下⼏个:1,=或者==:判断两个值是否相等.2,!=:判断两个值是否不等.3,>或者gt:判断左边值是否⼤于右边值4,>=或者gte:判断左边值是否⼤于等于右边值5,<或者lt:判断左边值是否⼩于右边值6,<=或者lte:判断左边值是否⼩于等于右边值注意:=和!=可以⽤于字符串,数值和⽇期来⽐较是否相等,但=和!=两边必须是相同类型的值,否则会产⽣错误,⽽且FreeMarker是精确⽐较,"x","x ","X"是不等的.其它的运⾏符可以作⽤于数字和⽇期,但不能作⽤于字符串,⼤部分的时候,使⽤gt等字母运算符代替>会有更好的效果,因为FreeMarker会把>解释成FTL 标签的结束字符,当然,也可以使⽤括号来避免这种情况,如:<#if (x>y)>4.3.8、逻辑运算符逻辑运算符有如下⼏个:逻辑与:&&逻辑或:||逻辑⾮:!逻辑运算符只能作⽤于布尔值,否则将产⽣错误4.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 & JerryTOM & JERRY4.3.10、空值处理运算符FreeMarker对空值的处理⾮常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这⾥所说的空值,实际上也包括那些并不存在的变量,对于⼀个Java的null值⽽⾔,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板⽽⾔,它⽆法理解null值,null值和不存在的变量完全相同.为了处理缺失变量,FreeMarker提供了两个运算符:!:指定缺失变量的默认值:判断某个变量是否存在其中,!运算符的⽤法有如下两种:variable!或variable!defaultValue,第⼀种⽤法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象.使⽤!指定默认值时,并不要求默认值的类型和变量类型相同.使⽤??运算符⾮常简单,它总是返回⼀个布尔值,⽤法为:variable??,如果该变量存在,返回true,否则返回false⽰例:${tom!"tom is missed"}<#if !jack??>jack is missed</#if>输出:tom is missedjack is missed4.3.11、运算符的优先级FreeMarker中的运算符优先级如下(由⾼到低排列):1,⼀元运算符:!2,内建函数:?3,乘除法:*, / , %4,加减法:- , +5,⽐较:> , < , >= , <= (lt , lte , gt , gte)6,相等:== , = , !=7,逻辑与:&&8,逻辑或:||9,数字范围:..实际上,我们在开发过程中应该使⽤括号来严格区分,这样的可读性好,出错少4.4、FreeMarker的常⽤指令FreeMarker的FTL指令也是模板的重要组成部分,这些指令可实现对数据模型所包含数据的抚今迭代,分⽀控制.除此之外,还有⼀些重要的功能,也是通过FTL 指令来实现的.4.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.4.2、switch , case , default , break指令这些指令显然是分⽀指令,作⽤类似于Java的switch语句,switch指令的语法结构如下:<#switch value><#case refValue>...<#break><#case refValue>...<#break><#default>...</#switch>⽰例:<#assign level=1><#switch level><#case 1>A级<#break><#case 2>B级<#break><#case 3>C级<#break><#default>未知级别</#switch>输出:A级4.4.3、list, break指令list指令是⼀个迭代输出指令,⽤于迭代输出数据模型中的集合,list指令的语法格式如下:<#list sequence as item>...</#list>上⾯的语法格式中,sequence就是⼀个集合对象,也可以是⼀个表达式,但该表达式将返回⼀个集合对象,⽽item是⼀个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量:item_index:当前变量的索引值item_has_next:是否存在下⼀个对象也可以使⽤<#break>指令跳出迭代⽰例:<#list ["星期⼀", "星期⼆", "星期三", "星期四", "星期五", "星期六", "星期天"] as week>weekindex+1.{week}<#if week_has_next>,</#if><#if week="星期四"><#break></#if></#list>输出结果:1.星期⼀,2.星期⼆,3.星期三,4.星期四,4.4.4、include指令include指令的作⽤类似于JSP的包含指令,⽤于包含指定页.include指令的语法格式如下:<#include filename [options]>在上⾯的语法格式中,两个参数的解释如下:filename:该参数指定被包含的模板⽂件options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页⾯时所⽤的解码集,⽽parse指定被包含⽂件是否作为FTL⽂件来解析,如果省略了parse选项值,则该选项默认是true.4.4.5、import指令该指令⽤于导⼊FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下:<#import "/lib/common.ftl" as com>上⾯的代码将导⼊/lib/common.ftl模板⽂件中的所有变量,交将这些变量放置在⼀个名为com的Map对象中.4.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.4.7、escape , noescape指令escape指令导致body区的插值都会被⾃动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值,使⽤escape指令的语法格式如下:<#escape identifier as expression>...<#noescape>...</#noescape></#escape>看如下的代码:<#escape x as x?html>First name:firstNameLastname:{lastName}Maiden name:{maidenName} </#escape> 上⾯的代码等同于: First name:{maidenName} </#escape> 上⾯的代码等同于: First name:{firstName?html}Last name:lastName?htmlMaidenname:{maidenName?html}escape指令在解析模板时起作⽤⽽不是在运⾏时起作⽤,除此之外,escape指令也嵌套使⽤,⼦escape继承⽗escape的规则,如下例⼦:<#escape x as x?html>CustomerName:{customerName} Items to ship; <#escape x as itemCodeToNameMap[x]>{customerName} Items to ship; <#escape x as itemCodeToNameMap[x]> {itemCode1}itemCode2{itemCode3}{itemCode4} </#escape> </#escape> 上⾯的代码类似于: Customer Name:{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.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 weeks><#list ["星期⼀", "星期⼆", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>{n} </#list> </#assign>{n} </#list> </#assign>{weeks}上⾯的代码将产⽣如下输出:星期⼀星期⼆星期三星期四星期五星期六星期天虽然assign指定了这种复杂变量值的⽤法,但是我们也不要滥⽤这种⽤法,如下例⼦:<#assign x>Hello {user}!</#assign>,以上代码改为如下写法更合适:<#assign x="Hello{user}!</#assign>,以上代码改为如下写法更合适:<#assign x="Hello{user}!">4.4.9、setting指令该指令⽤于设置FreeMarker的运⾏环境,该指令的语法格式如下:<#setting name=value>,在这个格式中,name的取值范围包含如下⼏个:locale:该选项指定该模板所⽤的国家/语⾔选项number_format:指定格式化输出数字的格式boolean_format:指定两个布尔值的语法格式,默认值是true,falsedate_format,time_format,datetime_format:指定格式化输出⽇期的格式time_zone:设置格式化输出⽇期时所使⽤的时区4.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><>从上⾯的例⼦可以看出,使⽤macro和nested指令可以⾮常容易地实现页⾯装饰效果,此外,还可以在使⽤nested指令时,指定⼀个或多个循环变量,看如下代码:<#macro book><#nested 1> //使⽤book指令时指定了⼀个循环变量值<#nested 2></#macro><@book ;x> ${x} .图书<>当使⽤nested指令传⼊变量值时,在使⽤该⾃定义指令时,就需要使⽤⼀个占位符(如book指令后的;x).上⾯的代码输出⽂本如下:1 .图书2 .图书在nested指令中使⽤循环变量时,可以使⽤多个循环变量,看如下代码:<#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></@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指令之后,不会输出。
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语法完整版
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、注解:,不能输入。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
竭诚为您提供优质文档/双击可除freemark模板语言篇一:Freemark模板使用1.导入freemarker-2.3.18.jar到lib下2.新建mytag类继承simpletagsupportimportjavax.servlet.jsp.jspexception; importjavax.servlet.jsp.pagecontext; importjavax.servlet.jsp.tagext.simpletagsupport; importfreemarker.template.configuration; importfreemarker.template.template; publicclassmytagextendssimpletagsupport{ privatestringflct;//参数publicstringgetFlct(){returnflct;}publicvoidsetFlct(stringflct){this.flct=flct;}@overridepublicvoiddotag()throwsjspexception,ioexception{try {pagecontextpagecontext=(pagecontext)this.getjspcontext();configurationcfg=newconfiguration();//设置Freemarker的模版文件位置cfg.setservletcontextFortemplateloading(pagecontext.getserletcontext(),"templates");//templates为webRoot下templates文件夹//设置编码方式cfg.setdefaultencoding("gbk");//建立数据模型maproot=newhashmap();}privatelistgetuserlist(){root.put("user",flct) ;//flct为前台传入的参数,现在又把它传回去显示listuserlist=this.getuserlist();//可以传多个参数回去root.put("userlist",userlist);//取得模版文件会到系统的/webRoot/templates/目录下找hello.ftl文件templatet=cfg.gettemplate("hello.ftl");t.process(root,pagecontext.getout());}catch(templateexceptione) {e.printstacktrace();}}}listuserlist=newarraylist();userus=newuser();u s.setage(21);us.setpassword("10101010");us.setusern ame("陈扬柱");userlist.add(us);returnuserlist;3.在webRoot下新建templates文件夹新建hello.ftl 文件freemark使用${user}用户名:${ername}年龄:${user.age}4.在web-inF下新建tld文件夹(可选,名字自取)然后新建文件my-tags-tld(名字自己取,但必须是tld后缀)/xml/ns/j2ee/web-jsptaglibrary_2 _0.xsd">mytags1e/my-tagshello-topcom.elprj.tag.mytagemptyflctfalsetrue5.新建mytest.jsp导入:调用:输出:笑笑输出:用户名:陈扬柱年龄:21篇二:Freemarker模版开发指南Freemarker概述Freemarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯java编写Freemarker被设计用来生成htmlweb页面,特别是基于mVc模式的应用程序虽然Freemarker具有一些编程的能力,但通常由java程序准备要显示的数据,由Freemarker生成页面,通过模板显示准备的数据(如下图)Freemarker不是一个web应用框架,而适合作为web应用框架一个组件Freemarker与容器无关,因为它并不知道http或servlet;Freemarker同样可以应用于非web应用程序环境Freemarker更适合作为model2框架(如struts)的视图组件,你也可以在模板中使用jsp标记库Freemarker是免费的Freemarker特性1、通用目标能够生成各种文本:html、xml、RtF、java 源代码等等易于嵌入到你的产品中:轻量级;不需要servlet 环境插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等你可以按你所需生成文本:保存到本地文件;作为email发送;从web应用程序发送它返回给web浏览器2、强大的模板语言所有常用的指令:include、if/elseif/else、循环结构在模板中创建和改变变量几乎在任何地方都可以使用复杂表达式来指定值命名的宏,可以具有位置参数和嵌套内容名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突输出转换块:在嵌套模板片段生成输出时,转换html转义、压缩、语法高亮等等;你可以定义自己的转换。
3、通用数据模型Freemarker不是直接反射到java对象,java对象通过插件式对象封装,以变量方式在模板中显示你可以使用抽象(接口)方式表示对象(javabean、xml文档、sql查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰4、为web准备在模板语言中内建处理典型web相关任务(如html转义)的结构能够集成到model2web应用框架中作为jsp的替代支持jsp标记库为mVc模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员5智能的国际化和本地化字符集智能化(内部使用unicode)数字格式本地化敏感日期和时间格式本地化敏感非us字符集可以用作标识(如变量名)多种不同语言的相同模板6、强大的xml处理能力和指令(2.3版本)用于递归遍历xml树在模板中清楚和直觉的访问xml对象模型7.Freemarkervs.Velocity1概述Velocity是一个简单而且更加轻量级的工具,但是它没有达到Freemarker能够做的许多任务,而且它的模板语言不是很强大我们认为对于大多数应用程序,Freemarker比Velocity工作更简单,因为:使用Velocity,你需要寻找特定工具或各种工作环境来一次次的解决典型的模板创作任务,结果会浪费更多时间工作环境经常意味着在Velocity 模板中直接使用java对象的方法,这违反了简单、无编程html设计的观念或者将表示任务移到控制器代码中,这违反了mVc模式使用Freemarker,可以以out-of-the-box(如何翻译确切?)的方式实现Velocity所能做的2、特性比较清下面是一个使用Freemarker能够实现,而Velocity不能实现的不太全面的特性清单:(1)数字和日期支持可以对任何数字类型进行算术运算和比较,包括精度类型可以比较和显示(格式化)日期/时间值(2)国际化根据各种内建和定制的数字格式,格式化本地敏感的数字根据各种内建和定制的日期格式,格式化本地敏感和时区敏感的日期标识(变量名)可以包含非英语字符,如重音字符、阿拉伯字符、中文字符等(3)循环处理可以跳出循环可以在循环外访问循环体内的控制变量可以测试是否达到最后一次循环(4)模板级别的数组处理可以使用类似[i]语法的索引方式访问数组元素可以查询数组长度(5)宏宏可以有局部变量可以递归调用宏,同样可以在模板的后面定义要调用的宏调用宏时,可以按位置或名字的方式传递参数宏参数可以有缺省值,使得在调用时忽略参数也有效调用的宏可以有嵌套的体内容(body),能够在宏被调用时进行处理宏是纯变量的,可以基于表达式来执行宏,或者作为参数传递给另一个宏(6)命名空间可以对变量使用多命名空间,这对创建宏库很重要,因为这可以避免应用程序中指定的变量和宏库中变量的名字冲突(7)使用内建的函数/操作符维护java无关的string、list和map可以将字符串转换成大/小写、首字符大/小写,对html、xml或RtF进行转义处理,substring、split、查询字符串长度、find/replace子串等等通过索引访问list元素,获得子list,合并list,查询list长度,对list排序通过key变量访问map元素,检查map是否为空,获得key或值的list(8)揭示模板中的错误当访问一个未定义的变量,Freemarker不会沉默;你可以配置Freemarker来停止render模板显示错误信息,或者跳过错误部分;无论哪种,Freemarker会记录问题(日志)在写错指令名时,Freemarker 会抛出异常(9)高级render控制可以使用一组标记来封装模板的一块区域,以便在块区中所有要修改的地方应用html或xml 转义(或其它使用Freemarker表达式表示的转换)Freemarker有转换器,它们是模板的一块区域,在render时,通过转换过滤;内建的转换器包括空白字符压缩、html 和xml转义;你可以实现自己的转换器;当然转换器可以嵌套可以使用flush指令显式的flush输出可以使用stop指令停止render(10)文字除了通常的字符串、数字和布尔值文字,也可以在模板中定义list和map文字支持所有的java转义文字:\b、\t、\n、\f、\r、\”、\’、\\,也支持\xxxxx使用unicode指定字符(11)高级空白字符移除Freemarker坚持移除各行只包含不输出Freemarker标记的空白字符对于明显要整修掉不需要的空白字符的指令来说,空白字符是个大问题(12)集成其它技术可以在模板中使用jsp标记库可以直接在python工程中使用(13)强大的xml转换能力在2.3版本中,Freemarker 具有强大的新xml转换能力,使得替代xslt成为可能Velocity在这方面是无法真正竞争(freemark模板语言)的,除非改进核心引擎,如支持宏库映射到名字空间,宏中支持局部变量(14)高级模板元程序可以捕获输出的任何部分到context变量中可以解释任何context变量,如果它是一个模板定义上述两者的结合使用篇三:Freemarker模板开发指南Freemarker概述Freemarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯java编写Freemarker被设计用来生成htmlweb页面,特别是基于mVc模式的应用程序虽然Freemarker具有一些编程的能力,但通常由java程序准备要显示的数据,由Freemarker生成页面,通过模板显示准备的数据(如下图)Freemarker不是一个web应用框架,而适合作为web应用框架一个组件Freemarker与容器无关,因为它并不知道http或servlet;Freemarker同样可以应用于非web应用程序环境Freemarker更适合作为model2框架(如struts)的视图组件,你也可以在模板中使用jsp标记库Freemarker是免费的Freemarker特性1、通用目标能够生成各种文本:html、xml、RtF、java源代码等等易于嵌入到你的产品中:轻量级;不需要servlet环境插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等。