searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

FreeMarker模板引擎使用教程

2024-06-25 09:46:52
18
0

一、Freemarker概述

Freemarker是一款纯Java编写的模板引擎软件,它允许开发人员将展示层与应用逻辑分离,通过提供一种灵活高效的方式,在运行时生成动态内容。

FreeMarker不是一个面向最终用户的工具,而是一个Java类库,可以作为开发人员开发产品的组件。模板使用FreeMarker Template Language (FTL)编写,这是一种简单且专用的语言,用于描述数据如何在模板中显示。

Freemarker模板使用类似HTML的语法,但包含可以在运行时填充数据的占位符和控制结构。这使得创建动态网页、电子邮件和其他文本文档变得非常简单。Freemarker支持条件语句、循环、宏等各种功能,并且可以与不同的数据模型和框架集成。

二、基本语法

  1. 注释:Freemarker的注释类似于HTML的注释,用<#---->来分隔。任何介于这两个分隔符(包含分隔符本身)之间的内容会被FreeMarker忽略,不会执行或输出。

  2. 插值${...}用于输出变量的值。例如,${userName}将输出变量userName的值,${...!default}可以设置默认值,如${userName!“myName”},在变量为空时将会输出默认值。

  3. 指令:Freemarker提供了多种指令,用于满足多种业务逻辑需求,如iflistassign等。

    • if指令:用于条件输出控制,类似于程序语言中的if语句。
    • list指令:用于遍历集合中的内容。
    • assign指令:用于定义一个变量并给其赋值,或者替换原有变量的值。

三、准备工作

  1. Maven依赖

在你的Maven项目中,需要添加FreeMarker的依赖。以下是Maven依赖的示例:

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>
 
  1. 创建FTL模板

创建一个FTL模板文件,例如hello.ftl,并编写一些简单的模板代码:

<html>
<head>
    <title>Hello FreeMarker</title>
</head>
<body>
    <h1>Hello, ${name}!</h1>
</body>
</html>

这里${name}是一个模板变量,从后台返回的数据中动态取值

 

四、Java代码实现

  1. 创建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); // 设置异常处理器
  1. 加载模板

使用Configuration对象的getTemplate方法加载模板。

javaTemplate temp = cfg.getTemplate("hello.ftl"); // 加载hello.ftl模板
  1. 创建数据模型

创建一个数据模型,这是一个Java对象(如Map或POJO),用于存储模板中需要的数据。

javaMap<String, Object> root = new HashMap<>();
root.put("name", "World"); // 设置name变量的值
  1. 合并模板和数据

使用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模板引擎的基本使用教程。你可以根据自己的需求,创建更复杂的模板和数据模型,生成各种文本输出。

 

 

 

 

0条评论
作者已关闭评论
吴****彬
2文章数
0粉丝数
吴****彬
2 文章 | 0 粉丝
吴****彬
2文章数
0粉丝数
吴****彬
2 文章 | 0 粉丝
原创

FreeMarker模板引擎使用教程

2024-06-25 09:46:52
18
0

一、Freemarker概述

Freemarker是一款纯Java编写的模板引擎软件,它允许开发人员将展示层与应用逻辑分离,通过提供一种灵活高效的方式,在运行时生成动态内容。

FreeMarker不是一个面向最终用户的工具,而是一个Java类库,可以作为开发人员开发产品的组件。模板使用FreeMarker Template Language (FTL)编写,这是一种简单且专用的语言,用于描述数据如何在模板中显示。

Freemarker模板使用类似HTML的语法,但包含可以在运行时填充数据的占位符和控制结构。这使得创建动态网页、电子邮件和其他文本文档变得非常简单。Freemarker支持条件语句、循环、宏等各种功能,并且可以与不同的数据模型和框架集成。

二、基本语法

  1. 注释:Freemarker的注释类似于HTML的注释,用<#---->来分隔。任何介于这两个分隔符(包含分隔符本身)之间的内容会被FreeMarker忽略,不会执行或输出。

  2. 插值${...}用于输出变量的值。例如,${userName}将输出变量userName的值,${...!default}可以设置默认值,如${userName!“myName”},在变量为空时将会输出默认值。

  3. 指令:Freemarker提供了多种指令,用于满足多种业务逻辑需求,如iflistassign等。

    • if指令:用于条件输出控制,类似于程序语言中的if语句。
    • list指令:用于遍历集合中的内容。
    • assign指令:用于定义一个变量并给其赋值,或者替换原有变量的值。

三、准备工作

  1. Maven依赖

在你的Maven项目中,需要添加FreeMarker的依赖。以下是Maven依赖的示例:

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>
 
  1. 创建FTL模板

创建一个FTL模板文件,例如hello.ftl,并编写一些简单的模板代码:

<html>
<head>
    <title>Hello FreeMarker</title>
</head>
<body>
    <h1>Hello, ${name}!</h1>
</body>
</html>

这里${name}是一个模板变量,从后台返回的数据中动态取值

 

四、Java代码实现

  1. 创建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); // 设置异常处理器
  1. 加载模板

使用Configuration对象的getTemplate方法加载模板。

javaTemplate temp = cfg.getTemplate("hello.ftl"); // 加载hello.ftl模板
  1. 创建数据模型

创建一个数据模型,这是一个Java对象(如Map或POJO),用于存储模板中需要的数据。

javaMap<String, Object> root = new HashMap<>();
root.put("name", "World"); // 设置name变量的值
  1. 合并模板和数据

使用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模板引擎的基本使用教程。你可以根据自己的需求,创建更复杂的模板和数据模型,生成各种文本输出。

 

 

 

 

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0