一、什么是Freemarker
FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本。模板文件即ftl文件,数据对象是java对象。
模板 + 数据模型 = 输出
二、Freemarker的数据模型
1、顶层数据模型
数据模型是树状结构的,顶层默认为root节点
(root)
|+- animals
| |+- mouse
| | |+- size = "small"
| | |+- price = 50
| |+- elephant
2、Hashes类型
这种类型可以通过名字来查找。顶层节点就是这种类型。例如可以通过animals.mouse来访问mouse。
3、sequences 类型
它们像哈希表那样存储子变量,但是子变量没有名字,它们只是列表中的项。
(root)
| +- animals
| |+- (1st)
| | |+- name = "mouse"
| | |+- size = "small"
| | |+- price = 50
| |+- (2nd)
要访问序列的子变量,可以使用方括号形式的数字索引下标。 索引下标从0开始
4、scalars 类型
包括:
- 字符串:就是文本,也就是任意的字符序列。
-
数字:这是数值类型,就像上面的
price
。 在FreeMarker中,字符串"50"
和数字50
是两种完全不同的东西。前者是两个字符的序列 (这恰好是人们可以读的一个数字),而后者则是可以在数学运算中直接被使用的数值。 -
日期/时间: 可以是日期-时间格式(存储某一天的日期和时间), 或者是日期(只有日期,没有时间),或者是时间(只有时间,没有日期)。
-
布尔值:对应着对/错(是/否,开/关等值)类似的值。 比如动物可以有一个
protected
(受保护的,译者注) 的子变量, 该变量存储这个动物是否被保护起来的值。
三、Freemarker的模板
-
${...}
: FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为 interpolation(插值,译者注)。 -
FTL 标签 (FreeMarker模板的语言标签): FTL标签和HTML标签有一些相似之处,但是它们是FreeMarker的指令,是不会在输出中打印的。 这些标签的名字以
#
开头。(用户自定义的FTL标签则需要使用@
来代替#
。) -
注释: 注释和HTML的注释也很相似, 但是它们使用
<#--
and-->
来标识。 不像HTML注释那样,FTL注释不会出现在输出中(不出现在访问者的页面中), 因为 FreeMarker会跳过它们。 - 其他任何不是FTL标签,插值或注释的内容将被视为静态文本, 这些东西不会被FreeMarker所解析;会被按照原样输出出来。
if 指令
<#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today. <#elseif animals.elephant.price < animals.python.price> Elephants are cheaper than pythons today. <#else> Elephants and pythons cost the same today. </#if>
通常来讲,如果 condition
是false(布尔值),那么介于 <#if condition>
和 </#if>
标签中的内容会被略过。
list 指令
<p>Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, </#list>
使用分隔符 <#sep>
include 指令
使用 include
指令, 我们可以在模板中插入其他文件的内容。
事实上,指令有两种类型: 预定义指令 和 用户自定义指令。 对于用户自定义的指令使用 @
来代替 #
,比如,<@mydirectiveparameters>...</@mydirective>
。 更深的区别在于如果指令没有嵌套内容,那么必须这么使用 <@mydirective parameters />自定义指令也可以通过代码自定义
自定义指令示例:
<#macro printAnimal animal>
<animal name="${animal.name}" size="${animal.size}">
<#nested>
</#macro>
<#list animals.getMap()?values as animal>
<@printAnimal animal>
<!-- xml注释内容 -->
</@printAnimal>
</#list>
四、Freemarker的内建函数
内建函数很像子变量(如果了解Java术语的话,也可以说像方法), 它们并不是数据模型中的东西,是 FreeMarker 在数值上添加的。 为了清晰子变量是哪部分,使用 ?
(问号)代替 .
(点)来访问它们。常用内建函数的示例:
-
user?html
给出user
的HTML转义版本, 比如&
会由&
来代替。 -
user?upper_case
给出user
值的大写版本 (比如 "JOHN DOE" 来替代 "John Doe") -
animal.name?cap_first
给出animal.name
的首字母大写版本(比如 "Mouse" 来替代 "mouse") -
user?length
给出user
值中 字符的数量(对于 "John Doe" 来说就是8) -
animals?size
给出animals
序列中 项目 的个数(我们示例数据模型中是3个) -
如果在
<#list animals as animal>
和对应的</#list>
标签中:-
animal?index
给出了在animals
中基于0开始的animal
的索引值 -
animal?counter
也像index
, 但是给出的是基于1的索引值 -
animal?item_parity
基于当前计数的奇偶性,给出字符串 "odd" 或 "even"。在给不同行着色时非常有用,比如在<td class="${animal?item_parity}Row">
中。
-
一些内建函数需要参数来指定行为,比如:
-
animal.protected?string("Y", "N")
基于animal.protected
的布尔值来返回字符串 "Y" 或 "N"。 -
animal?item_cycle('lightRow','darkRow')
是之前介绍的item_parity
更为常用的变体形式。 -
fruits?join(", ")
通过连接所有项,将列表转换为字符串, 在每个项之间插入参数分隔符(比如 "orange,banana") -
user?starts_with("J")
根据user
的首字母是否是 "J" 返回布尔值true或false。
内建函数应用可以链式操作,比如user?upper_case?html
会先转换用户名到大写形式,之后再进行HTML转义。(这就像可以链式使用 .
(点)一样)
处理不存在的变量
<h1>Welcome ${user!"visitor"}!</h1> 当user为空时,使用默认只visitor
<#if user??><h1>Welcome ${user}!</h1></#if> ??表示条件判断,相当于if(null!=user)
相关推荐
Freemarker是一个强大的模板引擎,常用于Java web开发中生成动态HTML或其他文本格式的输出。它的核心设计理念是将数据模型与展示逻辑分离,使得开发者可以专注于业务数据的处理,而设计师则可以专心于页面布局和样式...
它通过集成到IDE中,使得开发者能够更高效地进行Freemarker模板的编写和调试,从而提高整体的开发效率。在Java Web开发中,熟练掌握Freemarker和这类辅助工具,对于提升项目质量和开发速度都有显著帮助。
Apache FreeMarker是一个强大的、开源的模板引擎,常用于生成HTML和其他动态内容,尤其在Web应用程序中,如...通过熟练掌握FreeMarker,开发者可以更高效地构建和维护Web应用程序的前端部分,提高开发效率和用户体验。
综上所述,这个"FreeMarkerDemo-java.rar"项目是一个实用的学习资源,它教你如何在Spring Boot环境中利用FreeMarker来处理Word文档,这对于那些需要生成动态报告或文档的系统来说非常有价值。通过研究这个示例,...
Freemarker是一个强大的模板引擎,常用于Java Web开发中,特别是在Struts框架中有着广泛的应用。Struts是一款经典的MVC(Model-View-Controller)框架,它帮助开发者将业务逻辑、数据模型和用户界面分离,使得代码...
Freemarker是一个强大的模板引擎,常用于Web开发中生成动态HTML或其他类型的文本。它是Java语言的一个开源项目,允许开发者将业务逻辑与展示层分离,从而提高代码的可维护性和灵活性。2.3.8版本是Freemarker的一个...
Freemarker-IDE是一款专为开发人员设计的Eclipse插件,它主要针对Freemarker模板语言提供了强大的支持。在Eclipse这样的集成开发环境中,这款插件能够显著提升开发人员编写和调试`.ftl`(FreeMarker Template ...
Freemarker是一个强大的Java模板引擎,它允许程序员将业务逻辑与呈现逻辑分离,使得开发者可以专注于数据处理,而模板设计者则负责布局和展示。在Java Web开发中,Freemarker常用于生成静态HTML页面,例如在MVC框架...
Freemarker是一个强大的...综上所述,Freemarker是一个功能丰富的模板引擎,适用于Java Web开发,通过与数据模型的结合,可以生成动态内容。提供的中文手册和jar包,使得中文开发者能够更便捷地学习和使用这一工具。
Freemarker是一个强大的模板引擎,常用于Web应用中的视图层开发,特别是在Java环境中,它作为MVC设计模式的一部分,负责生成动态HTML或其他格式的文本。本教程将深入讲解Freemarker的核心概念、语法和实际应用,帮助...
Freemarker是一个强大的模板引擎,常用于Web应用中的视图层开发,比如JavaEE的MVC框架Struts、Spring MVC等。它允许开发者使用简单的文本模板语言(Template Language,简称TL)来生成输出,如HTML、XML或其他文本...
本压缩包集合了丰富的Freemarker学习资源,涵盖从基础到进阶的各种知识点,以下是这些文档中可能包含的详细内容: 1. **Freemarker中文手册.pdf**: 这份手册通常会详细介绍Freemarker的基本概念,如模板语言、...
在实际开发中,你可以通过Maven或Gradle等构建工具将FreeMarker添加为项目依赖,并根据需求创建和配置模板,然后使用FreeMarker API来渲染模板并生成最终的输出。 总之,Apache FreeMarker是一个强大且灵活的模板...
在IT行业中,`Freemarker`是一个强大的模板引擎,常用于动态生成HTML、XML等文本。这个`freemarker-excel....同时,记得不断探索`Freemarker`和Apache POI的文档,了解更多高级特性,以便在未来的开发中更加得心应手。
Freemarker是一个强大的模板引擎,常用于Web开发中生成动态HTML页面。它是Java语言的一个开源项目,遵循Apache软件基金会的Apache License。这个“freemarker中文学习资料”压缩包提供了详尽的网页版API文档,对于想...
提供的"FreeMarker相关学习文档"可能包括模板语法详解、最佳实践、示例代码等内容,可以帮助初学者快速上手。通过阅读这些资料,你可以深入了解FreeMarker的各个方面,从而更好地利用这个强大的模板引擎。 总结,...
`freemarker-2.3.10.chm`文件就是Freemarker 2.3.10的帮助文档以CHM格式编译后的版本,方便开发者查阅和学习。 在Freemarker的2.3.10版本中,你可以期待以下关键知识点: 1. **模板语言**:Freemarker的模板语言是...
这个“freemarker-2.3.14”源码包包含了Freemarker 2.3.14版本的全部源代码,对于想要深入理解其工作原理、进行二次开发或者解决特定问题的开发者来说非常有价值。 Freemarker的核心概念是模板(Template)和数据...
- `examples`: 示例代码或模板,供学习和参考。 - `lib`: 可能包含Freemarker依赖的其他库文件。 - `src`: 源代码,对于开发者来说,可以查看和理解内部实现。 - `LICENSE`和`NOTICE`: 许可证和版权信息,说明了使用...
Freemarker是一个强大的模板引擎,常用于Web应用开发中生成动态HTML、XML或其他文本格式的输出。这个"freemarker-2.3.10.tar.gz"文件是Freemarker的2.3.10版本的归档包,采用的是tar.gz格式,这是一种常见的Linux/...