freemarker模板在客服域的使用场景及用法介绍

Java学习:社区快速通道

深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想

绝对不一样的职场干货:大厂最佳实践经验指南


最近更新:2023年7月15日


点赞 收藏 ⭐留言 都是我最大的动力!


文章目录

  • 基于模板文件的示例
  • 基于字符串的示例
    • Configuration.VERSION_2_3_31
  • 基于freemarker.template的小程序

freemarker.template是一个Java库,用于生成文本输出(如HTML、XML、邮件等),基于模板和数据模型。它的主要特点有:

  1. 模板语言简洁、强大、灵活,支持各种数据类型和控制结构,可以轻松地嵌入静态文本中。
  2. 数据模型可以是任何Java对象,也可以是专门为freemarker.template设计的简单哈希表或序列。
  3. 可以自定义模板加载器、缓存策略、输出格式、异常处理等,以适应不同的应用场景。
  4. 可以与各种Web框架和MVC架构集成,如Spring、Struts、Servlet等,也可以作为一个独立的组件使用。

因此不难想到,现在各个企业App的客服务域机器人的各种特色话术,就是非常适合使用此类技术的场景。如下图是拼多多客户和用户的一段聊天内容:
freemarker模板在客服域的使用场景及用法介绍_第1张图片

其中商家在6天15小时42分钟字样就可以由服务端计算并使用freemarker模板进行替换并展示给用户,这样就避免了重复配置多个不同的话术,有效地提高了效率。


基于模板文件的示例

首先,需要创建一个模板文件,命名为hello.ftl,内容如下:

<html>
<head>
    <title>${title}</title>
</head>
<body>
    <h1>${message}</h1>
    <ul>
        <#list users as user>
        <li>${user.name} (${user.age})</li>
        </#list>
    </ul>
</body>
</html>

这个模板文件中使用了freemarker.template的语法,其中${...}表示输出一个变量的值,<#list ...>表示循环遍历一个序列,并为每个元素赋值给一个局部变量。


然后,需要创建一个Java类,用于加载模板文件,并提供数据模型。假设这个类名为HelloFreemarker,内容如下:

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class HelloFreemarker {

    public static void main(String[] args) throws IOException, TemplateException {
        // 创建一个Configuration实例
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);

        // 设置模板文件所在的目录
        cfg.setClassForTemplateLoading(HelloFreemarker.class, "/templates");

        // 获取模板对象
        Template template = cfg.getTemplate("hello.ftl");

        // 创建一个数据模型
        Map<String, Object> data = new HashMap<>();
        data.put("title", "Hello Freemarker");
        data.put("message", "This is a simple example of Freemarker template engine.");

        // 创建一个用户列表
        List<Map<String, Object>> users = new ArrayList<>();
        Map<String, Object> user1 = new HashMap<>();
        user1.put("name", "Alice");
        user1.put("age", 20);
        users.add(user1);
        Map<String, Object> user2 = new HashMap<>();
        user2.put("name", "Bob");
        user2.put("age", 25);
        users.add(user2);

        // 将用户列表放入数据模型中
        data.put("users", users);

        // 创建一个输出流
        Writer out = new OutputStreamWriter(System.out);

        // 将数据模型和模板文件合并,生成输出
        template.process(data, out);

        // 关闭输出流
        out.close();
    }
}

这个Java类中使用了freemarker.template的API,其中Configuration类用于配置模板引擎的各种参数,Template类用于表示模板文件对象,process方法用于将数据模型和模板文件合并,并输出到指定的流中。

最后,运行这个Java类,可以得到以下输出:

<html>
<head>
    <title>Hello Freemarker</title>
</head>
<body>
    <h1>This is a simple example of Freemarker template engine.</h1>
    <ul>
        <li>Alice (20)</li>
        <li>Bob (25)</li>
    </ul>
</body>
</html>

可以看到,通过使用模板文件和数据模型,可以方便地生成各种文本输出,而不需要在Java代码中拼接字符串。

基于字符串的示例

freemarker.template也支持从字符串中加载模板,只需要使用Template类的另一个构造方法,传入一个字符串和一个配置对象即可。例如:

// 创建一个模板字符串
String templateString = "\n" +
        "\n" +
        "    ${title}\n" +
        "\n" +
        "\n" +
        "    

${message}

\n"
+ "
    \n" + " <#list users as user>\n" + "
  • ${user.name} (${user.age})
  • \n"
    + " \n" + "
\n"
+ "\n" + "";
// 创建一个Configuration实例
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
// 从字符串中创建一个模板对象
Template template = new Template("template", templateString, cfg);

这样就可以使用字符串作为模板,其他的步骤和之前的示例相同。


Configuration.VERSION_2_3_31

Configuration.VERSION_2_3_31是一个常量,表示freemarker.template的版本号,用于指定Configuration对象的兼容性模式。可以是别的取值,但是要与你使用的freemarker.template的实际版本相匹配,否则可能会出现错误或警告。一般来说,建议使用最新的版本号,例如Configuration.VERSION_2_3_32


