一、Freemarker概述
Freemarker是一款纯Java编写的模板引擎软件,它允许开发人员将展示层与应用逻辑分离,通过提供一种灵活高效的方式,在运行时生成动态内容。
FreeMarker不是一个面向最终用户的工具,而是一个Java类库,可以作为开发人员开发产品的组件。模板使用FreeMarker Template Language (FTL)编写,这是一种简单且专用的语言,用于描述数据如何在模板中显示。
Freemarker模板使用类似HTML的语法,但包含可以在运行时填充数据的占位符和控制结构。这使得创建动态网页、电子邮件和其他文本文档变得非常简单。Freemarker支持条件语句、循环、宏等各种功能,并且可以与不同的数据模型和框架集成。
二、基本语法
-
注释:Freemarker的注释类似于HTML的注释,用
<#--
和-->
来分隔。任何介于这两个分隔符(包含分隔符本身)之间的内容会被FreeMarker忽略,不会执行或输出。 -
插值:
${...}
用于输出变量的值。例如,${userName}
将输出变量userName
的值,${...!default}可以设置默认值,如${userName!“myName”},在变量为空时将会输出默认值。 -
指令:Freemarker提供了多种指令,用于满足多种业务逻辑需求,如
if
、list
、assign
等。if
指令:用于条件输出控制,类似于程序语言中的if语句。list
指令:用于遍历集合中的内容。assign
指令:用于定义一个变量并给其赋值,或者替换原有变量的值。
三、准备工作
- Maven依赖
在你的Maven项目中,需要添加FreeMarker的依赖。以下是Maven依赖的示例:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
- 创建FTL模板
创建一个FTL模板文件,例如hello.ftl
,并编写一些简单的模板代码:
<html>
<head>
<title>Hello FreeMarker</title>
</head>
<body>
<h1>Hello, ${name}!</h1>
</body>
</html>
这里${name}
是一个模板变量,从后台返回的数据中动态取值
四、Java代码实现
- 创建Configuration对象
首先,你需要创建一个Configuration
对象,这是FreeMarker的主要类之一。你可以通过它来设置模板加载路径、模板编码等。
javaConfiguration cfg = new Configuration(Configuration.VERSION_2_3_31); // 使用最新版本
String templateDir = "/path/to/your/templates"; // 模板文件所在的目录
cfg.setDirectoryForTemplateLoading(new File(templateDir));
cfg.setDefaultEncoding("UTF-8"); // 设置模板文件的默认编码
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); // 设置异常处理器
- 加载模板
使用Configuration
对象的getTemplate
方法加载模板。
javaTemplate temp = cfg.getTemplate("hello.ftl"); // 加载hello.ftl模板
- 创建数据模型
创建一个数据模型,这是一个Java对象(如Map或POJO),用于存储模板中需要的数据。
javaMap<String, Object> root = new HashMap<>();
root.put("name", "World"); // 设置name变量的值
- 合并模板和数据
使用Template
对象的process
方法将模板和数据合并,生成最终的输出。
javaWriter out = new OutputStreamWriter(System.out); // 输出到控制台
temp.process(root, out); // 合并模板和数据
完整的Java代码示例:
javaimport freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import java.io.File;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
public class FreeMarkerDemo {
public static void main(String[] args) throws Exception {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
String templateDir = "/path/to/your/templates";
cfg.setDirectoryForTemplateLoading(new File(templateDir));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
Template temp = cfg.getTemplate("hello.ftl");
Map<String, Object> root = new HashMap<>();
root.put("name", "World");
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
}
}
运行上面的代码,你将在控制台看到生成的HTML页面内容。
五、工具类实现
package com.ctg.cloud.admin.utils;
import com.ctg.cloud.admin.common.exception.VisibleException;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.extern.java.Log;
import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import javax.annotation.PostConstruct;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;
/**
* @author Administratoro
* @version 1.0
* @description: freeMarker工具类,用于解析模板
* @date 2022/4/21 15:08
*/
@Slf4j
public class FreeMarkerUtil {
private static Configuration freeMarkerConfig = null;
@PostConstruct
public void init() {
if (null == freeMarkerConfig) {
freeMarkerConfig = initConfiguration();
}
}
/**
* @description: 解析freemarker格式配置文件
* @param tempStr 模板文件字符串
* @param data 数据源
* @date 2022/4/21 17:36
* @version 1.0
*/
public static String parseTemplate(String tempStr, Object data) {
try {
if(freeMarkerConfig == null){
freeMarkerConfig = initConfiguration();
}
// String tempName = "template.ftl";
// StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
// stringTemplateLoader.putTemplate(tempName,tempStr);
// freeMarkerConfig.setTemplateLoader(stringTemplateLoader);
// Template template = freeMarkerConfig.getTemplate(tempName);
String tempName = UUID.randomUUID()+".ftl";
Template template = new Template(tempName, tempStr, freeMarkerConfig);
String result = FreeMarkerTemplateUtils.processTemplateIntoString(template, data);
// template.process(data, new FileWriter(new File("D:\\test4.yaml")));
return result;
}catch (Exception e){
log.error("FreeMarkerUtil parseTemplate error!",e);
throw new VisibleException("解析模板失败!errorMsg=%s",e.getMessage());
}
}
/**
* 配置 freemarker configuration
*
* @return
*/
private static Configuration initConfiguration() {
Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
StringTemplateLoader templateLoader = new StringTemplateLoader();
configuration.setTemplateLoader(templateLoader);
configuration.setDefaultEncoding("UTF-8");
return configuration;
}
}
六、总结
以上就是FreeMarker模板引擎的基本使用教程。你可以根据自己的需求,创建更复杂的模板和数据模型,生成各种文本输出。