FreeMarker(使用方法)

合集下载

freemarker forma用法

freemarker forma用法

freemarker forma用法FreeMarker是一种模板引擎,广泛用于在Java应用程序中生成动态内容。

它使用基于模板的方法将数据模型与模板文件(通常是HTML)分离,以便生成最终的输出。

下面是一些FreeMarker的常见用法示例:1. 展示静态内容:可以使用FreeMarker来显示纯静态的文本或HTML内容。

可以在模板文件中直接编写静态内容,然后通过FreeMarker来渲染模板并生成最终的输出。

2. 动态填充数据:使用FreeMarker可以将动态数据集成到模板中。

您可以在模板文件中使用FreeMarker的表达式语法来引用数据模型中的变量,并将其插入到模板中生成最终的输出。

3. 条件语句:可以使用FreeMarker的条件语句来根据某些条件选择性地显示内容。

您可以使用if语句和else语句来根据特定的条件进行条件判断,并根据结果生成不同的输出。

4. 迭代:使用FreeMarker的迭代语句可以遍历一个集合,并在模板中重复显示特定的内容。

这对于生成动态列表或表格非常有用。

5. 宏:FreeMarker允许您定义自定义的宏,以便在多个模板中重复使用相似的代码片段。

可以将宏视为一种可重用的模板块。

6. 导入其他模板:FreeMarker允许您在一个模板中导入其他模板,并在模板中使用导入的内容。

这使得模板之间的重用和组织变得更加容易。

7. 自定义函数:如果您需要一些特殊的功能在模板中执行,您可以编写自定义函数,并在模板中调用它们。

上述只是FreeMarker的一些常见用法示例,实际上,FreeMarker提供了更多的功能和灵活性,使您能够实现更复杂的模板逻辑和动态内容生成。

freemarker的用法

freemarker的用法

freemarker的用法Freemarker是一种用于生成文本输出(例如HTML网页)的模板引擎。

它通常用于在Web应用程序中生成动态内容,比如将数据填充到HTML模板中。

以下是关于Freemarker的用法的一些方面:1. 模板语法,Freemarker使用类似于HTML的标签和指令来标记要填充数据的位置。

例如,使用`${variable}`语法来插入变量的值,使用`<#if>`和`<#else>`来进行条件判断,使用`<#list>`来遍历列表等等。

2. 数据模型,在使用Freemarker时,需要将数据以某种形式传递给模板引擎。

通常,这些数据以Map的形式传递,也可以是JavaBean或POJO对象。

3. 集成,Freemarker可以与多种Java框架(如Spring、Struts等)集成,以便在Web应用程序中使用。

通常,需要配置模板解析器和视图解析器来使得框架能够识别和处理Freemarker模板。

4. 自定义指令和函数,Freemarker允许用户定义自己的指令和函数,以便扩展模板的功能。

这些自定义指令和函数可以在模板中被调用,从而实现特定的逻辑或功能。

5. 资源加载,Freemarker可以从不同的位置加载模板文件,比如从文件系统、类路径、URL等。

这使得模板可以被灵活地组织和管理。

总的来说,Freemarker是一个功能强大且灵活的模板引擎,它提供了丰富的模板语法和功能,可以帮助开发人员在Web应用程序中实现灵活的动态内容生成。

希望这些信息能够帮助你更好地了解Freemarker的用法。

freemarker的使用

freemarker的使用

freemarker的使⽤⼀:freemarker是什么?freemarker是⼀个模板引擎,基于定义的模板和数据⽣成对应的⽂本(HTML,xml,java等),是⼀个⽣成⽂本的⼯具。

