【Java开发】之模板引擎 freemarker

目录


一、简介


1、FreeMarker 介绍

FreeMarker 是一款 基于模板和要改变的数据 的模板引擎, 是用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

FreeMarker 模板的工作方式为 MVC模型、视图、控制器)模式,常用来在 MVC 模式的 Web 开发框架中生成 HTML 页面。

更多关于 FreeMarker 的介绍可以参考官方文档:http://freemarker.foofun.cn/

2、FreeMarker 工作流程

一个包含变量的 HTML 文本(变量的占位符为${}):

<html>
	...
	hello ${name}
	...
</html>

Java 实体对象设置相应的属性变量 name

...
model.setName("Jack");
...

经过 FreeMarker 模板的转换得到最终结果:

<html>
	...
	hello Jack
	...
</html>

二、FreeMarker 实战


1、引入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-freemarker</artifactId>
  <version>2.3.12.RELEASE</version>
</dependency>

2、编写 HTML 文本模板

resources/templates 路径下添加 demo.ftl 模板:

<div style="max-width: 760px; width: 100%;">
    <div style="font-size: 18px; font-family: 'Courier New',serif">
        This is Title: ${title}
    </div>
    <div style="font-size: 15px; font-family: 'Arial',serif">
        This is a content: ${content}
    </div>
</div>

3、编写 Freemarker 工具类

import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;

/**
 * @author wangtingyun
 */
@Slf4j
public class FreemarkerUtils {

    /**
     * 处理 FTL 模板
     * @param templateFileName FTL模板文件名
     * @param model Java实体类
     * @return 经过Freemarker处理后的FTL模板
     */
    public static String process(String templateFileName, Map<String, Object> model) {
        // 定义字符串输出流
        StringWriter stringWriter = new StringWriter();
        try {
            // 配置Freemarker
            Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
            cfg.setClassLoaderForTemplateLoading(Thread.currentThread().getContextClassLoader(),"/templates");
            cfg.setDefaultEncoding("UTF-8");
            cfg.setNumberFormat("#.##");
            // 加载FTL模板
            Template temp = cfg.getTemplate(templateFileName);
            // 处理FTL模板
            temp.process(model, stringWriter);
            // 返回处理结果
            stringWriter.flush();
            return stringWriter.toString();
        } catch (Exception e) {
            log.error(e.getMessage());
        } finally {
            try {
                // 记得关闭输出流
                stringWriter.close();
            } catch (IOException ex) {
                log.error(ex.getMessage());
            }
        }
        return null;
    }
}

4、编写调用测试单元

@SpringBootTest
class DemoTests {
	@Test
	void Test() {
	    Map<String, Object> map = new HashMap<>(8);
	    map.put("title", "Hello Java");
	    map.put("content", "This is written in Java");
	    System.out.println(FreemarkerUtils.process("demo.ftl", map));
	}
}

下面是输出结果:

<div style="max-width: 760px; width: 100%;">
    <div style="font-size: 18px; font-family: 'Courier New',serif">
        This is Title: Hello Java
    </div>
    <div style="font-size: 15px; font-family: 'Arial',serif">
        This is a content: This is written in Java
    </div>
</div>

重点:Freemarker 模板中,变量的引用方式为 ${},变量的引用不仅可以直接引用变量名对应的对象本身比如:${name},还可以引用对象中的属性变量比如:${student.name},这里的 student.name 表示引用 student 对象的 name 属性变量。


三、Freemarker 常用指令标签


<#if> 标签

<#if> 为条件判断标签,其的使用方式为:

<#if condition>
  ...
<#elseif condition2>
  ...
<#else>
  ...
</#if>

注意:

  • condition 将被计算成布尔值的表达式,可以是 Java 对象提供的变量;
  • elseifelse 是可选的。

下面是一个例子:

<div>
	<#if count == 1>
		<div>
		这是条件1
		</div>
	<#elseif count == 2>
		<div>
		这是条件2
		</div>
	<#else>
		<div>
		这是其他条件
		</div>
	</#if>
</div>

注意: 这里的 countJava 对象的变量,并且,在 Freemarker 的标签中,变量的引用直接使用变量名即可,不需要使用 ${} ,但在标签以外的地方对变量的引用必须使用 ${} 符号。

<#list> 标签

<#list> 标签为循环变量标签,其使用方式为:

<#list sequence as item>
    Part repeated for each item
</#list>

这里:

  • sequence 为想要迭代的项,可以 Java 集合对象变量;
  • item 为循环变量的名称。

下面是一个例子:

<!-- 假设 users 包含 ['Jack','Marry','Andy'] -->
<#list users as user>
	<p>${user}</p>
</#list>

输出结果为:

<p>Jack</p>
<p>Marry</p>
<p>Andy</p>

更多 Freemarker 指令可以参考官方文档:http://freemarker.foofun.cn/ref_directives.html

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值