查看使用的freemarker.template的版本的方法:

  1. 通过Maven或Gradle等工具管理依赖:可以查看pom.xml或build.gradle文件中freemarker的版本号。
  2. 直接下载freemarker的jar包:可以查看jar包的文件名中的版本号,或者解压jar包后查看META-INF/MANIFEST.MF文件中的Bundle-Version属性。
  3. 在代码中使用freemarker:调用Configuration.getVersion()方法,返回一个Version对象,然后调用getMajor()getMinor()getMicro()等方法获取版本号。

基于freemarker.template的小程序

这个小程序的功能是根据用户输入的性别、爱好、职业等,然后根据这些信息生成更个性化的问候语,并显示在控制台上,此外还可以根据用户输入的语言,生成不同语言的问候语。使用freemarker.template的步骤如下:

  1. 导入freemarker.template的jar包,或者使用Maven或Gradle等工具添加依赖。
  2. 创建一个Configuration对象,设置模板文件所在的目录和编码方式。
  3. 创建一个模板文件,命名为greeting.ftl,内容如下:
<#-- greeting_en.ftl -->
<#-- Use cap_first and upper_case built-ins to format the name -->
Hello ${name?cap_first} ${name?upper_case}!

<#-- Use if-else directive to generate different messages based on gender -->
<#if gender == "male">
You are a ${age} years old man.
<#elseif gender == "female">
You are a ${age} years old woman.
<#else>
You are a ${age} years old person.
</#if>

<#-- Use switch directive to generate different messages based on occupation -->
<#switch occupation>
    <#case "student">
    You are studying hard for your future.
    <#break>
    <#case "teacher">
    You are teaching the next generation.
    <#break>
    <#case "doctor">
    You are saving lives every day.
    <#break>
    <#case "engineer">
    You are building amazing things.
    <#break>
    <#default>
    You are doing a great job.
</#switch>

<#-- Use hobby as a variable -->
Your hobby is ${hobby}.


代码实现逻辑:

  1. 创建一个数据模型,用一个Map对象存储用户输入的姓名和年龄。
  2. 获取模板对象,调用process方法,将数据模型和模板文件合并,并输出到一个输出流中。
  3. 关闭输出流。
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Scanner;

public class GreetingApp {

    public static void main(String[] args) throws IOException, TemplateException {
        // 创建一个Scanner对象,用于接收用户输入
        Scanner scanner = new Scanner(System.in);

        // 提示用户输入姓名、年龄、性别、爱好、职业和语言
        System.out.println("Please enter your name:");
        String name = scanner.nextLine();
        System.out.println("Please enter your age:");
        int age = scanner.nextInt();
        scanner.nextLine(); // consume the newline character
        System.out.println("Please enter your gender (male/female/other):");
        String gender = scanner.nextLine();
        System.out.println("Please enter your hobby:");
        String hobby = scanner.nextLine();
        System.out.println("Please enter your occupation:");
        String occupation = scanner.nextLine();
        System.out.println("Please enter your language (en/cn/fr/de):");
        String language = scanner.nextLine();

        // 创建一个Configuration对象,设置模板文件所在的目录和编码方式
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
        cfg.setClassForTemplateLoading(GreetingApp.class, "/templates");
        cfg.setDefaultEncoding("UTF-8");

        // 获取模板对象,根据用户输入的语言选择不同的模板文件
        Template template = null;
        switch (language) {
            case "en":
                template = cfg.getTemplate("greeting_en.ftl");
                break;
            case "cn":
                template = cfg.getTemplate("greeting_cn.ftl");
                break;
            case "fr":
                template = cfg.getTemplate("greeting_fr.ftl");
                break;
            case "de":
                template = cfg.getTemplate("greeting_de.ftl");
                break;
            default:
                System.out.println("Invalid language. Use English as default.");
                template = cfg.getTemplate("greeting_en.ftl");
                break;
        }

        // 创建一个数据模型,用一个Map对象存储用户输入的姓名、年龄、性别、爱好、职业和语言
        Map<String, Object> data = new HashMap<>();
        data.put("name", name);
        data.put("age", age);
        data.put("gender", gender);
        data.put("hobby", hobby);
        data.put("occupation", occupation);
        data.put("language", language);

        // 创建一个输出流
        Writer out = new OutputStreamWriter(System.out);

        // 将数据模型和模板文件合并,生成输出
        template.process(data, out);

        // 关闭输出流
        out.close();

        // 关闭Scanner对象
        scanner.close();
    }
}

运行这个小程序,可以得到以下的输出:

Please enter your name:
Tom
Please enter your age:
18
Please enter your gender (male/female/other):
male
Please enter your hobby:
reading
Please enter your occupation:
student
Please enter your language (en/cn/fr/de):
en
Hello Tom TOM!

You are a 18 years old man.

You are studying hard for your future.

Your hobby is reading.

你可能感兴趣的:(java)