⼆:freemarker的使⽤⽅法(1)在⼯程中引⼊freemarker相关的依赖<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency>View Code(2)使⽤的步骤第⼀步:创建⼀个Configuration对象,直接new⼀个即可,构造参数是freemarker的版本号第⼆步:设置模板⽂件所在的路径,需要给出在磁盘上储存的全路径第三步:设置⽣成的⽂件的编码格式,⼀般为utf-8格式第四步:加载模板,创建模板对象第五步:创建模板使⽤的数据集,可以使pojo也可以是map类型的第六步:创建Write流对象,将⽂件⽂件输出,需要指定⽣成的⽂件的名称第七步:调⽤模板的process⽅法,⽣成相应的⽂本第⼋步:关闭流@Testpublic void genFile() throws Exception {// 第⼀步:创建⼀个Configuration对象,直接new⼀个对象。

构造⽅法的参数就是freemarker对于的版本号。

Configuration configuration = new Configuration(Configuration.getVersion());// 第⼆步:设置模板⽂件所在的路径。

configuration.setDirectoryForTemplateLoading(new File("D:/workspace/item-web/src/main/webapp/WEB-INF/ftl"));// 第三步:设置模板⽂件使⽤的字符集。

freemarker原理和用法

freemarker原理和用法

freemarker原理和用法Freemarker是一个模板引擎,它提供了一种用于生成动态Web页面的方式。

该引擎将模板与数据组合在一起创建HTML、XML或其他格式的输出文档。

该引擎依赖于模板中的变量,这些变量用于在合适的位置动态地生成内容。

在本文中,我们将详细讨论Freemarker的原理和用法。

一、Freemarker原理Freemarker模板引擎的原理是基于模板和数据的组合。

模板包含动态生成内容的标记和指令,而数据则存储在模板中需要显示的元素,将数据与模板组合在一起生成所需的输出文档。

1. 模板Freemarker模板是一个包含文本和标记的文件。

标记指令以$开头,被双大括号{{}}包含起来,并用于表示应该在输出文档中生成动态内容的位置。

例如,$ {}表示在输出文档中应该显示用户的名称。

2. 数据数据是用于填充模板中指令的值。

这些值可以存储在Java对象、数据库、XML文档或其他数据源中。

在合适的位置,将数据与指令组合在一起,生成所需的输出文档。

二、Freemarker用法使用Freemarker模板引擎的过程通常包含以下步骤:1. 编写模板编写一个包含Freemarker指令和标记的模板文件。

该文件必须包含正确的元数据和指令,以告诉模板引擎什么时候生成所需的动态数据。

2. 创建数据模型数据模型是用于指定需要在模板中使用的变量值和其它数据的对象。

在Java中,可以使用Map、POJO和其他对象来创建数据模型。

在数据模型中指定的变量将可供模板使用来动态生成输出文档。

3. 管理模板使用模板管理器类,可以将模板文件加载到内存中,并将其准备好在特定时刻生成所需的输出文档。

4. 处理模板使用模板引擎将模板和数据模型组合起来,生成所需的输出文档。

在处理模板时,模板引擎通常会将指令和标记替换为与其关联的数据值。

5. 输出文档生成HTML、XML或其他格式的输出文档,然后将其返回给客户端或输出到磁盘或其他位置。

freemarker使用流程

freemarker使用流程

freemarker使用流程Freemarker使用流程Freemarker是一款流行的模板引擎,广泛应用于Java Web开发中。

它能够有效地将数据与展示分离,提高开发效率和代码的可维护性。

下面将介绍Freemarker的使用流程,帮助读者更好地理解和运用这一工具。

1. 熟悉Freemarker语法在使用Freemarker之前,首先需要熟悉其语法规则。

Freemarker 使用类似于HTML的标签和表达式来动态生成内容。

了解Freemarker的基本语法结构对于后续的开发至关重要。

2. 配置Freemarker环境在项目中引入Freemarker依赖,并配置Freemarker的相关参数,如模板文件的路径、编码方式等。

确保Freemarker能够正常工作,并与项目的其他组件协调配合。

3. 创建Freemarker模板编写Freemarker模板文件,定义页面的结构和内容。

在模板中可以使用Freemarker的标签和表达式来引用数据、控制流程和展示内容。

合理设计模板结构,提高页面的可读性和可维护性。

4. 准备数据模型准备与模板对应的数据模型,包括需要在页面中展示的数据内容。

数据模型可以是JavaBean、Map等形式,确保数据的准确性和完整性,以便在模板中进行引用和展示。

5. 渲染模板将数据模型与Freemarker模板进行结合,通过Freemarker引擎进行渲染。

在渲染过程中,Freemarker会根据模板中的标签和表达式动态生成最终的页面内容,将数据填充到指定位置。

6. 输出页面内容将渲染后的页面内容输出到浏览器或其他客户端,让用户可以看到最终的页面效果。

确保页面的呈现与预期一致,检查数据的展示是否准确,页面的布局是否符合设计要求。

7. 调试和优化在使用Freemarker的过程中,可能会遇到一些问题和性能瓶颈。

及时调试代码,查找并解决bug,优化页面性能和加载速度。

保持代码的简洁和高效,提升用户体验和开发效率。

ftl编辑器(freemarker)的使用和说明

ftl编辑器(freemarker)的使用和说明

一、准备工作1.1 下载文件可以从ht‎t p://freem‎a rker‎.sourc‎e forg‎/站点下载最‎新的(最新版本是‎0.9.14)。

fre‎e mark‎e r.jar包(目前最新版‎本是2.3.18)与ecli‎p se插件‎1.2 安装ecl‎i pse插‎件将下载来的‎e clip‎s e插件解‎压缩到本地‎磁盘,更改hud‎s on.freem‎a rker‎_ide_‎0.9.14文件夹‎中的fre‎e mark‎e r-2.3.6.jar文件‎更改成最新‎版本的fr‎e emar‎k er-2.3.18.jar,并且将ME‎T A-INF/MANIF‎E ST.MF文件中‎的Bund‎l e-Class‎P ath属‎性值修改为‎f reem‎a rker‎-2.3.18.jar。

最后将hu‎d son.freem‎a rker‎_ide_‎0.9.14放到e‎c lips‎e的plu‎g ins目‎录中,完成ecl‎i pse 插‎件的安装。

1.3 freem‎a rker‎文档下载从http‎://freem‎a rker‎.sourc‎e forg‎/官方网站中‎下载帮助文‎档(也有中文的‎手册)二、freem‎a rker‎的使用2.1 简介2.1.1 FTL tag标签‎由于fre‎e mark‎e r tag标签‎是属于fr‎e emar‎k er的指‎令,它们仅仅是‎f reem‎a rker‎处理过程中‎的信息,而不会输出‎到页面上,所以它们与‎h tml标‎签有一些区‎别。

这些标签都‎是以#号开头,如<#impor‎t"/publi‎c/work_‎p ubli‎c.ftl" as publi‎c>。

但用户自定‎义的标签是‎以@符号开头,如在fre‎e mark‎e r中使用‎s trut‎s标签:<@s.if test="resul‎t s!=null&&resul‎t s.size()!=0">注意FTL‎标签不可以‎在其他FT‎L标签和插‎值中使用(注释可以在‎F TL标签‎和插值中使‎用,因为它在解‎析时,整个注释都‎将抛弃,不会影响具‎体代码),如下面这样‎就是一个错‎误的写法:<#if <#inclu‎d e 'foo'>='bar'>...</#if>2.1.2 注释freem‎a rker‎的文档注释‎与html‎相似,但它是以<#--和-->来分割的。

freemarker用法

freemarker用法

freemarker用法FreeMarker是一种模板引擎,在Java技术栈中被广泛使用。

它可用于生成动态的web页面,如HTML文件、XML文件、电子邮件呈现等等。

接下来,我们将介绍FreeMarker的用法。

首先,我们需要在Java项目中添加FreeMarker库的依赖项,以便在代码中使用FreeMarker。

然后,需要创建FreeMarker的配置对象,以便配置FreeMarker的一些参数,如模板文件存放位置、编码等。

在创建配置对象后,我们需要创建一个模板文件,并将其存储在指定的目录中。

模板文件是一个普通的文本文件,其中包含静态文本和FreeMarker标记。

在模板文件中,静态文本会直接呈现在生成的页面中,而FreeMarker标记将会被解释和转换成动态的内容。

FreeMarker标记的格式为${expression},其中expression是一个表达式,可以是一个变量、一个函数、一个条件语句等等。

例如,${name}表示输出变量name的值,而${if condition}...${/if}表示条件判断,如果condition成立,则输出其中的内容。

除了上述标记,FreeMarker还提供了很多其他的标记,如循环、宏、包含、导入等等。

使用FreeMarker,我们可以轻松地将Java对象与模板文件结合起来,生成动态的页面。

我们首先需要创建一个数据模型,即一个Java对象,其中包含了我们想要在页面中呈现的数据。

接着,我们需要将数据模型传递给一个模板文件,并执行解析和渲染过程,将数据和模板结合起来生成HTML代码。

最后,将HTML代码输出到客户端。

总结来说,FreeMarker是一种强大的模板引擎,它可以帮助我们生成动态页面和电子邮件。

FreeMarker标记和Java代码的结合,可以使我们更有效地处理和呈现动态内容,从而使我们的网站更加生动和富有可读性。

freemarker 变量表达式

freemarker 变量表达式

Freemarker是一种模板引擎,广泛应用于JavaWeb开发中,它能够将数据动态填充到模板中,生成最终的页面。

在Freemarker中,变量表达式是一种重要的语法,用于表示需要动态填充的数据,下面将详细介绍Freemarker变量表达式的使用方法和注意事项。

一、Freemarker变量表达式的基本语法在Freemarker中,变量表达式使用`${}`来表示,其中`${}`内部可以是一个简单的变量名,也可以是一个复杂的表达式。

例如:```${}${user['age']}${user.age > 18 ? '成年人' : '未成年人'}```在`${}`内部,可以使用`.`来访问对象的属性,也可以使用`[]`来访问Map的值,此外还可以使用三元运算符来进行条件判断。

二、Freemarker变量表达式的使用场景1.在模板中动态显示数据在前后端分离的开发模式中,前端经常需要通过Ajax请求后台接口获取数据,然后使用Freemarker填充到页面中。

这时就可以使用变量表达式来动态显示数据,比如将后台返回的用户信息`${user}`填充到页面中。

2.在条件判断和循环中使用在模板中经常需要根据不同的条件显示不同的内容,或者对一组数据进行循环处理,这时就可以使用变量表达式来进行条件判断和循环操作。

三、Freemarker变量表达式的注意事项1.空指针判断由于在模板中动态填充的数据并不一定存在,所以在使用变量表达式时需要进行空指针判断,避免出现空指针异常。

2.复杂表达式的优化虽然变量表达式支持复杂的表达式操作,但在实际使用中应尽量将复杂的逻辑放到后台去处理,尽量保持模板的简洁和清晰。

3.变量命名规范在使用变量表达式时,要注意变量命名规范,尽量使用有意义的变量名,以便于代码的维护和阅读。

四、总结Freemarker变量表达式是一种非常灵活和强大的语法,能够帮助我们在模板中动态填充数据,进行条件判断和循环操作。

freemarker菜鸟教程

freemarker菜鸟教程

freemarker菜鸟教程Freemarker菜鸟教程1. 介绍Freemarker是一种模板引擎,用于将数据模型与文本模板合并生成输出内容。

它提供了多种功能,使开发人员能够轻松地生成动态网页、邮件、XML文件等。

2. Freemarker的优点- 简洁易学:Freemarker使用简单的语法和模板指令,易于学习和使用。

即使是没有编程经验的初学者也可以快速上手。

- 强大灵活:Freemarker提供了丰富的模板指令和表达式,可以满足各种动态内容生成的需求。

- 高性能:Freemarker运行速度快,生成的输出内容效率高,非常适合用于大规模的数据处理和生成。

3. Freemarker基本语法- 插值:使用${}来插入变量或表达式的值。

```html<p>欢迎来到Freemarker教程,${username}!</p>```- 条件判断:使用if-else指令进行条件判断。

```html<#if age < 18><p>您是未成年人。

</p><#else><p>您已成年。

</p></#if>```- 循环:使用list指令实现列表的循环遍历。

```html<ul><#list users as user><li>${}</li></#list></ul>```- 宏定义:使用#macro指令定义宏,可以实现代码的重复使用。

```html<#macro hello /><h1>Hello, ${name}!</h1></#macro>```4. Freemarker内置指令- include指令:用于引入其他模板文件。

```html<#include \。

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");```接下来,我们需要将我们的数据传递给数据模型。

freemarker使用流程

freemarker使用流程

freemarker使用流程Freemarker是一种模板引擎,它可以将数据和模板结合起来生成最终的输出。

它可以用于Java、.NET、PHP等多种编程语言中,本文将以Java为例介绍Freemarker的使用流程。

1. 下载Freemarker首先需要下载Freemarker的jar包,可以在官网上下载最新版本。

下载完成后将jar包添加到项目的classpath中。

2. 创建模板文件Freemarker使用.ftl作为模板文件的扩展名,创建一个.ftl文件并编写模板代码。

例如:```<html><head><title>${title}</title></head><body><h1>${heading}</h1><ul><#list items as item><li>${item}</li></#list></ul></body></html>```在这个例子中,`${}`是Freemarker的语法,表示要替换成实际的值。

`${title}`、`${heading}`和`${item}`都是变量名,在生成输出时会被替换成相应的值。

3. 创建数据模型数据模型是一个Java对象或Map,它包含了模板所需要的数据。

例如:```Map<String, Object> data = new HashMap<>();data.put("title", "My Website");data.put("heading", "Welcome to my website!");List<String> items = new ArrayList<>();items.add("Item 1");items.add("Item 2");items.add("Item 3");data.put("items", items);```在这个例子中,我们创建了一个Map对象,包含了模板需要的三个变量:`title`、`heading`和`items`。

freemarker forma用法

freemarker forma用法

freemarker forma用法摘要:一、Freemarker 简介1.Freemarker 是什么2.为什么使用Freemarker二、Forma 用法详解1.Forma 的基本概念2.使用Forma 的步骤3.Forma 的模板语法4.常用Forma 指令5.实战案例:使用Forma 生成邮件通知三、Forma 的高级应用1.动态数据绑定2.条件渲染3.列表渲染4.表单验证四、Forma 的最佳实践1.规范的模板语法2.合理的布局设计3.高度封装的组件4.灵活的配置选项五、总结正文:一、Freemarker 简介Freemarker 是一款非常强大的模板引擎,它被广泛应用于Java Web 项目中,用于生成HTML、XML、CSV 等格式的文档。

与JSP、Thymeleaf 等模板引擎相比,Freemarker 具有语法简洁、功能丰富、易学易用等优点,因此受到了广大开发者的喜爱。

二、Forma 用法详解1.Forma 的基本概念Forma 是Freemarker 的一个扩展库,它提供了一系列方便的API 和模板指令,用于生成表单、表格等HTML 元素。

通过使用Forma,开发者可以更加高效地编写模板,减少重复代码,提高开发效率。

2.使用Forma 的步骤要使用Forma,首先需要在项目中引入Freemarker 和Forma 的依赖。

然后,在模板文件中声明使用Forma,并调用Forma 提供的API 或使用Forma 指令。

最后,将模板编译成HTML 文档并返回给客户端。

3.Forma 的模板语法Forma 的模板语法非常简洁,主要包括两种:一种是以花括号{}包围的代码块,用于表示HTML 元素;另一种是以管道符| 为分隔符的指令,用于调用Forma 提供的API。

4.常用Forma 指令Forma 提供了许多实用的指令,如:- ${form(formName)}:生成一个表单元素- ${table(tableName)}:生成一个表格元素- ${input(type, name, value)}:生成一个输入框元素- ${select(name, options)}:生成一个下拉选择框元素- ${checkbox(name, value)}:生成一个复选框元素- ${radio(name, value)}:生成一个单选框元素5.实战案例:使用Forma 生成邮件通知假设我们需要生成一封邮件通知,包含以下内容:```尊敬的用户,您好!感谢您注册我们的服务。

freemarker的template用法

freemarker的template用法

freemarker的template用法Freemarker是一个模板引擎,主要用于生成动态内容,如HTML网页、电子邮件、配置文件等。

下面是Freemarker的一些常用模板用法:1. 变量插值:使用`${变量名}`插入变量的值。

例如:```<h1>${title}</h1>```2. 条件判断:使用`<#if>...</#if>`结构来执行条件判断。

例如:```<#if condition>...<#else>...</#if>```3. 循环迭代:使用`<#list>...</#list>`结构来进行循环迭代。

例如:```<#list items as item><li>${item}</li></#list>```4. 定义宏:使用`<#macro>...</#macro>`定义一个宏。

例如:```<#macro greet name>Hello ${name}!</#macro>```5. 调用宏:使用`<@宏名>...</@宏名>`调用一个宏。

例如:```<@greet "John" />```6. 引入外部模板:使用`<#include "模板路径">`引入外部模板。

例如:```<#include "header.ftl">```以上是Freemarker的一些常用模板用法,可以根据实际需求灵活运用。

freemarker 用法

freemarker 用法

freemarker 用法Freemarker 是一种模板引擎,广泛用于JavaWeb 开发中。

它提供了一种将数据模型与视图层分离的方式。

在使用Freemarker 进行开发时,我们首先需要了解一些基本的用法和语法规则。

本文将一步一步回答关于Freemarker 的常见问题,并介绍它的基本用法与功能。

一、什么是Freemarker?Freemarker 是一个模板引擎,它能够根据模板以及给定的数据模型生成最终的文本输出。

它使用简单明了的标记语言,允许开发者通过填充数据模型来动态生成页面内容。

二、如何引入Freemarker?要使用Freemarker,我们首先需要引入它的依赖。

通常情况下,我们可以在Maven 项目的pom.xml 文件中添加以下依赖:xml<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.27-incubating</version></dependency>三、如何配置Freemarker?在Spring Boot 项目中,我们可以使用`@Configuration` 注解来配置Freemarker。

通过`FreeMarkerConfigurer` 类,我们可以设置Freemarker 的一些参数,例如模板文件所在的路径、编码方式等。

java@Configurationpublic class FreemarkerConfig {@Beanpublic FreeMarkerConfigurer freeMarkerConfigurer() {FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();configurer.setTemplateLoaderPath("classpath:/templates");configurer.setDefaultEncoding("UTF-8");return configurer;}}在上述代码中,我们设置了模板所在的路径为classpath:/templates,这意味着我们的模板文件将在项目resources 目录下的templates 文件夹中。

freemarker 技巧

freemarker 技巧

freemarker 技巧
FreeMarker是一个基于Java语言的模板引擎,它支持非常丰富的语法,在使用过程中有以下一些技巧:
- 设置模板根目录:通过Configuration对象的setDirectoryForTemplateLoading方法指定模板根目录。

- 创建模板对象:通过Configuration对象的getTemplate方法创建模板对象。

- 整合模板内容:通过Template对象的process方法整合模板内容并写入输出对象。

- 使用变量:模板变量使用${...}表示,“...”就是Map对象的键名。

如果变量是一个结构,可以通过${xxx.yyy}调用结构属性,其中“xxx”是结构对应的Map对象的键名,“yyy”是结构的属性名称。

在使用FreeMarker时,可以根据实际需求灵活运用这些技巧,以提高工作效率和代码质量。

freemarker语法及应用

freemarker语法及应用

freemarker语法及应用Freemarker是一种基于模板的开源Java模板引擎,用于生成动态内容,如HTML网页,电子邮件等。

它的语法简洁且功能强大,可以灵活地处理各种数据类型和逻辑判断。

以下是Freemarker的一些基本语法及应用:1. 变量插值:使用`${variable}`或`#{variable}`语法进行变量的插值。

例如:`${}`会将`user`对象中的`name`属性的值插入到模板中。

2. 判断语句:使用`<#if condition>`和`</#if>`语句来进行条件判断。

可以使用`<#elseif>`和`<#else>`来添加多个条件分支。

例如:```<#if user.age > 18><p>Welcome, ${}. You are an adult.</p><#else><p>Welcome, ${}. You are a minor.</p></#if>```3. 循环语句:使用`<#list>`语句来进行循环迭代。

例如:```<ul><#list users as user><li>${}</li></#list></ul>```4. 宏定义:使用`<#macro>`语句来定义宏。

宏可以接受参数,并在模板中多次调用。

例如:```<#macro printName name><p>Hello, ${name}!</p></#macro><@printName name="Alice" /><@printName name="Bob" />```5. 引入外部模板:使用`<#include>`语句来引入外部模板文件,并在当前模板中使用。

FreeMarker使用介绍

FreeMarker使用介绍

1、快速入门(1)模板+数据模型=输出 模板+数据模型= FreeMarker 基于设计者和程序员是具有不同专业技能的不同个体的观念 他们是分工劳动的:设计者专注于表示——创建 HTML 文件、图片、Web 页面的其它 可视化方面;程序员创建系统,生成设计页面要显示的数据 经常会遇到的问题是:在 Web 页面(或其它类型的文档)中显示的信息在设计页面 时是无效的,是基于动态数据的 在这里,你可以在 HTML(或其它要输出的文本)中加入一些特定指令,FreeMarker 会在输出页面给最终用户时,用适当的数据替代这些代码 下面是一个例子:<html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome${user}!</h1> <p>Our latest product: <a href="${latestProduct.url}">${}</a>! </body> </html>这个例子是在简单的 HTML 中加入了一些由${…} ${…}包围的特定代码,这些特定代码是 ${…} FreeMarker 的指令,而包含 FreeMarker 的指令的文件就称为模板(Template) 至于 user、latestProduct.url 和 来自于数据模型(data model) 数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、 文件,甚至于在程序中直接生成 模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型 下面是一个可能的数据模型:(root) | +- user = "Big Joe" | +- latestProduct | +- url = "products/greenmouse.html" |+- name = "green mouse"数据模型类似于计算机的文件系统,latestProduct 可以看作是目录,而 user、url 和 name 看作是文件,url 和 name 文件位于 latestProduct 目录中(这只是一个比喻, 实际并不存在) 当 FreeMarker 将上面的数据模型合并到模板中,就创建了下面的输出:<html> <head> <title>Welcome!</title> </head> <body> <h1>WelcomeBig Joe!</h1> <p>Our latest product: <a href="products/greenmouse.html">green mouse</a>! </body> </html>(2)数据模型 典型的数据模型是树型结构,可以任意复杂和深层次,如下面的例子:(root) | +- animals | | | | | | | | | | | | | | | +- elephant | | | +- price = 5000 | +- size = "large" | | | +- mouse | | | +- price = 50 | +- size = "small"| | | | | | || +- python | +- size = "medium" | +- price = 4999+- test = "It is a test" | +- whatnot | +- because = "don't know"类似于目录的变量称为 hashes hashes,包含保存下级变量的唯一的查询名字 类似于文件的变量称为 scalars scalars,保存单值 scalars 保存的值有两种类型:字符串(用引号括起,可以是单引号或双引号)和 数字(不要用引号将数字括起,这会作为字符串处理) 对 scalars 的访问从 root 开始,各部分用“.”分隔,如 animals.mouse.price . 另外一种变量是 sequences sequences,和 hashes 类似,只是不使用变量名字,而使用数字索 引,如下面的例子:(root) | +- animals | | | | | | | | | | | +- (1st) | | | | | | | +- (2nd) | +- name = "mouse" | +- size = "small" | +- price = 50| | | | | | | | | | | | | | || | | | | | || +- name = "elephant" | +- size = "large" | +- price = 5000+- (3rd) | +- name = "python" | +- size = "medium" | +- price = 4999+- whatnot | +- fruits | +- (1st) = "orange" | +- (2nd) = "banana"这种对 scalars 的访问使用索引,如 animals[0].name (3)模板 在 FreeMarker 模板中可以包括下面三种特定部分: ${…}:称为 interpolations,FreeMarker 会在输出时用实际值进行替代 FTL 标记(FreeMarker 模板语言标记) :类似于 HTML 标记,为了与 HTML 标记区 分,用#开始(有些以@开始,在后面叙述) 注释:包含在<#--和-->(而不是<!--和-->)之间 下面是一些使用指令的例子: if 指令<#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today.<#else> Pythons are not cheaper than elephants today. </#if>list 指令<p>We have these animals: <table border=1> <tr><th>Name<th>Price <#list animals as being> <tr><td>${}<td>${being.price} Euros </#list> </table>输出为:<p>We have these animals: <table border=1> <tr><th>Name<th>Price <tr><td>mouse<td>50 Euros <tr><td>elephant<td>5000 Euros <tr><td>python<td>4999 Euros </table>include 指令<html> <head> <title>Test page</title> </head> <body> <h1>Test page</h1> <p>Blah blah... <#include "/copyright_footer.html"> </body> </html>一起使用指令<p>We have these animals: <table border=1> <tr><th>Name<th>Price <#list animals as being> <tr> <td> <#if being.size = "large"><b></#if> ${} <#if being.size = "large"></b></#if> <td>${being.price} Euros </#list> </table>2、数据模型(1)基础 在快速入门中介绍了在模板中使用的三种基本对象类型:scalars、hashes 和 sequences,其实还可以有其它更多的能力: scalars:存储单值 hashes:充当其它对象的容器,每个都关联一个唯一的查询名字 sequences:充当其它对象的容器,按次序访问 方法:通过传递的参数进行计算,以新对象返回结果 用户自定义 FTL 标记:宏和变换器 通常每个变量只具有上述的一种能力,但一个变量可以具有多个上述能力,如下面 的例子:(root) | +- mouse = "Yerri" | +- age = 12 | +- color = "brown">mouse 既是 scalars 又是 hashes,将上面的数据模型合并到下面的模板:${mouse} ${mouse.age} <#-- use mouse as scalar --> <#-- use mouse as hash -->${mouse.color} <#-- use mouse as hash -->输出结果是:Yerri 12 brown(2)Scalar 变量 Scalar 变量存储单值,可以是: 字符串:简单文本,在模板中使用引号(单引号或双引号)括起 数字:在模板中直接使用数字值 日期: 存储日期/时间相关的数据, 可以是日期、 时间或日期-时间 (Timestamp) ; 通常情况,日期值由程序员加到数据模型中,设计者只需要显示它们 布尔值:true 或 false,通常在<#if …>标记中使用 hashes、 (3)hashes、sequences 和集合 有些变量不包含任何可显示的内容,而是作为容器包含其它变量,者有两种类型: hashes:具有一个唯一的查询名字和它包含的每个变量相关联 sequences:使用数字和它包含的每个变量相关联,索引值从0开始 集合变量通常类似 sequences,除非无法访问它的大小和不能使用索引来获得它的 子变量;集合可以看作只能由<#list …>指令使用的受限 sequences (4)方法 方法变量通常是基于给出的参数计算值 下面的例子假设程序员已经将方法变量 avg 放到数据模型中, 用来计算数字平均值:The average of 3 and 5 is: ${avg(3, 5)} The average of 6 and 10 and 20 is: ${avg(6, 10, 20)} The average of the price of python and elephant is: ${avg(animals.python.price, animals.elephant.price)}(5)宏和变换器 宏和变换器变量是用户自定义指令(自定义 FTL 标记) ,会在后面讲述这些高级特性 (6)节点 节点变量表示为树型结构中的一个节点,通常在 XML 处理中使用,会在后面的专门 章节中讲述3 、模 板(1)整体结构 模板使用 FTL(FreeMarker 模板语言)编写,是下面各部分的一个组合: 文本:直接输出 Interpolation:由${和},或#{和}来限定,计算值替代输出 FTL 标记:FreeMarker 指令,和 HTML 标记类似,名字前加#予以区分,不会输 出 注释:由<#--和-->限定,不会输出 下面是以一个具体模板例子:<html>[BR] <head>[BR]<title>Welcome!</title>[BR] </head>[BR] <body>[BR] <#-- Greet the user with his/her name -->[BR] <h1>Welcome ${user}!</h1>[BR] <p>We have these animals:[BR] <ul>[BR] <#list animals as being>[BR] <li>${} for ${being.price} Euros[BR] </#list>[BR] </ul>[BR] </body>[BR] </html>[BR]是用于换行的特殊字符序列 注意事项: FTL 区分大小写, 所以 list 是正确的 FTL 指令, List 不是; 而 ${name}和${NAME} 是不同的 Interpolation 只能在文本中使用 FTL 标记不能位于另一个 FTL 标记内部,例如:<#if<#include 'foo'>='bar'>...</if>注释可以位于 FTL 标记和 Interpolation 内部,如下面的例子:<h1>Welcome ${user<#-- The name of user -->}!</h1>[BR] <p>We have these animals:[BR] <ul>[BR] <#list <#-- some comment... --> animals as <#-- again... --> being>[BR] ...多余的空白字符会在模板输出时移除 (2)指令 在 FreeMarker 中,使用 FTL 标记引用指令 有三种 FTL 标记,这和 HTML 标记是类似的: 开始标记:<#directivename parameters> 结束标记:</#directivename> 空内容指令标记:<#directivename parameters/> 有两种类型的指令:预定义指令和用户定义指令 用户定义指令要使用@替换#,如<@mydirective>...</@mydirective>(会在后面讲述) FTL 标记不能够交叉,而应该正确的嵌套,如下面的代码是错误的:<ul> <#list animals as being> <li>${} for ${being.price} Euros <#if use = "Big Joe"> (except for you) </#list> </#if> <#-- WRONG! --> </ul>如果使用不存在的指令,FreeMarker 不会使用模板输出,而是产生一个错误消息 FreeMarker 会忽略 FTL 标记中的空白字符,如下面的例子:<#list[BR] animals being[BR] >[BR] ${} for ${being.price} Euros[BR] </#list > as[BR]但是,<、</和指令之间不允许有空白字符 (3)表达式 直接指定值 字符串 使用单引号或双引号限定 如果包含特殊字符需要转义,如下面的例子:${"It's/"quoted/" and this is a backslash://"}${'It/'s "quoted" and this is a backslash://'}输出结果是:It's"quoted" and this is a backslash:/It's "quoted" and this is a backslash:/下面是支持的转义序列: 转义序列 /" /' // /n /r /t /b /f /l /g /a /{ /xCode 含义 双引号(u0022) 单引号(u0027) 反斜杠(u005C) 换行(u000A) Return (u000D) Tab (u0009) Backspace (u0008) Form feed (u000C) < > & { 4位16进制 Unicode 代码有一类特殊的字符串称为 raw 字符串,被认为是纯文本,其中的/和{等不 具有特殊含义,该类字符串在引号前面加 r,下面是一个例子:${r"${foo}"} ${r"C:/foo/bar"}输出的结果是:${foo} C:/foo/bar数字 直接输入,不需要引号 精度数字使用“.”分隔,不能使用分组符号 . 目前版本不支持科学计数法,所以“1E3”是错误的 不能省略小数点前面的0,所以“.5”是错误的 数字8、+8、08和8.00都是相同的 布尔值 true 和 false,不使用引号 序列 由逗号分隔的子变量列表,由方括号限定,下面是一个例子:<#list["winter", "spring", "summer", "autumn"] as x>${x} </#list>输出的结果是:winter spring summer autumn列表的项目是表达式,所以可以有下面的例子:[2 + 2, [1, 2, 3, 4], "whatnot"]可以使用数字范围定义数字序列,例如2..5等同于[2, 3, 4, 5],但是更 有效率,注意数字范围没有方括号 可以定义反递增的数字范围,如5..2 散列(hash) 由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔,下面是 一个例子:{"name":"green mouse", "price":150}键和值都是表达式,但是键必须是字符串 获取变量 顶层变量:${variable},变量名只能是字母、数字、下划线、$、@和#的组合, 且不能以数字开头 从散列中获取数据 可以使用点语法或方括号语法,假设有下面的数据模型:(root) | +- book | | | | | | | | | | +- title = "Breeding green mouses" | +- author | +- name = "Julia Smith" | +- info = "Biologist, 1923-1985, Canada"+- test = "title"下面都是等价的: book["author"].name book.author.["name"] book["author"]["name"]使用点语法,变量名字有顶层变量一样的限制,但方括号语法没有该限制, 因为名字是任意表达式的结果 从序列获得数据:和散列的方括号语法语法一样,只是方括号中的表达式值必 须是数字;注意:第一个项目的索引是0 0 序列片断:使用[startIndex..endIndex] [startIndex..endIndex]语法,从序列中获得序列片断(也是 [startIndex..endIndex] 序列) ;startIndex 和 endIndex 是结果为数字的表达式 特殊变量:FreeMarker 内定义变量,使用.variablename 语法访问 .variablename 字符串操作 Interpolation(或连接操作) 可以使用${..} ${..}(或#{..} #{..})在文本部分插入表达式的值,例如: ${..} #{..}${"Hello ${user}!"} ${"${user}${user}${user}${user}"}可以使用+操作符获得同样的结果 +${"Hello " + user + "!"} ${user + user + user + user}${..}只能用于文本部分,下面的代码是错误的: ${..}<#if ${isBig}>Wow!</#if> <#if "${isBig}">Wow!</#if>应该写成:<#if isBig>Wow!</#if>子串 例子(假设 user 的值为“Big Joe”) :${user[0]}${user[4]} ${user[1..4]}结果是(注意第一个字符的索引是0) :BJ ig J序列操作 连接操作:和字符串一样,使用+,下面是一个例子: +<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>- ${user} </#list>输出结果是:- Joe - Fred - Julia - Kate散列操作 连接操作:和字符串一样,使用+,如果具有相同的 key,右边的值替代左边的 + 值,例如:<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}> - Joe is ${ages.Joe} - Fred is ${ages.Fred} - Julia is ${ages.Julia}输出结果是:- Joe is30 - Fred is 25 - Julia is 18算术运算 +、-、×、/、%,下面是一个例子:${x * x - 100} ${x / 2} ${12 % 10}输出结果是(假设 x 为5) :-75 2.5 2操作符两边必须是数字,因此下面的代码是错误的:${3 * "5"} <#-- WRONG! -->使用+操作符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符 串,例如:${3 + "5"}输出结果是:35使用内建的 int(后面讲述)获得整数部分,例如:${(x/2)?int} ${1.1?int} ${1.999?int} ${-1.1?int} ${-1.999?int}输出结果是(假设 x 为5) :2 1 1 -1 -1比较操作符 使用=(或==,完全相等)测试两个值是否相等,使用!= 测试两个值是否不相 等 =和!=两边必须是相同类型的值,否则会产生错误,例如<#if 1 = "1">会引起 错误 Freemarker 是精确比较,所以对"x"、"x "和"X"是不相等的 对数字和日期可以使用<、<=、>和>=,但不能用于字符串 由于 Freemarker 会将>解释成 FTL 标记的结束字符, 所以对于>和>=可以使用括 号来避免这种情况,例如<#if (x > y)> 另一种替代的方法是,使用 lt、lte、gt 和 gte 来替代<、<=、>和>= 逻辑操作符 &&(and) 、||(or) 、!(not) ,只能用于布尔值,否则会产生错误 例子:<#if x < 12&& color = "green"> We have less than 12 things, and they are green. </#if> <#if!hot> <#--here hot must be a boolean --> It's not hot. </#if>内建函数 内建函数的用法类似访问散列的子变量,只是使用“?”替代“.”,下面列出 ? . 常用的一些函数 字符串使用的:html:对字符串进行 HTML 编码 cap_first:使字符串第一个字母大写 lower_case:将字符串转换成小写 upper_case:将字符串转换成大写 trim:去掉字符串前后的空白字符 序列使用的: size:获得序列中元素的数目 数字使用的: int:取得数字的整数部分(如-1.9?int 的结果是-1) 例子(假设 test 保存字符串"Tom & Jerry") :${test?html} ${test?upper_case?html}输出结果是:Tom &amp; Jerry TOM &amp; JERRY操作符优先顺序 操作符组 后缀 一元 内建 乘法 加法 关系 相等 逻辑 and 逻辑 or 数字范围 操作符 [subvarName] [subStringRange] . (methodParams) +expr、-expr、! ? *、 /、% +、<、>、<=、>=(lt、lte、gt、gte) ==(=) 、!= && || ..(4)Interpolation Interpolation 有两种类型: 通用 Interpolation:${expr} 数字 Interpolation:#{expr}或#{expr; format} 注意:Interpolation 只能用于文本部分 通用 Interpolation 插入字符串值:直接输出表达式结果 插入数字值:根据缺省格式(由#setting 指令设置)将表达式结果转换成文本 输出;可以使用内建函数 string 格式化单个 Interpolation,下面是一个例子:<#setting number_format="currency"/><#assign answer=42/> ${answer} ${answer?string} <#-- the same as ${answer} --> ${answer?string.number} ${answer?string.currency} ${answer?string.percent}输出结果是:$42.00 $42.00 42 $42.00 4,200%插入日期值:根据缺省格式(由#setting 指令设置)将表达式结果转换成文本 输出;可以使用内建函数 string 格式化单个 Interpolation,下面是一个使用格 式模式的例子:${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')'")}输出的结果类似下面的格式:2003-04-08 21:24:44 Pacific Daylight Time Tue, Apr 8, '03 Tuesday, April 08, 2003, 09:24:44 PM (PDT)插入布尔值:根据缺省格式(由#setting 指令设置)将表达式结果转换成文本 输出;可以使用内建函数 string 格式化单个 Interpolation,下面是一个例子:<#assign foo=true/> ${foo?string("yes", "no")}输出结果是:yes数字 Interpolation 的#{expr; format}形式可以用来格式化数字,format 可以 是: mX:小数部分最小 X 位 MX:小数部分最大 X 位 例子:<#-- If the language is US English the output is: --><#assign x=2.582/> <#assign y=4/> #{x; M2} #{y; M2} #{x; m1} #{y; m1} <#-- 2.58 --> <#-- 4 --><#-- 2.6 --> <#-- 4.0 -->#{x; m1M2} <#-- 2.58 --> #{y; m1M2} <#-- 4.0 -->4、杂项(1)用户定义指令 宏和变换器变量是两种不同类型的用户定义指令,它们之间的区别是宏是在模板 中使用 macro 指令定义,而变换器是在模板外由程序定义,这里只介绍宏 基本用法 宏是和某个变量关联的模板片断, 以便在模板中通过用户定义指令使用该变量, 下面是一个例子:<#macrogreet> <font size="+2">Hello Joe!</font> </#macro>作为用户定义指令使用宏变量时,使用@替代 FTL 标记中的#<@greet></@greet>如果没有体内容,也可以使用:<@greet/>参数 在 macro 指令中可以在宏变量之后定义参数,如:<#macro greetperson> <font size="+2">Hello ${person}!</font> </#macro>可以这样使用这个宏变量:<@greetperson="Fred"/> and <@greet person="Batman"/>输出结果是:<font size="+2">HelloFred!</font> and <font size="+2">HelloBatman!</font>宏的参数是 FTL 表达式,所以下面的代码具有不同的意思:<@greet person=Fred/>这意味着将 Fred 变量的值传给 person 参数,该值不仅是字符串,还可以是其 它类型,甚至是复杂的表达式 宏可以有多参数,下面是一个例子:<#macro greetperson color> <font size="+2" color="${color}">Hello ${person}!</font> </#macro>可以这样使用该宏变量:<@greet person="Fred" color="black"/>其中参数的次序是无关的,因此下面是等价的:<@greet color="black" person="Fred"/>只能使用在 macro 指令中定义的参数,并且对所有参数赋值,所以下面的代码 是错误的:<@greet person="Fred" color="black" background="green"/> <@greet person="Fred"/>可以在定义参数时指定缺省值,如:<#macro greet personcolor="black"> <font size="+2" color="${color}">Hello ${person}!</font> </#macro>这样<@greet person="Fred"/>就正确了 宏的参数是局部变量,只能在宏定义中有效 嵌套内容 用户定义指令可以有嵌套内容, 使用<#nested>指令执行指令开始和结束标记之 间的模板片断 例子:<#macro border> <table border=4 cellspacing=0 cellpadding=4><tr><td> <#nested> </tr></td></table> </#macro>这样使用该宏变量:<@border>The bordered text</@border>输出结果:<table border=4 cellspacing=0 cellpadding=4><tr><td> The bordered text</tr></td></table><#nested>指令可以被多次调用,例如:<#macro do_thrice> <#nested> <#nested> <#nested> </#macro> <@do_thrice> Anything. </@do_thrice>输出结果:Anything. Anything. Anything.嵌套内容可以是有效的 FTL,下面是一个有些复杂的例子:<@border> <ul> <@do_thrice> <li><@greet person="Joe"/> </@do_thrice> </ul> </@border>输出结果:<table border=4 cellspacing=0 cellpadding=4><tr><td> <ul> <li><font size="+2">Hello Joe!</font><li><font size="+2">Hello Joe!</font><li><font size="+2">Hello Joe!</font></ul></tr></td></table>宏定义中的局部变量对嵌套内容是不可见的,例如:<#macro repeat count> <#local y = "test"> <#list 1..count as x> ${y} ${count}/${x}: <#nested> </#list> </#macro> <@repeat count=3>${y?default("?")} ${x?default("?")}${count?default("?")}</@repeat>输出结果:test 3/1: ? ? ? test 3/2: ? ? ? test 3/3: ? ? ?在宏定义中使用循环变量 用户定义指令可以有循环变量,通常用于重复嵌套内容,基本用法是:作为 nested 指令的参数传递循环变量的实际值,而在调用用户定义指令时,在<@…>开 始标记的参数后面指定循环变量的名字 例子:<#macro repeat count> <#list 1..count as x> <#nestedx, x/2, x==count> </#list> </#macro> <@repeat count=4; c, halfc, last> ${c}. ${halfc}<#iflast> Last!</#if> </@repeat>输出结果:1. 0.52. 1 3. 1.5 4. 2 Last!指定的循环变量的数目和用户定义指令开始标记指定的不同不会有问题 调用时少指定循环变量,则多指定的值不可见 调用时多指定循环变量,多余的循环变量不会被创建 (2)在模板中定义变量 在模板中定义的变量有三种类型: plain 变量:可以在模板的任何地方访问,包括使用 include 指令插入的模板, 使用 assign 指令创建和替换 局部变量:在宏定义体中有效,使用 local 指令创建和替换 循环变量:只能存在于指令的嵌套内容,由指令(如 list)自动创建;宏的参 数是局部变量,而不是循环变量 局部变量隐藏(而不是覆盖)同名的 plain 变量;循环变量隐藏同名的局部变量和 plain 变量,下面是一个例子:<#assign x = "plain"> 1. ${x} <#-- we see the plain var. here --> <@test/> 6. ${x} <#-- the value of plain var. was not changed --> <#list ["loop"] as x> 7. ${x} <#-- now the loop var. hides the plain var. --> <#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here --> 8. ${x} <#-- it still hides the plain var. --> </#list> 9. ${x} <#-- the new value of plain var. --><#macro test> 2. ${x} <#-- we still see the plain var. here --> <#local x = "local"> 3. ${x} <#-- now the local var. hides it --> <#list ["loop"] as x> 4. ${x} <#-- now the loop var. hides the local var. --></#list> 5. ${x} <#-- now we see the local var. again --> </#macro>输出结果:1. plain 2. plain 3. local 4. loop 5. local 6. plain 7. loop 8. loop 9. plain2内部循环变量隐藏同名的外部循环变量,如:<#list ["loop 1"] as x> ${x} <#list ["loop 2"] as x> ${x} <#list ["loop 3"] as x> ${x} </#list> ${x} </#list> ${x} </#list>输出结果:loop 1 loop 2 loop 3 loop 2loop 1模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型 中的同名变量,使用特殊变量 global,下面的例子假设数据模型中的 user 的值是 Big Joe:<#assign user = "Joe Hider"> ${user} <#-- prints: Joe Hider -->${er} <#-- prints: Big Joe -->(3)名字空间 通常情况,只使用一个名字空间,称为主名字空间 为了创建可重用的宏、 变换器或其它变量的集合 (通常称库) 必须使用多名字空间, , 其目的是防止同名冲突 创建库 下面是一个创建库的例子(假设保存在 lib/my_test.ftl 中) :<#macro copyright date> <p>Copyright (C) ${date} Julia Smith. All rights reserved. <br>Email: ${mail}</p> </#macro> <#assign mail = "jsmith@">使用 import 指令导入库到模板中,Freemarker 会为导入的库创建新的名字空 间,并可以通过 import 指令中指定的散列变量访问库中的变量:<#import "/lib/my_test.ftl" as my> <#assign mail="fred@"> <@my.copyright date="1999-2002"/> ${my.mail} ${mail}输出结果:<p>Copyright (C) 1999-2002 Julia Smith. All rights reserved. <br>Email: jsmith@</p> jsmith@ fred@可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间 可以使用 assign 指令在导入的名字空间中创建或替代变量,下面是一个例子:<#import "/lib/my_test.ftl" as my> ${my.mail}<#assign mail="jsmith@"in my> ${my.mail}输出结果:jsmith@ jsmith@数据模型中的变量任何地方都可见,也包括不同的名字空间,下面是修改的库:<#macro copyright date> <p>Copyright (C) ${date} ${user}. All rights reserved.</p> </#macro> <#assign mail = "${user}@">假设数据模型中的 user 变量的值是 Fred,则下面的代码:<#import "/lib/my_test.ftl" as my> <@my.copyright date="1999-2002"/> ${my.mail}输出结果:<p>Copyright (C) 1999-2002Fred. All rights reserved.</p> Fred@。

freemarker表达式 -回复

freemarker表达式 -回复

freemarker表达式-回复Freemarker是一种模板引擎,用于在Java应用程序中生成动态的HTML、XML、JSON和其他格式的文档。

它通过将数据模型与模板文件进行匹配来产生输出。

在这篇文章中,我们将一步一步回答关于Freemarker表达式的问题,并深入探讨它的用途和功能。

一、什么是Freemarker表达式?Freemarker表达式是一种用于在Freemarker模板中处理和展示数据的语法结构。

它可以嵌入在模板文件的特定位置,并用于获取、操作和展示数据。

通过使用Freemarker表达式,可以根据具体的数据模型动态地生成页面内容。

二、如何使用Freemarker表达式?1. 引入Freemarker库首先,我们需要在项目中引入Freemarker库。

可以通过Maven或手动下载JAR文件来完成。

然后,将库添加到项目的依赖中。

2. 创建数据模型在使用Freemarker表达式之前,我们需要创建一个数据模型,包含要在模板中使用的数据。

可以使用Java对象、Map或其他数据结构来定义模型。

3. 加载模板文件使用Freemarker库提供的类加载模板文件。

模板文件是一个包含了Freemarker表达式的文本文件,其中包含了要生成的页面的结构和内容。

4. 解析模板通过调用Freemarker库提供的方法,将模板和数据模型结合起来,生成输出内容。

这一步将包括对Freemarker表达式的解析和替换。

5. 显示输出将生成的输出内容显示在用户界面上,可以是一个网页、一个XML文件或其他格式的文档。

输出内容将包含模板文件中嵌入的Freemarker表达式的结果。

三、Freemarker表达式的语法结构是什么样的?Freemarker表达式具有一种特定的语法结构,其中包含了一些关键字、运算符和标识符。

以下是一些常见的Freemarker表达式的语法结构:1. 变量引用以"{}"的形式来引用变量。

freemarker 调用对象的方法

freemarker 调用对象的方法

freemarker 调用对象的方法
在Freemarker中,可以通过以下方式调用对象的方法:
1. 使用点操作符(.)来调用对象的方法。

例如,假设有一个
名为"person"的对象,其中包含一个名为"getName"的方法,可以使用以下方式调用该方法:
`${person.getName()}`
2. 如果对象的方法不需要接受任何参数,可以省略方法的括号。

例如,假设有一个名为"person"的对象,其中包含一个名为"getName"的方法,可以使用以下方式调用该方法:
`${person.getName}`
3. 如果对象的方法接受参数,可以使用以下方式传递参数:
`${person.someMethod("param1", "param2")}`
注意:在Freemarker中,不能直接访问对象的私有方法。


有公共方法可以被调用。

同时,还可以通过显示指定一个方法的具体返回类型来调用对象的方法。

例如,假设有一个名为"person"的对象,其中包含
一个名为"calculateAge"的方法,可以使用以下方式调用该方
法并指定返回类型为整数:
`${person.calculateAge()?c}`
在以上示例中,"?c"代表对方法的结果使用指定类型转换。

在这种情况下,调用后将确保返回值是一个整数类型。

freemarker语法

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)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FreeMarker概述和特性FreeMarker概述FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker 生成页面,通过模板显示准备的数据(如下图)FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP 标记库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处理能力<#recurse>和<#visit>指令(2.3版本)用于递归遍历XML树在模板中清楚和直觉的访问XML对象模型Eclipse下编辑FreeMarker的插件FreeMarker(/)是一个非常优秀的模板引擎,一个用来根据模板生成文本输出的通用工具,我们可以用它来生成例如HTML这样的文本,FreeMarker本身提供了一个Eclipse的插件用于编写FreeMarker模板文件,这个插件主要是提供了语法高亮、语法错误提示以及模板文件的概要信息,下图是该插件工作的截图:接下来把安装过程大略的介绍一下:(Eclipse3.x)打开菜单项Help->Software updates->Find and install....选择单选项"Search for new features to install".点击Add Update Site...,输入"FreeMarker"作为名字以及"/eclipse/update"作为更新的地址选中复选框"FreeMarker"点击下一步或完成按钮根据提示完成插件的安装安装完毕后该插件自动关联*.ftl文件,你也可以在下面对话框中进行自行设置网址:FreeMarker的官方主页:/下载地址:/projects/freemarker使用FreeMarker生成Html静态文件(实例)以下是我在生成新闻的静态文件时用到的代码.仅供参考.请根据实际情况修改.模板:<html><head><title>查看文章:${newsitem.title}</title></head><body><table width="100%"border="0"cellpadding="0"cellspacing="0"bgcolor="#FFFFFF"> <tr><td><table width="95%"border="0"align="center"cellpadding="2"cellspacing="6"><tr><td height="10"align="left"colspan=2></td></tr><tr><td align="left"width="538"><strong>${newsitem.title}</strong>(${newsitem.addtime})</td><td align="right"><a href="index.jsp">返回</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td></tr><tr><td align="left"valign=top colspan=2><hr align="left"width="95%"siz e="1"noshade color="#cc0000"></td></tr><tr><td colspan=2>${newsitem.showContent}</td></tr></table><br></td></tr></table></body></html>代码:import java.io.*;import java.util.HashMap;import java.util.Map;import mons.logging.Log;import mons.logging.LogFactory;import freemarker.template.*;/**Created on2005-4-7**//***测试FreeMarker.**@author scud**/public class FreeMarkerTest{private final Log logger=LogFactory.getLog(getClass());private Configuration freemarker_cfg=null;public static void main(String[]args){//@todo自己的一个类NewsItem aItem=null;//@todo装入新闻//NewsItem=loadNewsItem(1);FreeMarkerTest test=new FreeMarkerTest();Map root=new HashMap();root.put("newsitem",aItem);String sGeneFilePath="/tpxw/";String sFileName="1.htm";boolean bOK=test.geneHtmlFile("/tpxw/view.ftl",root,sGeneFilePath,sFileName);}/***获取freemarker的配置.freemarker本身支持classpath,目录和从ServletContext获取.*/protected Configuration getFreeMarkerCFG(){if(null==freemarker_cfg){//Initialize the FreeMarker configuration;//-Create a configuration instancefreemarker_cfg=new Configuration();//-FreeMarker支持多种模板装载方式,可以查看API文档,都很简单:路径,根据Servlet上下文,classpath等等//htmlskin是放在classpath下的一个目录freemarker_cfg.setClassForTemplateLoading(this.getClass(),"/htmlskin");}return freemarker_cfg;}/***生成静态文件.**@param templateFileName模板文件名,相对htmlskin路径,例如"/tpxw/view.ftl"*@param propMap用于处理模板的属性Object映射*@param htmlFilePath要生成的静态文件的路径,相对设置中的根路径,例如"/tpxw/1/2005/4/"*@param htmlFileName要生成的文件名,例如"1.htm"*/public boolean geneHtmlFile(String templateFileName,Map propMap,String htmlFilePath,String htmlFileName){//@todo从配置中取得要静态文件存放的根路径:需要改为自己的属性类调用String sRootDir="e:/webtest/htmlfile";try{Template t=getFreeMarkerCFG().getTemplate(templateFileName);//如果根路径存在,则递归创建子目录creatDirs(sRootDir,htmlFilePath);File afile=new File(sRootDir+"/"+htmlFilePath+"/"+htmlFileName);Writer out=new BufferedWriter(new OutputStreamWriter(newFileOutputStream(afile)));t.process(propMap,out);}catch(TemplateException e){logger.error("Error while processing FreeMarker template"+templateFileName,e);return false;}catch(IOException e){logger.error("Error while generate Static Html File"+htmlFileName,e);return false;}return true;}/***创建多级目录**@param aParentDir String*@param aSubDir以/开头*@return boolean是否成功*/public static boolean creatDirs(String aParentDir,String aSubDir){File aFile=new File(aParentDir);if(aFile.exists()){File aSubFile=new File(aParentDir+aSubDir);if(!aSubFile.exists()){return aSubFile.mkdirs();}else{return true;}}else{return false;}}}学习FreeMarkerFreeMarker是一个用Java编写的模板引擎,主要用来生成HTML Web页面,特别是基于MVC 模式的应用程序。

相关文档
最新文档