Freemarker基础语法种类:
1.变量表达式
<#assign name = "John Doe">
Hello, ${name}!
2.指令
<#if age > 18>
You are an adult.
<#else>
You are a minor.
</#if>
3.注释
<#-- This is a comment -->
4.插值表达式
<p>The current time is #{.now}</p>
5.宏定义
<#macro greeting name>
Hello, ${name}!
</#macro>
<@greeting name="John Doe" />
6.函数定义
<#function addNumbers x y>
<#return x + y>
</#function>
<#assign result = addNumbers(5, 10)>
7.引入外部数据模型
<#import "com.example.Model" as model>
<#assign user = model.User(name = "John Doe", age = 25)>
<p>User name: ${user.name}</p>
8.include指令
<#include "header.ftl">
<p>This is the body of the page.</p>
<#include "footer.ftl">
9.继承和覆盖
基础模板(base.ftl):
<html>
<head>
<title>${title}</title>
</head>
<body>
<#block "content">
This is the content of the page.
</#block>
</body>
</html>
子模板(child.ftl):
<#include "base.ftl">
<#override "content">
This is the overridden content of the page.
</#override>
Freemarker遍历List集合:
在Freemarker中遍历List集合可以使用<#list>指令。下面是一个示例:
<#list listVariable as listItem>
${listItem}
</#list>
其中,listVariable是List类型的变量名,listItem是在迭代过程中每个元素的引用。在循环体内部,可以使用listItem来访问每个元素的值。
例如,如果有一个List<Integer>类型的变量numbers,可以这样遍历:
<#list numbers as number>
${number}
</#list>
在循环体内部的${number}将输出列表中的每个整数。
除了简单遍历外,还可以在<#list>指令中使用index来获取元素的索引值:
<#list listVariable as listItem index>
${index+1}. ${listItem}
</#list>
这样可以在循环体内部输出每个元素的索引值加上对应的内容。
需要注意的是,<#list>指令的结束标签</#list>是必须的,在循环体内部的内容将被迭代多次。
Freemarker获取map中的数据:
在Freemarker中获取Map中的数据可以使用.操作符。下面是一个示例:
假设有一个Map类型的变量map,包含以下键值对:
map.put("name", "Alice");
map.put("age", 25);
要获取map中的数据,可以使用以下语法:
${map.name}
${map.age}
${map.name}将输出"Alice",${map.age}将输出"25"。
如果要访问Map中的嵌套数据,可以使用.操作符来连续访问键。例如,如果有一个Map类型的变量person,包含以下键值对:
Map<String, Object> person = new HashMap<>();
Map<String, Object> address = new HashMap<>();
address.put("city", "New York");
address.put("state", "NY");
person.put("name", "Alice");
person.put("address", address);
要获取person中的地址(city和state),可以使用以下语法:
${person.address.city}
${person.address.state}
${person.address.city}将输出"New York",${person.address.state}将输出"NY"。
这样可以通过.操作符从嵌套的Map中获取数据。
Freemarker运算符:
Freemarker中支持多种运算符,用于在模板中进行各种计算和比较操作。以下是一些常用的Freemarker运算符:
1.算术运算符:
+:加法-:减法*:乘法/:除法%:取模运算
示例:
${num1 + num2} // 加法运算
${num1 - num2} // 减法运算
${num1 * num2} // 乘法运算
${num1 / num2} // 除法运算
${num1 % num2} // 取模运算
2.比较运算符
==:等于!=:不等于<:小于>:大于<=:小于等于>=:大于等于
示例:
<#if num1 == num2>
num1 等于 num2
<#else>
num1 不等于 num2
</#if>
<#if num1 < num2>
num1 小于 num2
<#else>
num1 大于等于 num2
</#if>
3.逻辑运算符:
&&:逻辑与||:逻辑或!:逻辑非
示例:
<#if (num1 > 0) && (num2 < 10)>
num1 大于 0,num2 小于 10
</#if>
<#if (num1 <= 0) || (num2 >= 10)>
num1 小于等于 0,num2 大于等于 10
</#if>
<#if !(num1 == num2)>
num1 不等于 num2
</#if>
4.其他运算符:
():括号用于改变运算的优先级?::三元运算符,类似于Java的condition ? trueValue : falseValue
示例:
${(num1 + num2) * num3} // 加法运算的结果与 num3 相乘
${(num1 > num2) ? "num1 大于 num2" : "num1 小于等于 num2"} // 三元运算符
Freemarker空值处理:
在Freemarker中,你可以使用内建函数和指令来处理空值(null)。
-
在输出变量时,使用条件判断: 使用<#if>指令来判断变量是否为空,然后根据判断结果输出相应内容。例如:
<#if variable??> ${variable} <#else> Variable is null </#if>上述代码中,
<#if>指令用于判断variable是否为null,如果不为null,则输出变量的值;如果为null,则输出"Variable is null"。 -
使用内建函数进行默认值设置:
-
<#default>:该函数用于设置变量的默认值,当变量为null时,使用默认值。例如:${variable!defaultValue}上述代码中,如果
variable为null,则输出defaultValue作为默认值。 -
<#assign>:该指令用于给变量赋值,可以在赋值时使用默认值。例如:<#assign variable = anotherVariable!defaultValue> ${variable}上述代码中,如果
anotherVariable为null,则将defaultValue赋给variable,然后输出variable的值。
-
-
使用内建函数进行空值判断:
-
<#ifnull>:该函数用于判断变量是否为null,返回true或false。例如:<#if <#ifnull(variable)></#if>> Variable is null <#else> ${variable} </#if>上述代码中,
<#ifnull>函数用于判断variable是否为null,如果为null,则输出"Variable is null";否则输出变量的值。
-
Freemarker内建函数:
Freemarker内建函数是Freemarker自带的一些函数,可以在模板中直接使用。这些函数用于在模板中进行一些常见的操作和计算,例如字符串处理、日期格式化、集合操作等。
下面是一些常用的Freemarker内建函数:
-
字符串处理函数:
capitalize:将字符串首字母大写。lower_case:将字符串转换为小写。upper_case:将字符串转换为大写。length:获取字符串的长度。trim:去除字符串两端的空格。
-
数字处理函数:
number:将字符串转换为数字。abs:获取数字的绝对值。ceil:向上取整。floor:向下取整。round:四舍五入。
-
集合处理函数:
size:获取集合的大小。first:获取集合的第一个元素。last:获取集合的最后一个元素。sort:对集合进行排序。
-
日期时间处理函数:
now:获取当前时间。date:将字符串转换为日期对象。time:将字符串转换为时间对象。datetime:将字符串转换为日期时间对象。iso_utc:将日期时间对象格式化为ISO 8601格式。
这些内建函数可以直接在Freemarker模板中使用,例如:
${myString?upper_case}
${myNumber?abs}
${myList?size}
${myDate?datetime("yyyy-MM-dd HH:mm:ss")}
除了内建函数,Freemarker还支持自定义函数,可以在模板中使用自己定义的函数来进行特定的处理。
Freemarker静态文件生成:
Freemarker是一种模板引擎,用于生成动态的文本内容。它通常用于生成HTML页面、XML文件、配置文件等。不过,Freemarker本身并不直接提供生成静态文件的功能。
如果你需要使用Freemarker生成静态文件,你可以借助其他工具或框架来实现。以下是一种典型的方法:
1.使用Java程序调用Freemarker:你可以编写一个Java程序,使用Freemarker来渲染模板,并将渲染结果输出到文件。
在这种方法中,你需要引入Freemarker的依赖库,并编写Java代码来实现渲染和输出逻辑。具体步骤包括:
- 设置Freemarker的配置,包括模板加载路径、字符编码等。
- 加载模板文件。
- 创建数据模型,将数据填充到模板中。
- 使用Freemarker进行渲染,得到渲染结果。
- 将渲染结果输出到文件。
示例代码如下:
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
public class FreemarkerStaticFileGenerator {
public static void main(String[] args) {
try {
// 设置Freemarker的配置
Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
cfg.setClassForTemplateLoading(FreemarkerStaticFileGenerator.class, "/templates");
cfg.setDefaultEncoding("UTF-8");
// 加载模板文件
Template template = cfg.getTemplate("myTemplate.ftl");
// 创建数据模型
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("name", "John");
// 添加其他需要的数据
// 渲染模板
StringWriter writer = new StringWriter();
template.process(dataModel, writer);
String renderedContent = writer.toString();
// 输出到文件
File outputFile = new File("output.html");
try (BufferedWriter fileWriter = new BufferedWriter(new FileWriter(outputFile))) {
fileWriter.write(renderedContent);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上述示例代码中,我们使用freemarker.template.Configuration类来设置Freemarker的配置,freemarker.template.Template类来加载模板,Template.process()方法来渲染模板并输出结果。
2.使用静态网站生成器:另一种方法是使用诸如Jekyll、Hugo、Gatsby等静态网站生成器。这些工具可以将Freemarker模板与其他静态资源(如CSS、JavaScript等)一起生成静态网站。你只需编写Freemarker模板,然后执行相应的生成命令即可。
这种方法的优势是可以利用静态网站生成器提供的其他功能,如自动化部署、前端构建等。
总结来说,要使用Freemarker生成静态文件,你可以使用Java程序调用Freemarker进行渲染并输出到文件,或者结合静态网站生成器进行生成。具体选择取决于你的需求和开发环境。
本文详细介绍了Freemarker的基础语法,包括变量表达式、指令、注释、插值表达式、宏定义、函数定义、数据模型操作、遍历、运算符、空值处理和内建函数。此外,还探讨了如何使用Freemarker生成静态文件的方法。

被折叠的 条评论
为什么被折叠?



