这是 FreeMarker Java 模板引擎的入门教程。 我们介绍了 FreeMarker 模板引擎,并创建了几个控制台和 Web 应用。 Maven 用于构建我们的示例。 NetBeans 用于管理应用。
FreeMarker 是 Java 编程语言的模板引擎。 模板以 FreeMarker 模板语言(FTL)编写。 FreeMarker 的主页是 freemarker.org 。
FreeMarker 模板引擎
模板引擎将静态数据与动态数据结合起来以产生内容。 模板是内容的中间表示。 它指定如何生成输出。
模板引擎的优点是:
- 关注点分离,
- 避免重复代码,
- 更容易在视图之间切换,
- 可重用性。
按照惯例,FreeMarker 模板文件的扩展名为.ftl
。
FreeMarker 不仅限于 HTML 页面的模板; 它可以用于生成电子邮件,配置文件,源代码等。
FreeMarker 控制台应用
前两个应用是控制台应用。 我们在 NetBeans 中创建新的 Maven Java 应用。 他们使用以下 Maven 构建文件:
在 Maven pom.xml
文件中,我们指定 FreeMarker 依赖性。
FreeMarker 插值
插值是放在${ }
字符之间的表达式。 FreeMarker 会将输出中的插值替换为大括号内表达式的实际值。
在下面的示例中,我们使用 FreeMarker 模板文件来生成简单的文本输出。
Figure: Java console project structure in NetBeans
这是 NetBeans 中的项目结构。
FreeMarkerConsoleEx.java
该示例将简单文本打印到控制台。 最终文本由模板引擎处理。
Configuration
用于设置 FreeMarker 设置; 它以 FreeMarker 库的版本为参数。
setClassForTemplateLoading()
设置将使用其方法来加载模板的类。
使用getTemplate()
方法,我们检索test.ftl
模板文件。
数据模型已创建。 来自模型的数据将被动态放置到 FreeMarker 模板文件中。
process()
方法使用提供的数据模型执行模板,并将生成的输出写入提供的写入器。
test.ftl
test.ftl
模板文件包含一个插值; 它将替换为生成的字符串。
这是应用的输出。
用 FreeMarker 列出一个集合
#list
指令列出了数据集合。
下一个示例生成汽车列表。
Car.java
我们有一个Car
bean。 它具有两个属性:名称和价格。
FreeMarkerConsoleEx2.java
此示例是一个 Java 控制台程序,该程序使用 FreeMarker 动态创建包含汽车列表的文本输出。
在这里,我们创建Car
对象的ArrayList
并将其放入数据模型。
test.ftl
模板文件包含一个#list
指令,该指令打印汽车对象的属性。 使用点字符访问属性。
这是示例的输出。
FreeMarker 指令
FreeMarker 指令是执行动作的特殊标记。 指令有两种:内置指令和自定义指令。
<#assign>
标签创建一个新的普通变量。 可以使用${}
构造对其进行访问。 变量在模板中创建。 如果数据模型中有一个同名变量,则模板变量会将其隐藏。
assignment.ftl
<#assign>
指令创建一个新的name
变量。 变量的值使用${name}
语法打印。
该示例打印此行。
可以使用<#if>
,<#elseif>
和<#else>
伪指令完成模板节的条件处理。
conditions.ftl
该示例创建一个新的value
变量,并使用条件指令来测试该值。
这是输出。
<#list>
指令用于遍历序列。
listing.ftl
在示例中,我们将新的颜色名称序列分配给colours
变量。 <#list>
指令遍历集合并打印每个项目。
该示例给出了此输出。
listing2.ftl
在此示例中,我们创建一个哈希变量,并使用<#list>
输出哈希的值和键。
The example gives this output.
当我们使用对空格不敏感的格式(例如 HTML 或 XML)时,<#compress>
指令会删除多余的空格
compressing.ftl
我们的文本带有空格,制表符和换行符。
该程序删除了所有多余的空白。
FreeMarker Servlet 示例
在下面的示例中,我们在标准 Java Web 应用中使用 FreeMarker。 该应用打包到war
文件中,并部署在 NetBeans 的内置 Tomcat 服务器上。
在 NetBeans 中,我们创建一个新的 Maven Web 应用。
Figure: FreeMarker servlet project structure in NetBeans
这是 NetBeans 中 FreeMarker servlet 示例的项目结构。
在pom.xml
文件中,我们具有这两个依赖关系。
context.xml
这是context.xml
文件。
web.xml
在web.xml
文件中,我们设置并配置了 FreeMarker servlet。 有关每个选项的说明,请参考 FreeMarker 文档。
Car.java
这是Car
bean,具有有关汽车对象的基本数据。
MyServlet.java
我们设置 servlet 并将其分发到模板文件。 我们创建了一个ArrayList
汽车并将其设置为请求。
index.ftl
index.ftl
文件位于src/main/webapp
目录中。 使用#list
指令,我们显示了 cars 系列的所有元素。
Figure: FreeMarker servlet example
我们在 Opera 网络浏览器中显示应用输出。 NetBeans 中的内置 Tomcat 在 8084 端口上运行。
FreeMarker 与 Spark
Spark 是为快速开发而构建的简单轻便的 Java Web 框架。 默认情况下,Spark 在嵌入式 Jetty Web 服务器上运行,但可以配置为在其他 Web 服务器上运行。 为了将 FreeMarker 与 Spark 集成,我们使用spark-template-freemarker
,这是 Spark 的 Freemarker 模板引擎实现。
这是项目结构。
pom.xml
pom.xml
文件包含 Spark 模块和 FreeMarker 的依赖项。
SparkFreeMarker.java
我们为 FreeMarker 设置了相同的应用。
我们用Configuration
类配置 FreeMarker。 模板文件将放置在views
目录中,该目录必须位于类路径上。
FreeMarkerEngine
传递给get()
方法。
ModelAndView
用于设置视图名称和要渲染的模型对象。
hello.ftl
这是hello.ftl
模板文件; 它引用随ModelAndView
对象传递的名称变量。
我们使用mvn package
命令构建项目。
我们运行程序。 maven-assembly-plugin
允许创建具有所有依赖项的可执行 JAR。
This is the output.
FreeMarker 与 Spring
Spring 是流行的 Java 应用框架。 Spring Boot 是通过最小的努力来创建独立的,生产级的基于 Spring 的应用的产物。
经典 Spring 应用
在以下示例中,我们将 FreeMarker 集成到经典的 Spring 应用中。
这是我们经典的 Spring 应用的项目结构。
pom.xml
pom.xml
文件包含 Spring 模块和 FreeMarker 的依赖项。
web.xml
在web.xml
文件中,我们定义了 Spring DispatcherServlet
,它是 HTTP 请求处理程序的中央调度程序。
spring-servlet.xml
在 spring servlet 上下文 XML 文件中,我们定义了两个 bean:freemarkerConfig
和viewResolver
。 这些是 FreeMarker 的配置 bean。 spring-servlet.xml 位于WEB-INF
中。
Spring 将扫描com.zetcode
软件包中的组件。
<context:property-placeholder>
元素注册一个PropertySourcesPlaceholderConfigurer
,该元素允许使用@Value
注释设置属性。 location
属性指示在哪里查找属性。
my.properties
在my.properties
文件中,我们有一个键/值对。 该值是应用的版本。 该文件位于usr/main/resources
目录中。
IVersionService.java
IVersionService
接口包含一个方法协定:getVersion()
。
VersionService.java
VersionService
返回应用的版本。
位于my.properties
文件中的app.version
键的值被注入到appVersion
属性中。
MyController.java
这是控制器类。
在version
方法(当带有/version
URL 的请求到达时被调用)中,我们调用VersionService's
getVersion()
方法并将该值传递到ModelAndView
中。 处理将分派到version.ftl
模板文件,在该文件中插入版本值。
index.ftl
这是index.ftl
文件。 它具有一个链接,该链接向服务器发送请求以获取应用的版本。
version.ftl
version.ftl
模板文件用于建立服务器对客户端的响应。
使用 FreeMarker 的 Spring Boot Web 应用
在下一个应用中,我们将 FreeMarker 集成到 Spring Boot Web 应用中。
Figure: Spring Boot web project structure in NetBeans
这是在 NetBeans 中使用 FreeMarker 的 Spring Boot Web 应用的项目结构。 请注意,我们正在 NetBeans 中创建 Java SE Maven 应用,而不是 Java Web Maven 应用。 这是因为我们已将 Tomcat 嵌入到我们的 JAR 文件中。
pom.xml
这是 Maven 构建文件。 它包括 Spring Boot 和 FreeMarker 的依赖项。 无需在 Spring Boot 中配置 FreeMarker。 在 POM 文件中找到 FreeMarker 依赖关系后,Spring Boot 会自动进行配置。 spring-boot-maven-plugin
创建带有嵌入式容器(默认为 Tomcat)的可执行 JAR。
SpringBootClient.java
Application
设置 Spring Boot 应用。 @SpringBootApplication
注释执行三件事:1)将类定义为配置类,2)启用自动配置,3)启用组件扫描。
MyController.java
这是 Spring Boot Web 应用的控制器类。 控制器具有两个映射。 第一个映射解析为index.ftl
文件,第二个映射解析为hello.ftl
文件。
index.ftl
这是index.ftl
文件。 它具有 HTML 表单,可将消息发送到服务器。
hello.ftl
服务器以一条消息回应给客户端。 响应是从hello.ftl
模板文件创建的。
Figure: Spring Boot web example
Spring Boot 启动一个嵌入式 Tomcat 服务器,侦听端口 8080。
本教程专门针对 FreeMarker 模板引擎。